[英]Django form with ModelMultipleChoiceField rendered empty
我在使用ModelMultipleChoiceField
取決於用戶的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)
我確認queryset不為空,它包含模型對象列表。
我的模板如下所示:
<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類定義的一部分,“自身”應指向該類的對象。
有人可以向我解釋為什么將表單字段設置為空和/或為我提供一種將用戶傳遞到表單的更好方法嗎?
編輯:盡管我現在偶然發現了一個不同的問題(該字段需要一個查詢集,而不是模型對象列表),但這是我對答案所做的更改,以使其正常工作:
視圖:
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.pk
或user.username
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.