我的具体情况是这样的:
我有一个交易模型,其字段为:from
,to
(ForeignKey
到auth.User
模型)和amount
。在我的表单中,我想向用户提供2个要填写的字段:amount
和from
(to
将在视图函数中自动设置为当前用户。)
显示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
对象。
如何将表单中的选项限制为依赖于用户的选项?
答案 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