Django ModelForm 元数据
我想创建一个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