Django:ModelMultipleChoiceField 不选择初始选项 [英] Django: ModelMultipleChoiceField doesn't select initial choices

查看:28
本文介绍了Django:ModelMultipleChoiceField 不选择初始选项的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

我的模型和表格:

class Company(models.Model):company_name = models.CharField(max_length=200)类联系人(模型.模型):公司 = 模型.ForeignKey(公司)first_name = models.CharField(max_length=100)last_name = models.CharField(max_length=100)类动作(模型.模型):company = models.ForeignKey(公司,空白=真,空=真)from_company = models.ManyToManyField(Contact, verbose_name='Participant(s) from "Company"', blank=True, null=True)类 Action_Form(ModelForm):from_company = forms.ModelMultipleChoiceField(queryset=Contact.objects.none(), widget=forms.CheckboxSelectMultiple())元类:模型 = 动作

我所做的和结果:

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

我希望它会起作用的方式:
1. 我的视图从 request.GET
获取公司"2. 然后过滤该公司"的所有联系人"
3. 最后,它创建一个表单并将这些联系人"作为initial={...}"

两个问题:
<强>1.[尚未回答]如何让 ModelMultipleChoiceField 采用这些初始"值?
<强>2.[已回答] 作为替代方案,我可以将一个变量传递给 Action_Form(ModelForm) 以便在我的 ModelForm 中可以有:

<前>from_company = forms.ModelMultipleChoiceField(queryset=Contact.objects.filter(company__exact=some_id) # some_id 来自视图

解决方案

你需要在 Action_Form 中添加一个 __init__ 方法来设置你的初始值,记得调用__init__ 在基础 ModelForm 类上通过 super.

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(...

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

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

或者,可能更好:

myfilter = kwargs.pop('myfilter')

有关更多信息,这里有另一个链接,参考了 Django 中的动态 ModelForms.

ModelMultipleChoiceField doesn't select initial choices and I can't make the following fix (link below) work in my example:

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

My models and form:

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

What I do and the results:

>>> contacts_from_company = Contact.objects.filter(company__exact=1) # "1" for test, otherwise a variable
>>> form = Action_Form(initial={'from_company': [o.pk for o in contacts_from_company]}) # as suggested in the fix
>>> print form['from_company']
<ul>
</ul>
>>> print contacts_from_company
[<Contact: test person>, <Contact: another person>]

>>> form2 = Action_Form(initial={'from_company': contacts_from_company})
>>> print form2['from_company']
<ul>
</ul>

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

The way I was hoping it would work:
1. My view gets "company" from request.GET
2. It then filters all "contacts" for that "company"
3. Finally, it creates a form and passes those "contacts" as "initial={...}"

Two questions:
1. [not answered yet] How can I make ModelMultipleChoiceField take those "initial" values?
2. [answered] As an alternative, can I pass a variable to Action_Form(ModelForm) so that in my ModelForm I could have:

from_company = forms.ModelMultipleChoiceField(queryset=Contact.objects.filter(company__exact=some_id) # where some_id comes from a view

解决方案

You will need to add an __init__ method to Action_Form to set your initial values, remembering to call __init__ on the base ModelForm class via super.

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(...

If you plan to pass your filter params as keyword args to Action_Form, you'll need to remove them prior invoking super:

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

or, probably better:

myfilter = kwargs.pop('myfilter')

For more information, here's another link referring to Dynamic ModelForms in Django.

这篇关于Django:ModelMultipleChoiceField 不选择初始选项的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆