Django ChoiceField“验证选择列表中是否存在给定值。”
我想要一个ChoiceField(所以我可以在视图中输入选项)但我不希望Django检查选择是否在选项列表中。解释原因很复杂但这就是我的需要。这将如何实现?
答案 0 :(得分:21)
您可以创建自定义ChoiceField
并覆盖以跳过验证:
class ChoiceFieldNoValidation(ChoiceField):
def validate(self, value):
pass
我想知道你的用例,因为我真的想不出你为什么需要这个。
编辑:测试,制作表格:
class TestForm(forms.Form):
choice = ChoiceFieldNoValidation(choices=[('one', 'One'), ('two', 'Two')])
提供“无效”数据,并查看表单是否仍然有效:
form = TestForm({'choice': 'not-a-valid-choice'})
form.is_valid() # True
答案 1 :(得分:15)
从外观上看,最好的方法是创建forms.Charfield
并使用forms.Select
小部件。这是一个例子:
from django import forms
class PurchaserChoiceForm(forms.ModelForm):
floor = forms.CharField(required=False, widget=forms.Select(choices=[]))
class Meta:
model = PurchaserChoice
fields = ['model', ]
出于某种原因,单独覆盖验证器并没有为我做到这一点。
答案 2 :(得分:1)
作为另一种选择,您可以编写自己的validator
from django.core.exceptions import ValidationError
def validate_all_choices(value):
# here have your custom logic
pass
然后以您的形式
class MyForm(forms.Form):
my_field = forms.ChoiceField(validators=[validate_all_choices])
编辑:另一个选项可能是将字段定义为CharField
,但随后在模板中手动将其作为选择进行选择。这样,它可以接受所有内容而无需自定义验证器