在ModelForm中覆盖Meta

时间:2016-11-30 05:28:20

标签: python django forms

如果我有:

class MCQuestionForm(forms.ModelForm):
    class Meta:
        model = models.MultipleChoiceQuestion
        fields = ('prompt',)

我可以覆盖class Meta以将model更改为其他模型吗?例如:

class Meta:
    model = models.EssayQuestion

编辑:

我不得不补充一点,我需要在运行时进行覆盖,模型类将来自视图逻辑中的结果

3 个答案:

答案 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