Django ModelForm Meta

时间:2012-02-14 12:42:59

标签: python django

我想创建一个ModelForm类,其中model是从视图传递的参数。(我想要一个动态表单,所以我可以通过改变Meta中的模型值来使用相同的类ObjectForm创建所有表单):

class ObjectForm(ModelForm):

    model_name = None

    def __init__(self, *args, **kwargs):
        model_name = kwargs.pop('model_name ')
        super(ModelForm, self).__init__(*args, **kwargs)

    class Meta:
        model = models.get_model('core', model_name )
        exclude = ("societe")

发生错误,并说model_name不是全局字段。 请帮我解决这个问题。

2 个答案:

答案 0 :(得分:6)

你的问题是在编译时处理类(和Meta类),而不是在实例化ObjectForm时处理。在编译时,模型名称是未知的。动态创建类是可能的,但有点复杂。幸运的是,django开发者为你做了艰苦的工作:

>>> from django.forms.models import modelform_factory
>>> modelform_factory(MyModel)
<class 'django.forms.models.MyModelForm'>

<强>更新

所以你想要像

这样的东西
def my_view(request):
    # ...
    MyForm = modelform_factory(MyModel)
    form = MyForm(request.POST) #  or however you would use a 'regular' form

答案 1 :(得分:3)

好吧,您的基本错误是您正在访问model_name作为本地变量,而不是作为模型实例。这是相当基本的Python。

但即使你已经解决了这个问题,它仍然行不通。 Meta类在定义时由元类形式而不是在运行时进行评估。您需要调用forms.models.modelform_factory - 如果要定义一些标准验证和/或字段,可以将modelform子类传递给工厂。

form_class = modelform_factory(MyModel, form=MyModelForm)