如何将初始参数传递给django的ModelForm实例?
的特定情况下,我已经是这样的:如何将初始参数传递给django的ModelForm实例?
我有一个交易模式,与字段:from
,to
(均为ForeignKey
s至auth.User
模型)和amount
。在我的表单中,我想提供用户填写的两个字段: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
就在这里 - 在我没有到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',)
创建形式是这样的:
form_backup = BackupForm(request.POST,
instance=Backup,
systemid=system.id)
form_backup = BackupForm(initial=form_backup_defaults,
systemid=system.id)
希望帮助!让我知道你是否需要我更深入地解释。
在http://www.djangobook.com/en/2.0/chapter07/,初始值设定的部分介绍如何使用initial
参数的构造函数Form
。您也可以在派生的Form
的__init__
方法中做额外的工作。
传递初始数据会将我的选择框设置为指定值 - 不限制选择,或者修改验证,我将在ModelForm定义中设置QuerySet。 – kender 2009-11-08 20:01:10
您可以检查构造函数中的初始参数(或其他参数)并相应地设置限制? – 2009-11-08 20:02:34
我就遇到了这个问题为好,这是我的解决方案:
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
传递用户到表单的__init__
,然后调用super(…)
。然后设置self.fields['from'].queryset
为user.peers
非常感谢!这真的有帮助。 – kender 2009-11-09 05:33:57
从Form类中可以通过'self.instance'访问Model实例。请记住,添加/创建新对象时,该实例将显得空白。 – JCotton 2011-07-12 20:33:53
稍微简单一点就是在你的__init __()中捕获systemid作为一个常规参数,同时通过** kwargs直接通过:012_f_init__(self,systemid,* args,** kwargs): super(BackupForm,self).__ init __ * args,** kwargs)' – JCotton 2011-07-12 20:34:29