小编典典

Django:ModelMultipleChoiceField不选择初始选择

python

ModelMultipleChoiceField不会选择初始选择,在我的示例中,我无法进行以下修复(下面的链接):

http://code.djangoproject.com/ticket/5247#comment:6

我的模型和表格:

class Company(models.Model):
    company_name = models.CharField(max_length=200)

class Contact(models.Model):
    company = models.ForeignKey(Company)
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)

class Action(models.Model):
    company = models.ForeignKey(Company, blank=True, null=True)
    from_company = models.ManyToManyField(Contact, verbose_name='Participant(s) from "Company"', blank=True, null=True)

class Action_Form(ModelForm):
    from_company = forms.ModelMultipleChoiceField(queryset=Contact.objects.none(), widget=forms.CheckboxSelectMultiple())
    class Meta:
        model = Action

我的工作和结果:

>>> contact_from_company = Contact.objects.filter(company__exact = 1)#“ 1”用于测试,否则为变量
>>> form = Action_Form(initial = {'from_company':[contacts_from_company中o的o.pk]})#如修复建议
>>>打印表格['from_company']
<ul>
</ ul>
>>>打印联系人
[<联系人:测试人>,<联系人:另一个人>]

>>> form2 = Action_Form(初始= {'from_company':contacts_from_company})
>>>打印form2 ['from_company']
<ul>
</ ul>

>>> form3 = Action_Form(initial = {'from_company':Contact.objects.all()})
>>>打印form3 ['from_company']
<ul>
</ ul>

我希望它可以工作的方式:
1.我的视图从request.GET获取“公司”
2.然后过滤该“公司”的所有“联系人”
3.最后,它创建一个表单并将这些“联系人”作为“初始= {…}”

两个问题:
1. [尚未回答] 如何使ModelMultipleChoiceField接受那些“初始”值?
2. [已回答] 作为替代,我可以将变量传递给Action_Form(ModelForm)以便在我的ModelForm中可以有:

from_company = Forms.ModelMultipleChoiceField(queryset = Contact.objects.filter(company__exact = some_id)#其中some_id来自视图

阅读 218

收藏
2020-12-20

共1个答案

小编典典

您将需要添加一个__init__方法来Action_Form设置初始值,记住要通过 super*
调用__init__ModelForm类。
*

class Action_Form(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(Action_Form, self).__init__(*args, **kwargs)
        self.fields['from_company'].queryset = Contact.object.filter(...

如果您打算将过滤器参数作为关键字args传递给Action_Form,则需要在调用super之前将其删除:

myfilter = kwargs['myfilter']
del kwargs['myfilter']

或者,可能更好:

myfilter = kwargs.pop('myfilter')

有关更多信息,这是引用Django中Dynamic
ModelForms
的另一个链接。

2020-12-20