我有一个自定义表单,我想传递一个参数。 在this示例之后,我想出了以下代码:
class EpisodeCreateForm(forms.Form):
def __init__(self, *args, **kwargs):
my_arg = kwargs.pop('my_arg')
super(EpisodeCreateForm, self).__init__(*args, **kwargs)
my_field = forms.CharField(initial=my_arg)
但是我收到以下错误:
Exception Value: name 'my_arg' is not defined
如何让它识别表单代码中的参数?
答案 0 :(得分:7)
您需要通过引用__init__
中的表单字段实例来设置初始值。要访问__init__
中的表单字段实例,请在调用super
之前将其设置为:
self.fields['my_field'].initial=my_arg
从您声明initial=my_arg
的位置删除my_field
,因为此时(声明类时)my_arg
不在范围内。
答案 1 :(得分:1)
问题是在创建类时初始化my_field
,但在创建新实例时初始化my_arg
,对于my_field
知道其值来说为时已晚。您可以做的是在my_field
中初始化__init__
:
def __init__(self, *args, **kwargs):
my_arg = kwargs.pop('my_arg')
super(EpisodeCreateForm, self).__init__(*args, **kwargs)
if not self.my_field:
self.my_field = my_arg
答案 2 :(得分:0)
此代码在导入时执行一次:
my_field = forms.CharField(initial=my_arg)
并且此代码在表单实例创建时执行:
my_arg = kwargs.pop('my_arg')
super(EpisodeCreateForm, self).__init__(*args, **kwargs)
所以这不会这样。您应该在__init__
方法中为字段设置初始值。
顺便说一下,这一切似乎都没有必要,为什么不在视图中使用'initial'关键字?
答案 3 :(得分:0)
考虑到你的评论,我会这样做:
class EpisodeCreateForm(forms.Form):
def __init__(self, *args, **kwargs):
self.my_arg = kwargs.pop('my_arg')
kwargs.setdefault('initial', {})['my_field'] = self.my_arg
super(EpisodeCreateForm, self).__init__(*args, **kwargs)
def save(self):
do_something(self.my_arg)
...
super(EpisodeCreateForm, self).save()
my_field = forms.CharField()
将initial
传递给超类并让它完成工作似乎比直接在字段实例上设置它更清晰。
答案 4 :(得分:0)
您只需要在table2
之前弹出您的arg,并在super()
之后将其放入fields
词典中:
super()
然后,只需致电
class EpisodeCreateForm(forms.Form):
my_field = forms.CharField(label='My field:')
def __init__(self, *args, **kwargs):
my_arg = kwargs.pop('my_arg')
super(EpisodeCreateForm, self).__init__(*args, **kwargs)
self.fields['my_arg'].initial = my_arg
例如,假设您有一个剧集表,并且您想在选择菜单中显示可用的剧集,并选择当前剧集。为此,请使用form = EpisodeCreateForm (my_arg=foo)
:
ModelChoiceField