如何将初始参数传递给django的ModelForm实例?

时间:2009-11-08 19:54:41

标签: python django django-models django-forms

我的具体情况是这样的:

我有一个交易模型,其字段为:fromtoForeignKeyauth.User模型)和amount。在我的表单中,我想向用户提供2个要填写的字段: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的选项查询集 - 我无法访问网络request.user对象。

如何将表单中的选项限制为依赖于用户的选项?

4 个答案:

答案 0 :(得分:31)

使用以下方法(希望它足够清楚):

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)

希望有所帮助!如果您需要我更深入地解释,请告诉我。

答案 1 :(得分: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

答案 2 :(得分:1)

http://www.djangobook.com/en/2.0/chapter07/中,设置初始值部分介绍了如何将initial参数用于Form构造函数。您也可以在派生__init__的{​​{1}}方法中执行额外的操作。

答案 3 :(得分:0)

将用户传递到表单的__init__,然后拨打super(…)。然后将self.fields['from'].queryset设置为user.peers