2

我正在使用 Django 1.4 表单集,我想对表单集中的第一个表单执行不同的验证。

我有一个 LocationForm ,其中显示 4 个文本字段,允许用户输入最多 4 个位置:

class LocationForm(forms.Form):
    user_entered_address = forms.CharField(required=False, max_length=255)
    full_address = forms.CharField(max_length=255, required=False, widget=forms.HiddenInput())
    city = forms.CharField(max_length=255, required=False, widget=forms.HiddenInput())
    state = forms.CharField(max_length=255, required=False, widget=forms.HiddenInput())
    country = forms.CharField(max_length=255, required=False, widget=forms.HiddenInput())
    latitude = forms.CharField(required=False, widget=forms.HiddenInput())
    longitude = forms.CharField(required=False, widget=forms.HiddenInput())

LocationFormSet = formset_factory(LocationForm, extra=4, max_num=4)

这非常适合显示输入字段,但我希望表单集中的第一个 LocationForm 是必需的,其余表单是可选的(这意味着用户必须在第一个表单中输入至少一个位置,但其余的是选修的)。

如果我修改表单,删除required=False

    user_entered_address = forms.CharField(max_length=255)

然后user_entered_address是所有表格所必需的。我觉得我需要编写一个自定义 clean() 方法,但我不知道如何找到第一个表单,确定是否user_entered_address为空白,如果是,则引发 ValidationError:

class BaseLocationFormSet(BaseFormSet):
    def clean(self):
        # How to do I find the first form and ensure user_entered_address isn't blank?

LocationFormSet = formset_factory(LocationForm, extra=4, max_num=4, formset=BaseLocationFormSet)

或者这是错误的方法,有更好的方法吗?谢谢!

4

1 回答 1

1

您可以访问以下表格:

form = self.forms[0]

因此,在您的清洁中,只需检查第一个表格并忽略其他表格。

form = self.forms[0]
title = form.cleaned_data['title']
if title is None:
    raise forms.ValidationError("Missing title")
于 2012-11-06T19:57:32.667 回答