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

ken*_*der 20 python django django-models django-forms

我的具体情况是这样的:

我有一个交易模式,与字段:from,to(均为ForeignKeys到auth.User模型)和amount.在我的表单中,我想呈现用户2个字段以填写:amountfrom(to将在视图函数中自动设置为当前用户).

显示a的默认小部件ForeignKey是一个选择框.但是我想要达到的目的是限制对查询集user.peers成员的选择(因此人们只能向他们的同伴注册事务并且不会被所有系统用户充斥).

我试图将ModelForm更改为:

class AddTransaction(forms.ModelForm):
  from = ModelChoiceField(user.peers)
  amount = forms.CharField(label = 'How much?')

  class Meta:
    model = models.Transaction
Run Code Online (Sandbox Code Playgroud)

但似乎我必须在这里传递选择的查询集ModelChoiceField- 我无法访问Web request.user对象.

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

lem*_*nad 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',)
Run Code Online (Sandbox Code Playgroud)

创建这样的表单:

form_backup = BackupForm(request.POST,
                         instance=Backup,
                         systemid=system.id)
form_backup = BackupForm(initial=form_backup_defaults,
                         systemid=system.id)
Run Code Online (Sandbox Code Playgroud)

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

  • 从Form类内部,您可以通过`self.instance`访问Model实例.请记住,添加/创建新对象时实例将相当空白. (4认同)
  • 稍微简单一点就是将systemid作为__init __()中的常规参数捕获,同时直接传递**kwargs:`def __init __(self,systemid,*args,**kwargs):super(BackupForm,self).__ init __(*args,**kwargs)` (2认同)

Dru*_*ska 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
Run Code Online (Sandbox Code Playgroud)