使用Django modelForm使用额外参数验证POST数据

时间:2014-04-04 13:34:48

标签: python django

我有这个型号:

class SearchPreference(models.Model):
    """Saves the preferred location and school_type of the User
    """
    user = models.OneToOneField(User, related_name='search_preference')
    location = models.ForeignKey(Location, null=True)
    school_type = models.ForeignKey(SchoolType, null=True)

    class Meta:
        app_label = 'grants'

以及此表格:

class SearchPreferenceForm(forms.ModelForm):
    location = forms.ChoiceField(queryset=Location.objects.all(),
                                 to_field_name='slug',
                                 required=False)
    school_type = forms.ChoiceField(queryset=SchoolType.objects.all(),
                                    to_field_name='slug',
                                    required=False)

    class Meta:
        model = SearchPreference
        fields = ('location', 'school_type')

我正在尝试使用该表单来验证POST数据,我没有在模板中显示它。

问题是,POST数据可以包含Location或SchoolType表中的值,因此表单不会验证。价值是“全部”,表示所有地点'或者'所有学校类型',我真的希望将其保存为没有位置的SearchPreference,即location = null。

我可以改变所有'到一个空值,这可能有效,但验证/逻辑已移出表单。

我以为我可以使用empty_value =' all'但这不适用于modelChoiceField。

有没有办法做到这一点?

2 个答案:

答案 0 :(得分:1)

您的模型也需要blank=Truenull=True

location = models.ForeignKey(Location, blank=True, null=True)
school_type = models.ForeignKey(SchoolType, blank=True, null=True)

This发表关于空白和空白的讨论。

答案 1 :(得分:0)

这最终有效:

class SearchPreferenceForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(SearchPreferenceForm, self).__init__(*args, **kwargs)
        self.fields['location'].empty_values.append('all')
        self.fields['school_type'].empty_values.append('all')