如果我有:
class MCQuestionForm(forms.ModelForm):
class Meta:
model = models.MultipleChoiceQuestion
fields = ('prompt',)
我可以覆盖class Meta
以将model
更改为其他模型吗?例如:
class Meta:
model = models.EssayQuestion
编辑:
我不得不补充一点,我需要在运行时进行覆盖,模型类将来自视图逻辑中的结果
答案 0 :(得分:4)
你的意思是在运行时?是的你可以。这是一个简单的方法:
def get_question_form(conditional_model):
class MCQuestionForm(forms.ModelForm):
class Meta:
model = conditional_model
...
return MCQuestionForm
然后在您的视图中,您可以覆盖get_form_class
方法并使用该函数返回您想要的任何模型的类。
如果您使用的是基于功能的视图,它可能看起来像这样:
def my_view(request):
model = MultipleChoiceQuestion
if some_condition:
model = EssayQuestion
form = get_question_form(model)
# now do stuff with form...
如果您使用的是基于类的视图,它可能看起来像这样:
from django.views.generic import FormView
class MyView(FormView):
...
def get_form_class(self):
model = MultipleChoiceQuestion
if some_condition:
model = EssayQuestion
return get_question_form(model)
...
答案 1 :(得分:1)
我认为您正在寻找modelform_factory
https://docs.djangoproject.com/en/1.10/ref/forms/models/#modelform-factory
from django.forms.models import modelform_factory
if condition:
model = models.MultipleChoiceQuestion
else:
model = models.EssayQuestion
runtimeform_class = modelform_factory(model, fields=(...), )
答案 2 :(得分:0)
是的,你可以。在django文档中查看Form Inheritance。
您可以为EssayQuestion
创建新表单并在MCQuestionForm.Meta
内部类中继承Meta
:
class EssayQuestionForm(MCQuestionForm):
class Meta(MCQuestionForm.Meta):
model = models.EssayQuestion