簡體   English   中英

具有ModelMultipleChoiceField的Django表單呈現為空

[英]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.pkuser.username

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM