【发布时间】:2018-09-26 15:56:41
【问题描述】:
我在设置带有ModelMultipleChoiceField 的表单时遇到问题,其中查询集取决于用户。我的目标是实现导出功能。
我的观点是这样的:
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)
表格:
class ExportForm(forms.Form):
def __init__(self, user, *args, **kwargs):
usersContacts = ContactManager().getAllUsersContacts()
self.contactList = forms.ModelMultipleChoiceField(queryset = usersContacts[str(user)])
print(usersContacts[str(user)])
super(ExportForm, self).__init__(*args, **kwargs)
我验证了查询集不为空,它包含一个模型对象列表。
我的模板如下所示:
<form method="post">{% csrf_token %}
{{ form }}
<input type="submit">
</form>
唯一呈现的是提交按钮。
让我完全不确定python基础的另一件事是这段代码:
class ExportForm(forms.Form):
contactList = forms.ModelMultipleChoiceField(queryset = [])
def __init__(self, user, *args, **kwargs):
usersContacts = ContactManager().getAllUsersContacts()
self.contactList.queryset = usersContacts[str(user)]
print(usersContacts[str(user)])
super(ExportForm, self).__init__(*args, **kwargs)
返回运行时错误:
'ExportForm' object has no attribute 'contactList'
这怎么可能? contactList 成员是 ExportForm 类定义的一部分,“self”应指向该类的对象。
有人可以向我解释为什么表单字段显示为空和/或向我指出将用户传递给表单的更好方法吗?
编辑:这是我对答案所做的更改以使其正常工作,尽管我现在偶然发现了一个不同的问题(该字段需要一个查询集,而不是模型对象列表):
查看:
class ExportView(FormView):
template_name = 'ExportTemplate.html'
form_class = ExportForm
def get_form_kwargs(self):
kwargs = super(ExportView, self).get_form_kwargs()
kwargs['user'] = self.request.user
return kwargs
表格:
class ExportForm(forms.Form):
contactList = forms.ModelMultipleChoiceField(queryset = Contact.objects.none())
def __init__(self, *args, **kwargs):
user = kwargs['user']
kwargs.pop('user', None)
super(ExportForm, self).__init__(*args, **kwargs)
usersContacts = ContactManager().getAllUsersContacts()
self.fields['contactList'].queryset = usersContacts[str(user)]
print(self.fields['contactList'].queryset)
【问题讨论】:
-
使用
self.contactList时会出现属性错误,因为forms.Form使用将字段存储在base_fields字典中的元类。但正如我在下面的回答中所说,您应该使用self.fields来编辑单个表单实例的字段。