【发布时间】:2013-11-15 05:42:11
【问题描述】:
Django ChoiceField "验证给定值是否存在于选项列表中。"
我想要一个 ChoiceField(这样我可以在视图中输入选项),但我不希望 Django 检查选项是否在选项列表中。解释为什么很复杂,但这就是我需要的。这将如何实现?
【问题讨论】:
-
一种方法是覆盖表单验证:stackoverflow.com/questions/4340287/…
标签: django
Django ChoiceField "验证给定值是否存在于选项列表中。"
我想要一个 ChoiceField(这样我可以在视图中输入选项),但我不希望 Django 检查选项是否在选项列表中。解释为什么很复杂,但这就是我需要的。这将如何实现?
【问题讨论】:
标签: django
您可以创建自定义 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
【讨论】:
从外观上看,最好的方法是创建一个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', ]
由于某种原因,仅覆盖验证器对我来说并没有解决问题。
【讨论】:
作为另一种选择,您可以编写自己的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,然后在模板中手动将其呈现为您选择的选项。这样,它可以接受所有内容,而无需自定义验证器
【讨论】: