2014-12-13 76 views
0

我创建了一个formset来复制两个输入字段,名字和姓氏。我希望将第一组“第一名”和“姓”字段设置为必填字段,而将第二个和第三个字段设置为可选。换句话说,三个输入框中至少有一个必须填写。有没有办法做到这一点?我是否必须制作2个单独的表单/表单来适应此?Django Formset中必需的和可选的字段

我的问题的原因是我想拥有3套名字和姓氏字段。如果用户只填写3组之一,并点击提交,Django会抛出一个密钥错误因为其他2台都没有填写。

forms.py

from django import forms 


class NameForm (forms.Form): 

    first_name = forms.CharField (max_length = 20, required = False) 
    last_name = forms.CharField (max_length = 20, required = False) 

意见。 PY

from django.shortcuts import render 
from django.forms.formsets import formset_factory 
from nameform.forms import NameForm 
from nameform.addName import webform 


# Create your views here. 
def addname (request): 
    NameFormSet = formset_factory (NameForm, extra = 2, max_num = 5) # Set maximum to avoid default of 1000 forms. 
    if request.method == 'POST': 
     # Django will become valid even if an empty form is submitted. Adding initial data causes unbound form and 
     # trigger formset.errors 
     formset = NameFormSet (request.POST, initial = [{'first_name': 'John', 'last_name': 'Doe'}]) 

     if formset.is_valid(): 
      location = request.POST ['site'] 
      data = formset.cleaned_data 

      for form in data: 
       firstname = form ['first_name'] 
       lastname = form ['last_name'] 

       webform (firstname, lastname, location) 

      context = {'data': data, 'location': location} 

      return render (request, 'nameform/success.html', context) 

    else: 
     formset = NameFormSet() 

    return render (request, 'nameform/addname.html', {'formset': formset}) 

下面是我试过的步骤:

  1. 如果我再移动了“required = False”,它将使得formset中的每个表单都是必需的。如果用户只填写第一组并留下第二组空白,则会标记KeyError。
  2. 如果用户提交了一个空白表单,将这个表单设置为上面的可选项也会引发KeyError。

Add Name Form

KeyError - firstname = form ['first_name'

回答

0
在这种情况下

Django的表单集的作品以一种特殊的方式 - 没有数据形式具有空cleaned_data而是视为有效。所以,你必须手动检查表单数据的存在:

# at imports section of views.py 
from django.forms.util import ErrorList 

# at addname() 
actual_data = [] 
for form in data: 
    firstname = form.get('first_name') 
    lastname = form.get('last_name') 
    if firstname and lastname: 
     webform (firstname, lastname, location) 
     actual_data.append(form) 
if actual_data: 
    context = {'data': actual_data, 'location': location} 
    return render(request, 'nameform/success.html', context) 
formset._non_form_errors = ErrorList(['Enter at least one person name.']) 
+0

您的方法消除了错误;但是,我的成功页面现在只显示了2个字段的位置。名字和姓氏丢失。其次,我的webform方法返回名字和姓氏的打印结果。在这种情况下,我看不到它在终端上打印。通过form ['first_name']与您的方法form.get('first_name')访问字典有什么区别?感谢您的帮助! – dreamzboy 2014-12-15 20:11:28

+0

我删除了初始数据,并提出了更改建议,表单经历了。但是,现在用户可以提交一个空白表单,这使我们回到了同样的问题。 – dreamzboy 2014-12-16 02:39:05

+0

'dict [key]'如果'dict'中没有这样的键,就会抛出'KeyError'异常情况。 'dict.get(key)'在这种情况下只返回'None',没有任何异常。 – catavaran 2014-12-16 03:19:16

相关问题