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此备份和备份表单来自何处?