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)]