我创建了一个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})
下面是我试过的步骤:
- 如果我再移动了“required = False”,它将使得formset中的每个表单都是必需的。如果用户只填写第一组并留下第二组空白,则会标记KeyError。
- 如果用户提交了一个空白表单,将这个表单设置为上面的可选项也会引发KeyError。
您的方法消除了错误;但是,我的成功页面现在只显示了2个字段的位置。名字和姓氏丢失。其次,我的webform方法返回名字和姓氏的打印结果。在这种情况下,我看不到它在终端上打印。通过form ['first_name']与您的方法form.get('first_name')访问字典有什么区别?感谢您的帮助! – dreamzboy 2014-12-15 20:11:28
我删除了初始数据,并提出了更改建议,表单经历了。但是,现在用户可以提交一个空白表单,这使我们回到了同样的问题。 – dreamzboy 2014-12-16 02:39:05
'dict [key]'如果'dict'中没有这样的键,就会抛出'KeyError'异常情况。 'dict.get(key)'在这种情况下只返回'None',没有任何异常。 – catavaran 2014-12-16 03:19:16