Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django:ModelMultipleChiceField未选择初始选项_Python_Django_Django Models_Django Forms - Fatal编程技术网

Python Django:ModelMultipleChiceField未选择初始选项

Python Django:ModelMultipleChiceField未选择初始选项,python,django,django-models,django-forms,Python,Django,Django Models,Django Forms,ModelMultipleEchoIceField未选择初始选项,在我的示例中,我无法使下面的修复链接正常工作: 我的模型和表格: class Company(models.Model): company_name = models.CharField(max_length=200) class Contact(models.Model): company = models.ForeignKey(Company) first_name = models.CharFiel

ModelMultipleEchoIceField未选择初始选项,在我的示例中,我无法使下面的修复链接正常工作:

我的模型和表格:

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
我所做的工作和结果:

>>> 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> 我希望它能起作用的方式: 1.我的视图从request.GET获得公司 2.然后它会过滤该公司的所有联系人 3.最后,它创建一个表单并将这些联系人作为initial={…}传递

两个问题: 1.[尚未回答]如何使ModelMultipleChiceField获取这些初始值? 2.[回答]作为替代方案,我是否可以将变量传递给Action_FormModelForm,以便在我的ModelForm中:

from_company = forms.ModelMultipleChoiceField(queryset=Contact.objects.filter(company__exact=some_id) # where some_id comes from a view 您需要在Action_表单中添加一个_init__;方法来设置初始值,记住通过super调用基本ModelForm类上的_init__;

如果您计划将筛选器参数作为关键字args传递给Action_Form,则需要在调用super之前删除它们:

myfilter = kwargs['myfilter']
del kwargs['myfilter']
或者,也许更好:

myfilter = kwargs.pop('myfilter')
有关更多信息,这里有另一个指向的链接。

我正在回复1

1.如何使ModelMultipleChiceField获得这些初始值? 这可以在使用ModelMultipleEchoiceField初始属性的Action\u Form\uuuuu init\uuuuu方法中完成

正如Django源代码db/models/fields/related.py中所说的那样 在def formfieldself中,**kwargs:


如果前面的答案不够直截了当,我会再次尝试回答1:

如何使ModelMultipleChiceField获得这些初始值? 您可以将Action_表单保留为原始问题中的形式,只需使用它来精确呈现所需内容:

>>> form4 = Action_Form(initial={'from_company': Contact.objects.all().values_list('id',flat=True)})
>>> print form4['from_company']
回答1个问题

这是行不通的:

self.fields['from_company'].initial = [c.pk for c in Contact.object.filter()]
但这确实有效:


谢谢我尝试了init方法,但我不知道如何将变量传递给它,或者传递给ModelForm。我的表单没有初始值,因为应该传递它们的是视图。你能解释一下吗?非常感谢!这解决了我的问题,我现在可以通过过滤器参数了。我想知道他们是否会尽快修补初始值问题。删除了原来的博客帖子链接,该链接现在指向一个成人网站。你在Django源代码中的评论帮助了我很多。该方法名为uu init_uu_u_u,而不是init。谢谢@edufilepe,我已经更新了我的答案。这是StackOverflow代码元素的格式问题。
class Action_Form(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(Action_Form, self).__init__(*args, **kwargs)
        self.fields['from_company'].initial = [c.pk for c in Contact.object.filter()]
>>> form4 = Action_Form(initial={'from_company': Contact.objects.all().values_list('id',flat=True)})
>>> print form4['from_company']
self.fields['from_company'].initial = [c.pk for c in Contact.object.filter()]
self.initial['from_company'] = [c.pk for c in Contact.object.filter()]