Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.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表单,modelMultipleEchoIceField呈现为空_Python_Django - Fatal编程技术网

Python Django表单,modelMultipleEchoIceField呈现为空

Python Django表单,modelMultipleEchoIceField呈现为空,python,django,Python,Django,我无法使用modelmultipechoicefield设置表单,其中查询集取决于用户。我的目标是实现导出功能 我的观点是这样的: class ExportView(FormView): template_name = 'ExportTemplate.html' def get(self, request, *args, **kwargs): self.form_class = ExportForm(user = request.user) re

我无法使用
modelmultipechoicefield
设置表单,其中查询集取决于用户。我的目标是实现导出功能

我的观点是这样的:

class ExportView(FormView):
    template_name = 'ExportTemplate.html'

    def get(self, request, *args, **kwargs):
        self.form_class = ExportForm(user = request.user)
        return render(request, self.template_name, {'form': self.form_class})

    def get_success_url(self):
        return '/addrbook/'

    def form_valid(self, form):
        # This method is called when valid form data has been POSTed.
        # It should return an HttpResponse.
        return super().form_valid(form)
<form method="post">{% csrf_token %}
{{ form }}
<input type="submit">
</form>
表格:

我验证了queryset不是空的,它包含一个模型对象列表

我的模板如下所示:

class ExportView(FormView):
    template_name = 'ExportTemplate.html'

    def get(self, request, *args, **kwargs):
        self.form_class = ExportForm(user = request.user)
        return render(request, self.template_name, {'form': self.form_class})

    def get_success_url(self):
        return '/addrbook/'

    def form_valid(self, form):
        # This method is called when valid form data has been POSTed.
        # It should return an HttpResponse.
        return super().form_valid(form)
<form method="post">{% csrf_token %}
{{ form }}
<input type="submit">
</form>
返回运行时错误:

'ExportForm' object has no attribute 'contactList' 
怎么可能呢?contactList成员是ExportForm类定义的一部分,“self”应指向该类的对象

有人能给我解释一下为什么表单字段是空的和/或告诉我一种更好的方法来将用户传递给表单吗

编辑:以下是我对答案所做的更改,以使其正常工作,尽管我现在偶然发现了一个不同的问题(该字段需要查询集,而不是模型对象列表):

视图:

表格:


首先,您应该在每次实例化表单时将
user
传递给表单,而不仅仅是在
get
方法中。使用
FormView
执行此操作的方法是覆盖
get\u form\u kwargs

def get_form_kwargs(self):
    kwargs = super(ExportForm, self).get_form_kwargs()
    kwargs[user] = self.request.user
    return kwargs
然后可以删除
get()
方法

然后,在表单类中,应该使用
none()
方法而不是空列表来获取空查询集。在
\uuuu init\uuuu
方法中,您可以从
kwargs
中弹出用户,然后在编辑字段之前调用
super()
。您可以通过
self.fields
而不是
self.contactList
编辑
contactList
字段。请注意,Django中字段名的推荐样式是
联系人列表
,而不是
联系人列表

class ExportForm(forms.Form):
    contactList = forms.ModelMultipleChoiceField(queryset=YourModel.objects.none())

    def __init__(self, *args, **kwargs):
        user = kwargs.pop('user')
        super(ExportForm, self).__init__(*args, **kwargs)
        usersContacts = ContactManager().getAllUsersContacts()
        self.fields['contactList'].queryset = usersContacts[str(user)]

您没有显示
ContactManager()
代码,但使用了
str(user)
,因为字典键看起来很脆弱。使用
user.pk
user.username
可能会更好。

感谢您指出了这么多问题:)我将实施这些更改,看看它是如何运行的,而不是“self.form\u class”实例化的表单?它被定义为ExportForm(user=request.user)是的,我错了,它是实例化的表单。对于实例化的表单来说,
form
可能比
form_class
;更合适)是的,我从我在SOthanks上找到的答案中复制了它,这个问题已经解决了,但现在我需要把这个集合作为查询集。可能会变得有点复杂,因为联系人与单个用户以及用户所在的组共享。使用
self.contactList
时会出现属性错误,因为
forms.Form
使用一个元类,该元类将字段存储在
base\u fields
字典中。但正如我在下面的回答中所说,您应该使用
self.fields
编辑单个表单实例的字段。
def get_form_kwargs(self):
    kwargs = super(ExportForm, self).get_form_kwargs()
    kwargs[user] = self.request.user
    return kwargs
class ExportForm(forms.Form):
    contactList = forms.ModelMultipleChoiceField(queryset=YourModel.objects.none())

    def __init__(self, *args, **kwargs):
        user = kwargs.pop('user')
        super(ExportForm, self).__init__(*args, **kwargs)
        usersContacts = ContactManager().getAllUsersContacts()
        self.fields['contactList'].queryset = usersContacts[str(user)]