我有一個Django Form類定義喜歡這個在Models:
class AccountDetailsForm(forms.Form): ... adminuser = forms.ModelChoiceField(queryset=User.objects.all())
這工作正常,但它有一些限制,我似乎不能解決:
(1)我想在查詢集上使用一個過濾器,基於傳遞給表單的變量accountid,如下所示:
User.objects.filter(account=accountid)
這不能在模型中工作,因為accountid不能作為一個變量傳遞,當然。
因此,查詢集必須以某種方式在視圖中定義,但就我可以看到它是一個必需的字段在Form類。
(2)我想默認選擇AccountDetailsForm數據庫中的一個對象,我可以在視圖中選擇這樣:
User.objects.filter(account=accountid).filter(primary_user=1)
我試過指定adminuser作為默認值在窗體中,(它與其他標准表單字段,如CharField工作):
adminuser = User.objects.filter(account=accountid).filter(primary_user=1) ... form = AccountDetailsForm({'adminuser': adminuser}) return render_to_response('accounts/edit/accountdetails.html', {'form': form, 'account':account})
但沒有運氣。
我應該使用除ModelChoiceField之外的其他方式給我這里需要的靈活性嗎?
謝謝。
覆蓋init方法並接受新的關鍵字參數
class AccountDetailsForm(forms.Form): ... adminuser = forms.ModelChoiceField(queryset=User.objects.all()) def __init__(self, *args, **kwargs): accountid = kwargs.pop('accountid', None) super(AccountDetailsForm, self).__init__(*args, **kwargs) if accountid: self.fields['adminuser'].queryset = User.objects.filter(account=accountid) form = AccountDetailsForm(accountid=3)
您可以隨時在視圖中手動設置選擇。
form = AccountDetailsForm() form.fields['adminuser'].queryset = User.objects.filter(account=accountid)
警告:您不是通過將字典傳遞到您的示例中的表單來設置默認值。
你實際上創建了一個綁定表,可能觸發驗證和所有的爵士。
要設置默認值,use the initials argument.
form = AccountDetailsForm(initial={'adminuser':'3'})
翻譯自:https://stackoverflow.com/questions/5329586/django-modelchoicefield-filtering-query-set-and-setting-default-value-as-an-obj