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

Python 如何将初始参数传递给django的ModelForm实例?,python,django,django-models,django-forms,Python,Django,Django Models,Django Forms,我的具体案例如下: class AddTransaction(forms.ModelForm): from = ModelChoiceField(user.peers) amount = forms.CharField(label = 'How much?') class Meta: model = models.Transaction form_backup = BackupForm(request.POST, inst

我的具体案例如下:

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

  class Meta:
    model = models.Transaction
form_backup = BackupForm(request.POST,
                         instance=Backup,
                         systemid=system.id)
form_backup = BackupForm(initial=form_backup_defaults,
                         systemid=system.id)
我有一个事务模型,带有字段:from和to,这两个字段都是auth.User model和amount的外键。在我的表单中,我想显示用户需要填写的2个字段:amount和from to将在视图函数中自动设置为current user

显示外键的默认小部件是一个选择框。但我想做到的是,限制用户的选择。peers只查询设置成员,这样人们只能向其同行注册交易,而不会被所有系统用户淹没

我尝试将ModelForm更改为以下内容:

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

  class Meta:
    model = models.Transaction
form_backup = BackupForm(request.POST,
                         instance=Backup,
                         systemid=system.id)
form_backup = BackupForm(initial=form_backup_defaults,
                         systemid=system.id)
但是我似乎必须在这里通过ModelChoiceField的查询集,在这里我没有访问web request.user对象的权限


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

使用以下方法,希望它足够清晰:

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',)
创建如下表单:

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

  class Meta:
    model = models.Transaction
form_backup = BackupForm(request.POST,
                         instance=Backup,
                         systemid=system.id)
form_backup = BackupForm(initial=form_backup_defaults,
                         systemid=system.id)

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

我也遇到了这个问题,这是我的解决方案:

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

将用户传递到表单的uuu init_uuuu,然后调用super…。然后将self.fields['from'].queryset设置为user.peers

从表单类内部,您可以通过self.instance访问模型实例。请记住,在添加/创建新对象时,该实例将相当空白。稍微简单一点的是,在直接传递**kwargs时,将systemid作为uuuu init_uuuu中的常规参数捕捉到**kwargs:def uuu init_uuself、systemid、*args、**kwargs:superBackupForm、self.uuu init_uuuuuuuuuuuuuuuuuuuuargs、**Kwargsw此备份和备份表单来自何处?