2009-11-08 114 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

相关问题