2009-11-08 82 views
17

的特定情況下,我已經是這樣的:如何將初始參數傳遞給django的ModelForm實例?

我有一個交易模式,與字段:fromto(均爲ForeignKey s至auth.User模型)和amount。在我的表單中,我想提供用戶填寫的兩個字段:amountfromto將在視圖函數中自動設置爲當前用戶)。

默認窗口小部件顯示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訪問目的。

我該如何限制窗體中的選擇到用戶相關的窗體?

回答

29

使用下面的方法(希望這顯然不夠):

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) 

希望幫助!讓我知道你是否需要我更深入地解釋。

+0

非常感謝!這真的有幫助。 – kender 2009-11-09 05:33:57

+4

從Form類中可以通過'self.instance'訪問Model實例。請記住,添加/創建新對象時,該實例將顯得空白。 – JCotton 2011-07-12 20:33:53

+2

稍微簡單一點就是在你的__init __()中捕獲systemid作爲一個常規參數,同時通過** kwargs直接通過:012_f_init__(self,systemid,* args,** kwargs): super(BackupForm,self).__ init __ * args,** kwargs)' – JCotton 2011-07-12 20:34:29

2

http://www.djangobook.com/en/2.0/chapter07/,初始值設定的部分介紹如何使用initial參數的構造函數Form。您也可以在派生的Form__init__方法中做額外的工作。

+0

傳遞初始數據會將我的選擇框設置爲指定值 - 不限制選擇,或者修改驗證,我將在ModelForm定義中設置QuerySet。 – kender 2009-11-08 20:01:10

+0

您可以檢查構造函數中的初始參數(或其他參數)並相應地設置限制? – 2009-11-08 20:02:34

6

我就遇到了這個問題爲好,這是我的解決方案:

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 
0

傳遞用戶到表單的__init__,然後調用super(…)。然後設置self.fields['from'].querysetuser.peers

相關問題