我正在尝试在Django中使用forms.MultipleChoiceField,而form.is_valid返回True,但我的views.py中的查询返回“匹配的查询不存在。”
forms.py:
LIST_INTERESTS = (
('Energy', 'Energy'),
('Business', 'Business'),
('Social', 'Social'),
('Mobile', 'Mobile'),
)
interests = forms.MultipleChoiceField(choices=LIST_INTERESTS, initial='Energy')
views.py:
temp_interests = list(form.cleaned_data['interests']),
for i in temp_interests:
b = Interests.objects.get(val=i)
...此时它会抱怨与查询不匹配的内容不存在。有什么想法吗?
奖金信息:
当我将temp_interests插入debug.html:
时{% for i in temp_interests %}
{{ i }}<br>
{% endfor %}
它返回[u'Answer 1',u'Answer 2']
答案 0 :(得分:0)
问题出在这一行:
b = Interests.objects.get(val=i)
<{3>}方法中的。
我不确定你想在这里实现什么。但get()
方法的作用是使用传递的参数返回单个匹配查询。如果它无法使用传递的参数找到任何对象,则会引发DoesNotExist
异常,这就是您的情况。
[注意:另外,当您确定根据传递的参数只有一个对象存在时,请确保使用get()
。如果您不确定是否可以使用get()
方法返回与给定查询匹配的所有对象的列表。]
您需要确保存在Interest
对象,其中val
属性等于您传递的值。所以在上面的例子中,没有Interest
对象,其中val
等于i
的值,因此引发了异常。
要调试上述内容,您可以按如下方式添加print语句:
temp_interests = list(form.cleaned_data['interests']),
for i in temp_interests:
print i # Debug
b = Interests.objects.get(val=i)
并检查服务器以查看正在引发的value
异常。
答案 1 :(得分:0)
如果Interests
是模型,您可以使用ModelMulitpleChoiceField尝试此操作:
interests = forms.ModelMultipleChoiceField(queryset=Interests.objects.all())
这样interests
字段会填充Interests
模型中的实际对象而不是列表