【问题标题】:django forms give: Select a valid choice. That choice is not one of the available choicesdjango 表单给出:选择一个有效的选项。该选择不是可用的选择之一
【发布时间】:2012-01-22 02:15:54
【问题描述】:

在用户完成选择并发布数据后,我无法从unit_id 中获取值。谁能帮我解决这个问题。

unit_id 下拉列表的值是从另一个数据库表 (LiveDataFeed) 中获取的。一旦选择了一个值并发布了表单,它就会给出错误:

选择一个有效的选项。该选项不是可用选项之一。

这里是实现:

在 models.py 中:

class CommandData(models.Model):
    unit_id = models.CharField(max_length=50)
    command = models.CharField(max_length=50)
    communication_via = models.CharField(max_length=50)
    datetime = models.DateTimeField()
    status = models.CharField(max_length=50, choices=COMMAND_STATUS)  

在views.py中:

class CommandSubmitForm(ModelForm):
    iquery = LiveDataFeed.objects.values_list('unit_id', flat=True).distinct()
    unit_id = forms.ModelChoiceField(queryset=iquery, empty_label='None',
        required=False, widget=forms.Select())

class Meta:
    model = CommandData
    fields = ('unit_id', 'command', 'communication_via')

def CommandSubmit(request):
    if request.method == 'POST':
        form = CommandSubmitForm(request.POST)
        if form.is_valid():
            form.save()
            return HttpResponsRedirect('/')
    else:
        form = CommandSubmitForm()

    return render_to_response('command_send.html', {'form': form},
        context_instance=RequestContext(request))

【问题讨论】:

  • .distinct 更改为.distinct() 有帮助吗?
  • 那是上面的错字...它已经被编码为 .distinct()...

标签: django django-forms


【解决方案1】:

你得到了一个简单的 value_list ,它只是一个 id 的列表,但是当你这样做时,你最好使用简单的 ChoiceField 而不是 ModelChoiceField 并为其提供元组列表,而不仅仅是 id。例如:

class CommandSubmitForm(ModelForm):
    iquery = LiveDataFeed.objects.values_list('unit_id', flat=True).distinct()
    iquery_choices = [('', 'None')] + [(id, id) for id in iquery]
    unit_id = forms.ChoiceField(iquery_choices,
                                required=False, widget=forms.Select())

您也可以将其保留为 ModelChoiceField,并使用 LiveDataFeed.objects.all() 作为查询集,但为了在框中显示 id 并为其填充选项值,您必须子类化ModelChoiceField 覆盖 label_from_instance 方法。你可以看到example in the docs here

【讨论】:

  • 谢谢丹。这是我的实现。{{ iquery = LiveDataFeed.objects.values_list("unit_id",flat=True).distinct() iquery_choices = [('', 'None')] + [(str(id), str(id )) for id in iquery] print "Choices are :", iquery_choices unit_id = forms.ChoiceField(choices=iquery_choices)}}
【解决方案2】:

在致电form.is_valid() 之前,请执行以下操作:

  1. unit_id = request.POST.get('unit_id')

  2. form.fields['unit_id'].choices = [(unit_id, unit_id)]

现在您可以致电form.is_valid(),您的表单将正确验证。

【讨论】:

  • 你能不能用queryset而不是choices的例子来解释一下。当有多个 ajax 调用并且我想在验证之前使用它时,您的方法很有用。但这对我不起作用。
  • 如果用户提交任何 unit_id 值,即使是不在数据库中的值,验证也会起作用。同时该值不在数据库中。
猜你喜欢
  • 2016-05-18
  • 2018-06-11
  • 2021-04-12
  • 2018-08-13
  • 2017-12-30
  • 1970-01-01
  • 2016-09-30
  • 2020-11-20
  • 1970-01-01
相关资源
最近更新 更多