使用setattr将字段添加到Django表单类

时间:2015-10-02 19:50:47

标签: python django django-forms

我试图编写使用Django FormView和一些聪明才智创建一个视图,这将允许我从用户获取输入到函数的输入。我希望代码可以重用,所以我想创建一个能够将目标函数作为参数并自动创建适合该函数的表单的视图。还有更多的工作要做,但总体思路是:

class FormViewForFunction(FormView):
    template_name = '...'
    func = None

    def get_form_class(self):
        class _FunctionForm(forms.Form):
            pass

        a = inspect.getargspec(self.func)
        for argname in a['args']:
            setattr(_FunctionForm, argname, forms.CharField())
        return _FunctionForm

然后你可以在你的URLConf中设置一些使用FormViewForFunction.as_view(func=***insert any function you want***)的东西,你最终会看到一个适合指定该函数参数的表格。让我们不要担心表单提交会发生什么。现在我只是坚持让表格正确生成。

使用上面的代码,表单不会出现任何字段!我做错了什么?

2 个答案:

答案 0 :(得分:3)

表单的字段在初始化期间初始化,您应该覆盖__init__方法,然后将字段附加到self.fields字典

答案 1 :(得分:1)

这应该有效:

class FormViewForFunction(FormView):
   template_name = '...'
   func = None

   def get_form_class(self):
       a = inspect.getargspec(self.func)
       class _FunctionForm(forms.Form):
           def __init__(self, *args, **kwargs):
               super(_FunctionForm, self).__init__(*args, **kwargs)
               for argname in a['args']:
                   self.fields[argname] = forms.CharField()
       return _FunctionForm