Django中的MultipleChoiceField无法正常工作

时间:2012-12-29 06:10:29

标签: django django-forms django-views

我正在尝试在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']

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模型中的实际对象而不是列表