我需要为一个活动创建登记表。每个登记的人都可以带客人来。我想把所有的东西都登记在一页里。为此,我使用了一个带有1 RegistrationForm和XGuestForm的视图。在我的模型中,我有一个Registration和Guest类,用来用ModelForm创建这两个表单。
问题是不需要填充GuestForm (您不需要带客人)。
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,
})因此,我需要将表单设置为可选的,并且能够区分整个表单何时为空,何时出现错误。知道怎么做吗?
谢谢
溶液
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,
})发布于 2012-02-12 16:53:44
您可以为您的来宾表单使用模型窗体集。它可以区分空形式和无效形式。
https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#model-formsets
发布于 2012-02-12 16:56:00
我想您需要一些方法来确定提交的来宾表单是否已被实际填写。当提交空表单时,忽略它:
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()发布于 2012-03-25 16:34:43
我有一个类似的问题,在一个婚礼RSVP应用程序,我正在构建。在我的例子中,每个来宾都有一个“主顾”复选框,如果没有选中它(即来宾不在),那么我不希望向用户报告任何错误。
我的客人模型(为了简洁而减肥):
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模型创建一个表单。看起来是这样的:
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()方法。在里面,我检查客人是否出席。如果不是,则清除其他每个字段的错误消息。
最初,我为整个表单清除了以下错误:
if not attending:
#clear the error collection
self._errors['email'] = ''
self._errors['first_name'] = ''
self._errors['last_name'] = ''但是,由于某种原因,修改任何这些键的值会导致表单验证失败,这反过来又会阻止Guest数据被保存,如果它们表明它们没有参加。一个大多数人都找不到的小虫子,但还是很烦人。
在这一行的某个时候,我还试图通过在.clear字典上调用self._errors ()来清除错误集合:
if not attending:
#clear the error collection
self._errors.clear()但出于某种原因,这些错误仍然被显示出来,尽管我可以证实字典是空的。
最终的结果是,表单验证错误只有在选中了“shown”复选框时才会显示给我的用户,这是非常理想的,因为客人可能希望在决定他们将带谁作为加一之前更新他们自己的联系人信息。
https://stackoverflow.com/questions/9250547
复制相似问题