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

use*_*171 15 django django-forms

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)  
Run Code Online (Sandbox Code Playgroud)

在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))
Run Code Online (Sandbox Code Playgroud)

Dan*_*een 13

你得到一个平坦的value_list,它只是一个id列表,但是当你这样做时,你可能最好使用plain ChoiceField而不是a 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())
Run Code Online (Sandbox Code Playgroud)

您也可以将其保留为a ModelChoiceField,并将其LiveDataFeed.objects.all()用作查询集,但是为了在框中显示id以及为选项值填充它,您必须子类ModelChoiceField来覆盖该label_from_instance方法.您可以在此处查看文档中示例.


小智 6

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

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

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

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