我无法在用户完成选择并发布数据后捕获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))
3条答案
按热度按时间3pvhb19x1#
你会得到一个扁平的value_list,它只是一个id的列表,但是当你这样做的时候,你最好使用一个普通的
ChoiceField
而不是ModelChoiceField
,并且给它提供一个元组的列表,而不仅仅是id。你也可以将它保留为
ModelChoiceField
,并使用LiveDataFeed.objects.all()
作为查询集,但是为了在框中显示id并填充选项值,你必须子类化ModelChoiceField
来覆盖label_from_instance
方法,你可以在这里的文档中看到一个例子。k3bvogb12#
在调用
form.is_valid()
之前,请执行以下操作:unit_id = request.POST.get('unit_id')
form.fields['unit_id'].choices = [(unit_id, unit_id)]
现在可以调用
form.is_valid()
,表单将正确验证。gab6jxml3#
这是一个老问题,但我面临着同样的问题,根据django文档的解决方案是添加到_field_name=“name”,其中name是你想在选项中显示的列