【问题标题】:Django form don't validate : "Select a valid choice. 20 is not one of the available choices"Django 表单不验证:“选择一个有效的选择。20 不是可用的选择之一”
【发布时间】:2011-11-02 15:28:27
【问题描述】:

我有一个由 2 个 ChoiceField 和一个 CharField 组成的表单。 The second ChoiceField is populated via ajax when an item of the first one is selected.

填充它的模板如下:

{% for a in assets %}
<option value="{{ a.asset_id }}">{{ a.asset_name }}_{{ a.asset_description }}</option>
{% endfor %}

当我尝试提交表单时,出现以下错误:

Select a valid choice. 20 is not one of the available choices.

指向第二个ChoiceField,20对应选中项的{{a.asset_id}}。

我在其他论坛上看到了这个错误,但它几乎总是由于 multipleChoiceField 这不是我关心的。

我做错了什么?

【问题讨论】:

  • 表单中ChoiceField的choices的值是多少?
  • 在表单中,选择的值首先包含[('', '-- choisir un type en premier')],然后根据在第一个 CHoiceField 中选择的项目添加一些选项标签
  • 如何使用 Javascript 添加选项标签?这很糟糕,因为 Django 将拒绝任何不在choices 中的选定内容。相反,您应该在视图中动态更改choices 的值。
  • 我使用 javascript 添加它们,因为我希望在第一个 ChoiceField 上选择一个项目时更新这些项目。如果没有 javascript,我不知道该怎么做。
  • 经过讨论后我实现了这一点:link

标签: django jquery django-forms choicefield


【解决方案1】:

ChoiceField 需要设置choices。这些不仅决定了下拉菜单中显示的内容,而且对您来说重要的是,它还决定了提交表单时应该接受哪些值。

让我解释一下你的情况。您的选择最初设置为:

CHOICES = (
    ('', '-- choisir un type en premier')
)

这意味着唯一会被接受的是一个空白选项(元组中的第一个条目'' 是字段的实际值,choisir... 是文本值)。

因此,当您通过 Javascript 添加 &lt;option&gt; 元素时,它们的值将不在 CHOICES 中,因此当您提交该表单时它们会被 Django 拒绝。 10 不在CHOICES 中。

您的表单提交到的视图应该查看提交给它的选项的值,然后相应地更改传递给 ChoiceField 的CHOICES 的值。

【讨论】:

  • 选择元组不是那种形式,我动态添加了 标签。我尝试添加和删除 &lt;option value="{{ a.asset_id }}"&gt; 周围的引号,但没有任何效果。
  • 如何访问视图中 ChoiceField 的选项?
  • 在处理表单的视图中添加选项描述here
猜你喜欢
  • 2016-05-18
  • 2012-01-22
  • 2018-08-13
  • 2018-06-11
  • 2021-04-12
  • 2018-04-30
  • 2017-12-30
  • 2012-05-13
  • 2014-06-24
相关资源
最近更新 更多