将参数传递给Django中的Form

时间:2011-08-31 14:53:34

标签: django django-forms

我有一个自定义表单,我想传递一个参数。 在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

如何让它识别表单代码中的参数?

5 个答案:

答案 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