django表格给予:请选择有效选项,该选项不是可用选项之一

q0qdq0h2  于 2023-03-04  发布在  Go
关注(0)|答案(3)|浏览(214)

我无法在用户完成选择并发布数据后捕获unit_id中的值。有人能帮我解决这个问题吗?
unit_id下拉列表中的值是从另一个数据库表(LiveDataFeed)中获取的。一旦选择了一个值并发布了表单,就会出现错误:

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

实现方法如下:

    • 在www.example.com上: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)
    • 在www.example.com上: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))
3pvhb19x

3pvhb19x1#

你会得到一个扁平的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方法,你可以在这里的文档中看到一个例子。

k3bvogb1

k3bvogb12#

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

  1. unit_id = request.POST.get('unit_id')
  2. form.fields['unit_id'].choices = [(unit_id, unit_id)]
    现在可以调用form.is_valid(),表单将正确验证。
gab6jxml

gab6jxml3#

这是一个老问题,但我面临着同样的问题,根据django文档的解决方案是添加到_field_name=“name”,其中name是你想在选项中显示的列

iquery = LiveDataFeed.objects.values_list('unit_id', flat=True).distinct()
unit_id = forms.ModelChoiceField(queryset=iquery, empty_label='None',
    required=False, widget=forms.Select(),to_field_name="unit_id")

相关问题