首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django提交任择表格

Django提交任择表格
EN

Stack Overflow用户
提问于 2012-02-12 16:43:54
回答 4查看 537关注 0票数 0

我需要为一个活动创建登记表。每个登记的人都可以带客人来。我想把所有的东西都登记在一页里。为此,我使用了一个带有1 RegistrationForm和XGuestForm的视图。在我的模型中,我有一个RegistrationGuest类,用来用ModelForm创建这两个表单。

问题是不需要填充GuestForm (您不需要带客人)。

代码语言:javascript
复制
def register_form(request):
  error = False
  if request.method == 'POST':
    register = RegistrationForm(request.POST, instance=Registration() )
    guests = [GuestForm(request.POST, prefix=str(x), instance=Guest()) for x in range(MAXGUESTS)]
    if register.is_valid():
        print("register is valid")

        for guest in guests:
            if guest.is_valid():
                print("guest is valid")
            else:
                print("guest is not valid") # always when empty form
                error = True
    else:
        print("register is not valid")
        error = True

    if not error:
       ... # save the form in the database

  register = RegistrationForm(instance=Registration())
  guests = [GuestForm(prefix=str(x), instance=Guest()) for x in range(MAXGUESTS)]
  return render_to_response('register.html',{
        'form': register,
        'max_guests': MAXGUESTS,
        'guests': guests,
        'error': error,
        })

因此,我需要将表单设置为可选的,并且能够区分整个表单何时为空,何时出现错误。知道怎么做吗?

谢谢

溶液

代码语言:javascript
复制
def register_form(request):
  GuestFormSet = modelformset_factory(Guest, exclude=('register',))
  error = False
  if request.method == 'POST':
    register = RegistrationForm(request.POST, instance=Registration() )
    guests = GuestFormSet(request.POST)
    if register.is_valid():
        print("register is valid")

        for guest in guests:
            if guest.is_valid():
                print("guest is valid") # even if some forms are empty
            else:
                print("guest is not valid")
                error = True
    else:
        print("register is not valid")
        error = True

    if not error:
       ... 
       # save the form in the database
       return something

  else:
      register = RegistrationForm(instance=Registration())
      guests = GuestFormSet(queryset=Guest.objects.none())
  return render_to_response('register.html',{
        'form': register,
        'max_guests': MAXGUESTS,
        'guests': guests,
        'error': error,
        })
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-02-12 16:53:44

您可以为您的来宾表单使用模型窗体集。它可以区分空形式和无效形式。

https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#model-formsets

票数 2
EN

Stack Overflow用户

发布于 2012-02-12 16:56:00

我想您需要一些方法来确定提交的来宾表单是否已被实际填写。当提交空表单时,忽略它:

代码语言:javascript
复制
forms_to_save =[]

for form in guest_forms:
    if guest_form.is_valid()
        forms_to_save.append( form )
    else:
        if form.contains_data(): # you'll have to implement this
            error = True

if not error:
    for form in forms_to_save():
        form.save()
票数 0
EN

Stack Overflow用户

发布于 2012-03-25 16:34:43

我有一个类似的问题,在一个婚礼RSVP应用程序,我正在构建。在我的例子中,每个来宾都有一个“主顾”复选框,如果没有选中它(即来宾不在),那么我不希望向用户报告任何错误。

我的客人模型(为了简洁而减肥):

代码语言:javascript
复制
class Guest(models.Model):
    email = models.EmailField(max_length=50, unique=True)
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    attending = models.BooleanField(default=False)

我有一个名为ModelForm的RsvpForm类,它基于Guest模型创建一个表单。看起来是这样的:

代码语言:javascript
复制
class RsvpForm(ModelForm):
    class Meta:
        model = Guest
        fields = ('attending', 'email', 'first_name', 'last_name')

    def clean(self):
        cleaned_data = self.cleaned_data
        attending = cleaned_data.get('attending')

        if not attending:
            #clear the error collection
            self._errors['email'] = {}

        return cleaned_data

这个问题的解决方案在于在我的RsvpForm类中重写的clean()方法。在里面,我检查客人是否出席。如果不是,则清除其他每个字段的错误消息。

最初,我为整个表单清除了以下错误:

代码语言:javascript
复制
if not attending:
    #clear the error collection
    self._errors['email'] = ''
    self._errors['first_name'] = ''
    self._errors['last_name'] = ''

但是,由于某种原因,修改任何这些键的值会导致表单验证失败,这反过来又会阻止Guest数据被保存,如果它们表明它们没有参加。一个大多数人都找不到的小虫子,但还是很烦人。

在这一行的某个时候,我还试图通过在.clear字典上调用self._errors ()来清除错误集合:

代码语言:javascript
复制
if not attending:
    #clear the error collection
    self._errors.clear()

但出于某种原因,这些错误仍然被显示出来,尽管我可以证实字典是空的。

最终的结果是,表单验证错误只有在选中了“shown”复选框时才会显示给我的用户,这是非常理想的,因为客人可能希望在决定他们将带谁作为加一之前更新他们自己的联系人信息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9250547

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档