16

Django ChoiceField “验证给定值是否存在于选项列表中。”

我想要一个 ChoiceField(所以我可以在视图中输入选项),但我不希望 Django 检查选项是否在选项列表中。解释为什么很复杂,但这就是我需要的。这将如何实现?

4

3 回答 3

24

您可以创建自定义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
于 2013-11-04T16:17:20.463 回答
22

从外观上看,最好的方法是创建一个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', ]

出于某种原因,仅覆盖验证器并没有为我解决问题。

于 2014-08-28T19:04:13.793 回答
1

作为另一种选择,您可以编写自己的验证器

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])

编辑:另一个选项可以将字段定义为 aCharField但然后在模板中手动将其呈现为您选择的选择。这样,它可以接受所有内容,而无需自定义验证器

于 2013-11-04T16:37:48.073 回答