重写ModelForm中的Meta

2024-09-29 21:39:51 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我有:

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

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

^{pr2}$

编辑:

我不得不补充的是,我需要在运行时进行这个重写,模型类将来自视图逻辑中的结果


Tags: 模型视图编辑fieldsmodelmodelsforms逻辑
3条回答

是的,你可以。请看一下django文档中的Form Inheritance。在

您可以为EssayQuestion创建一个新表单,并在Meta内部类中继承MCQuestionForm.Meta

class EssayQuestionForm(MCQuestionForm):

    class Meta(MCQuestionForm.Meta):
        model = models.EssayQuestion

你是说在运行时?是的,你可以。下面是一个简单的方法:

def get_question_form(conditional_model):
    class MCQuestionForm(forms.ModelForm):
        class Meta:
            model = conditional_model
            ...
    return MCQuestionForm

然后在您的视图中,您可以重写get_form_class方法,并使用该函数返回带有您想要的任何模型的类。在

如果您使用的是基于函数的视图,它可能看起来像这样:

^{pr2}$

如果使用的是基于类的视图,则可能如下所示:

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)
    ...

我想你在找modelform_factoryhttps://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=(...), )

相关问题 更多 >

    热门问题