gpt4 book ai didi

python - ModelMultipleChoiceField 呈现为空的 Django 表单

转载 作者:行者123 更新时间:2023-12-01 01:34:17 25 4
gpt4 key购买 nike

我在使用 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)

最佳答案

首先,每次实例化表单时,都应该将 user 传递给表单,而不仅仅是在 get 方法中。使用 FormView 执行此操作的方法是重写 get_form_kwargs

def get_form_kwargs(self):
kwargs = super(ExportForm, self).get_form_kwargs()
kwargs[user] = self.request.user
return kwargs

然后您可以删除 get() 方法。

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

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.pkuser.username 可能会更好。

关于python - ModelMultipleChoiceField 呈现为空的 Django 表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52521869/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com