[英]How can I pass a parameter from the view into a modelForm in django?
[英]How to pass initial parameter to django's ModelForm instance?
我的具體情況是這樣的:
我有一個事務模型,包含字段: from
, to
( ForeignKey
s to auth.User
model)和amount
。 在我的形式,我想向用戶呈現2個字段填寫: amount
和from
( to
將被全自動設置為當前用戶在視圖函數)。
提供ForeignKey
默認小部件是一個選擇框。 但是我想要達到的目的是限制user.peers
成員的選擇(因此人們只能注冊與他們的同事的交易而不會被所有系統用戶淹沒)。
我試圖將ModelForm更改為:
class AddTransaction(forms.ModelForm):
from = ModelChoiceField(user.peers)
amount = forms.CharField(label = 'How much?')
class Meta:
model = models.Transaction
但似乎我必須在這里傳遞ModelChoiceField
選項的查詢集 - 我無權訪問web request.user
對象。
如何將表單中的選項限制為依賴於用戶的選項?
使用以下方法(希望它足夠清楚):
class BackupForm(ModelForm):
"""Form for adding and editing backups."""
def __init__(self, *args, **kwargs):
systemid = kwargs.pop('systemid')
super(BackupForm, self).__init__(*args, **kwargs)
self.fields['units'] = forms.ModelMultipleChoiceField(
required=False,
queryset=Unit.objects.filter(system__id=systemid),
widget=forms.SelectMultiple(attrs={'title': _("Add unit")}))
class Meta:
model = Backup
exclude = ('system',)
創建這樣的表單:
form_backup = BackupForm(request.POST,
instance=Backup,
systemid=system.id)
form_backup = BackupForm(initial=form_backup_defaults,
systemid=system.id)
希望有所幫助! 如果您需要我深入解釋,請告訴我。
我也遇到了這個問題,這是我的解決方案:
class ChangeEmailForm(forms.ModelForm):
def __init__(self, user, *args, **kwargs):
self.user = user
super(ChangeEmailForm, self).__init__(*args, **kwargs)
self.fields['email'].initial = user.email
class Meta:
model = User
fields = ('email',)
def save(self, commit=True):
self.user.email = self.cleaned_data['email']
if commit:
self.user.save()
return self.user
在http://www.djangobook.com/en/2.0/chapter07/中 ,“ 設置初始值 ”一節介紹了如何將initial
參數用於Form
構造函數。 您也可以在派生Form
的__init__
方法中執行額外的操作。
將用戶傳遞到表單的__init__
,然后調用super(…)
。 然后將self.fields['from'].queryset
為user.peers
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.