我想创建一个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不是全局字段。 请帮我解决这个问题。
答案 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)