Django forms.ChoiceField没有验证选定的值

时间:2013-11-04 15:00:48

标签: django

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

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

3 个答案:

答案 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,但随后在模板中手动将其作为选择进行选择。这样,它可以接受所有内容而无需自定义验证器