簡體   English   中英

主鍵作為MultipleChoiceField中的選擇

[英]Primary keys as choices in MultipleChoiceField

這件事對我來說很明顯,但我仍然可以使它正常工作。

以前,我嘗試通過重寫__init__方法從MultipleModelChoiceField獲取已過濾的模型實例,並且它按預期方式工作。 現在,我只需要從這些實例中獲取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)]

簡而言之:不要這樣做,請堅持使用ModelMultipleChoiceField

它顯然不起作用,因為選擇需要一個元組列表。 考慮到這一點,可以像Answer.objects.filter(question__pk=q_pk).values_list('pk', 'someotherfield')那樣重寫[answer.pk for answer in Answer.objects.filter(question__pk=q_pk)]帶您回到ModelMultipleChoiceField功能。

非常感謝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']]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM