Django ModelForm 元数据

3 投票
2 回答
1003 浏览
提问于 2025-04-17 13:00

我想创建一个ModelForm类,其中的模型是从视图中传递过来的参数。(我想要一个动态表单,这样我只需在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 个回答

3

你的主要错误是你把 model_name 当成了一个局部变量来用,而不是把它当成一个模型实例。这是Python中的基本知识。

即使你修正了这个问题,代码还是不会正常工作。Meta类是在定义的时候就被处理的,而不是在运行的时候。你需要调用 forms.models.modelform_factory - 如果你想定义一些标准的验证规则或者字段,可以把你的modelform子类传给这个工厂。

form_class = modelform_factory(MyModel, form=MyModelForm)
6

你的问题在于,类(还有元类)是在编译时处理的,而不是在你创建对象的时候。在编译时,模型的名字是未知的。动态创建类是可以的,但稍微复杂一些。幸运的是,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

撰写回答