Django Formsets:如何对formset中的每个表单应用不同的验证?

时间:2012-11-06 19:46:30

标签: django formsets

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

我有一个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)

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

如果我修改表单,请删除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)

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

1 个答案:

答案 0 :(得分:1)

您可以访问以下表单:

form = self.forms[0]

所以在你干净时只需检查第一个表格并忽略其他表格。

form = self.forms[0]
title = form.cleaned_data['title']
if title is None:
    raise forms.ValidationError("Missing title")