我有一个这样的表格:
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
来获取不同的条目。这种形式还有一点,这就是为什么我不想使用模型表格。
我的问题是:获取表单验证的最佳方式是什么?
任何帮助都非常感激。
答案 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的内置验证就可以完全按照我们想要的方式执行,即检查是否选择了一列中所有可能属性的成员。