2011-03-16 120 views
48

我有一個Django表單類中定義喜歡這ModelsDjango的ModelChoiceField:過濾查詢設置和設置默認值作爲對象

class AccountDetailsForm(forms.Form): 
    ... 
    adminuser = forms.ModelChoiceField(queryset=User.objects.all()) 

該工程確定,但它有一些侷限性,所以我似乎無法解決:

(1)I想用的查詢集的過濾器,基於傳遞給形式的可變accountid,像這樣:

User.objects.filter(account=accountid) 

這在模型中不起作用,因爲accountid當然不能作爲變量傳遞。

由此可見,queryset必須以某種方式在Views定義,但據我可以看到它在Form類必填字段。

(2)我想提出的AccountDetailsForm在數據庫中的對象,我可以在Views這樣選擇默認的選擇:

User.objects.filter(account=accountid).filter(primary_user=1) 

我已經試過指定管理用戶的默認形式值,(這與其他標準的表單字段的作品,像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以外的東西?

謝謝。

回答

91

覆蓋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'}) 
+0

嗨場,感謝您的回覆。在視圖中設置查詢集運行良好。我無法解決的部分是將ModelChoiceField的綁定表單值(而不是默認值)設置爲_User.objects.filter(account = accountid).filter(primary_user = 1)_。謝謝。 – eli 2011-03-16 18:52:42

6

您可以覆蓋在視圖

yourForm = AccountDetailsForm() 

yourForm.fields['accomodation'] = forms.ModelChoiceField(User.objects.filter(account=accountid).filter(primary_user=1))