Django使用ModelChoiceField中的values_list进行表单验证

时间:2012-04-19 23:40:39

标签: django forms

我有一个这样的表格:

class SearchForm(forms.Form):
    genus = forms.RegexField(
        regex=r'^[a-zA-Z]+$',
        required=False,
    )  
    species = forms.RegexField(
        regex=r'^[a-zA-Z]+$',
        required=False,
    )
    island_group = forms.ModelChoiceField(
        required=False,
        queryset=Locality.objects.values_list('islandgroup', flat=True).distinct('islandgroup'), 

现在,我的表单在island_group字段上验证失败,因为我没有返回模型对象。我需要返回values_list来获取不同的条目。这种形式还有一点,这就是为什么我不想使用模型表格。

我的问题是:获取表单验证的最佳方式是什么?

任何帮助都非常感激。

2 个答案:

答案 0 :(得分:0)

为什么不覆盖save方法:在实际保存之前调用一些验证函数?

答案 1 :(得分:0)

我遇到了同样的问题,我现在的解决方案是使用ChoiceField而不是ModelChoiceField。我认为这是有道理的,因为我们不希望用户选择模型实例,但是一个表列中的不同属性值和相同的属性可能很好地对应于多个模型实例。

class SearchForm(forms.Form):
    # get the distinct attributes from one column
    entries = Locality.objects.values_list('islandgroup', flat=True).distinct('islandgroup')
    # change the entries to a valid format for choice field
    locality_choices = [(e, e) for e in entries]
    # the actual choice field
    island_group = forms.ChoiceField(
        required=False,
        choices=locality_choices)

这样Django的内置验证就可以完全按照我们想要的方式执行,即检查是否选择了一列中所有可能属性的成员。