主键作为MultipleChoiceField中的选项

时间:2015-10-25 09:37:22

标签: python django django-forms

这件事在我看来是显而易见的,我仍然可以让它发挥作用。

之前我尝试通过覆盖MultipleModelChoiceField方法从__init__获取过滤后的模型实例,并且按预期工作。现在我只需从这些实例中获取pk,我决定在MultipleChoiceField中执行此操作。我尝试按以下方式进行,但没有成功:

class AnswerForm(forms.Form):
    answers = forms.MultipleChoiceField(
        choices = [answer.pk for answer in Answer.objects.all()],
        widget = forms.CheckboxSelectMultiple,
    )

    def __init__(self, *args, **kwargs):
        q_pk = kwargs.pop('q_pk')
        super(AnswerForm, self).__init__(*args, **kwargs)
        self.fields['answers'].choices = [answer.pk for answer in Answer.objects.filter(question__pk=q_pk)]

2 个答案:

答案 0 :(得分:3)

简而言之:不要这样做,坚持ModelMultipleChoiceField

它显然不会起作用,因为选择需要一个元组列表。考虑到这一点,[answer.pk for answer in Answer.objects.filter(question__pk=q_pk)]可以像Answer.objects.filter(question__pk=q_pk).values_list('pk', 'someotherfield')一样重写,这会让您回到ModelMultipleChoiceField所做的事情。

答案 1 :(得分:1)

非常感谢Ivan指导我使用ModelChoiceField。 这是我的疏忽,因为我现在才发现我需要将一些其他模型字段(除了pk)传递给表单。

在这种情况下,我发现将模型主键作为所选输入的值的最佳方法是首先从表单获取整个模型,然后迭代它们以获得所需的字段值,如下所示:

<强> forms.py

class AnswerForm(forms.Form):
    answer = forms.ModelMultipleChoiceField(
        queryset = Answer.objects.all(),
        widget = forms.CheckboxSelectMultiple,
    )

    def __init__(self, *args, **kwargs):
        q_pk = kwargs.pop('q_pk', None)
        super(AnswerForm, self).__init__(*args, **kwargs)
        self.fields['answer'].queryset = Answer.objects.filter(question__pk=q_pk)

<强> views.py

checked = [answer.pk for answer in form.cleaned_data['answer']]