django表单给出:选择一个有效的选项.这个选择不是可用的选择之一



在用户完成选择并发布数据后,我无法从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))

您将获得一个扁平的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方法。您可以在这里的文档中看到一个示例。

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

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

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

现在您可以调用form.is_valid(),您的表单将正确验证

这是一个老问题,但我面临同样的问题,根据django文档的解决方案是添加to_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")

重写_init函数。使用Limited_condition变量在更新视图中删除该字段。在我的例子中,"作者"字段导致了"选择一个有效的选择"的问题。我只是在表单的起始部分删除了它。

forms.py
    class UrlentryForm(ModelForm):
class Meta:
    model = Urlentry
    fields = ['url_text', 'author', 'url_id', 'datetime_available_from', 'datetime_available_to', 'partner_ads','qr_code','snapshot']
def __init__(self, *args, **kwargs):
    limited_condition = kwargs.pop('limited_condition', None)
    super(UrlentryForm, self).__init__(*args, **kwargs)
    if limited_condition:
        del self.fields['author']
        self.fields['url_id'].widget = HiddenInput()
        self.fields['url_id'].required = False
        self.fields['qr_code'].widget = HiddenInput()
        self.fields['qr_code'].required = False
        self.fields['snapshot'].widget = HiddenInput()
        self.fields['snapshot'].required = False

修改views.py

views.py
    @login_required(login_url=reverse_lazy('auth:login'))
    def update_urlentry(request, pk):
        #....
    if request.method == "POST":
            urlentry_form = UrlentryForm(request.POST, instance=urlentry, limited_condition=True)
            if urlentry_form.is_valid():
                urlentry = urlentry_form.save(commit=False)
                # additional modification of urlentry, if needed
                urlentry.save()
    else:
        messages.error(request, urlentry_form.errors)
    redirect('polls:detail', pk=urlentry.pk)

#和结束代码在这里

在调用is_valid()方法之前将选项填充到表单中。

form = CommandSubmitForm(request.POST)
form.fields["unit_id"].choices = choices
if form.is_valid():
  # add your logic here

最新更新