0

我正在尝试在 Django 中使用 forms.MultipleChoiceField,form.is_valid 返回 True,但我的 views.py 中的查询返回“匹配查询不存在”。

表格.py:

LIST_INTERESTS = (
    ('Energy', 'Energy'),
    ('Business', 'Business'),
    ('Social', 'Social'),
    ('Mobile', 'Mobile'),
)
interests = forms.MultipleChoiceField(choices=LIST_INTERESTS, initial='Energy')

视图.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']

4

2 回答 2

0

问题出在这一行:

b = Interests.objects.get(val=i)

get()方法中。

我不确定您要在这里实现什么。但是get()方法的作用是使用传递的参数返回一个匹配的查询。如果它无法使用传递的参数找到任何对象,则会引发DoesNotExist异常,这就是您的情况。

[注意:此外,get()当您确定根据传递的参数只存在一个对象时,请确保使用。如果您不确定是否可以使用filter()返回与给定查询匹配的所有对象列表的方法。]

您需要确保Interest存在一个对象,其中val属性等于您传递的值。因此,在上述情况下,没有Interest对象val等于i' 值,因此引发了异常。

要调试上述内容,您可以添加打印语句,如下所示:

temp_interests = list(form.cleaned_data['interests']),
for i in temp_interests:
    print i  # Debug
    b = Interests.objects.get(val=i)

并检查服务器以查看value引发了哪个异常。

于 2012-12-29T07:53:58.567 回答
0

如果Interests是模型,您可以改用 ModelMulitpleChoiceField 来尝试:

interests = forms.ModelMultipleChoiceField(queryset=Interests.objects.all())

这样,该interests字段将填充Interests模型中的实际对象而不是列表

于 2012-12-29T15:32:13.177 回答