使用 setattr 将字段添加到 Django 表单时失败 class

Failure when using setattr to add field to Django form class

我正在尝试编写使用 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

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

使用上面的代码,表单最终没有任何字段!我做错了什么?

表单的字段在初始化时被初始化,你应该覆盖__init__方法,然后将字段追加到self.fields字典

这应该有效:

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