Override Meta in ModelForm

拟墨画扇 提交于 2020-02-02 08:10:46

问题


If I have:

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

Can I override class Meta to change model to some other model? For instance:

class Meta:
    model = models.EssayQuestion

EDIT:

I had to add that I need to make this override at runtime, the model class will come from the result in views' logic


回答1:


Do you mean at runtime? Yes, you can. Here is a simple way to do it:

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

Then in your view, you can override the get_form_class method and use that function to return the class with whatever model you want on it.

If you're using function-based views, it might look something like this:

def my_view(request):
    model = MultipleChoiceQuestion
    if some_condition:
        model = EssayQuestion
    form = get_question_form(model)
    # now do stuff with form...

If you're using class-based views, it might look something like this:

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



回答2:


Yes, you can. Have a look at Form Inheritance in django documentation.

You can create a new form for EssayQuestion and inherit MCQuestionForm.Meta in Meta inner class:

class EssayQuestionForm(MCQuestionForm):

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



回答3:


I think you are looking for 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=(...), )


来源:https://stackoverflow.com/questions/40880951/override-meta-in-modelform

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!