【问题标题】:Django forms.ChoiceField without validation of selected value没有验证所选值的 Django forms.ChoiceField
【发布时间】:2013-11-15 05:42:11
【问题描述】:

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

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

【问题讨论】:

标签: django


【解决方案1】:

您可以创建自定义 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 小部件。问题是我忘了手动重新填充帖子上的字段,doh。
  • 你得到了我的支持:D 验证器解决方案对我来说是不行的。无论如何,它仍然进行了默认验证。
  • 刚刚在 1.8.7 中测试过,效果很好。请参阅我在答案中的编辑,了解我是如何测试它的。
  • 在 django 1.10 中测试,工作正常。如果您查看源代码,那么它没有理由不工作github.com/django/django/blob/master/django/forms/fields.py。但是,当我进行测试时,我必须重新启动服务器才能应用表单更改。我觉得这种情况经常发生
  • @jproffitt .. 一个可能的用例是:在我的表单中,我要求用户选择音频输入源。可以使用 navigator.mediaDevices.enumerateDevices() 通过 javascript 收集设备的音频源列表,因此我在表单中准备了一个空选择,并在运行时填充它。然后在提交后像往常一样收集选择
【解决方案2】:

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

由于某种原因,仅覆盖验证器对我来说并没有解决问题。

【讨论】:

  • 我还要补充一点,您应该重写 clean() 方法,以根据您的需要自行验证它。这样做,您可以在需要时根据需要进行选择,并且仍然可以进行验证。
  • 编辑时地板为空白。这不是一个合理的选择。
【解决方案3】:

作为另一种选择,您可以编写自己的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,然后在模板中手动将其呈现为您选择的选项。这样,它可以接受所有内容,而无需自定义验证器

【讨论】:

  • 这在 django 1.6.5 中对我不起作用。它似乎仍在执行默认验证。
猜你喜欢
  • 2010-10-14
  • 1970-01-01
  • 2013-02-02
  • 1970-01-01
  • 1970-01-01
  • 2020-04-16
  • 1970-01-01
  • 2011-09-27
  • 2020-08-22
相关资源
最近更新 更多