2016-11-30 87 views
2

如果我有:覆盖元中的ModelForm

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

我可以覆盖class Meta改变model一些其他模式?例如:

class Meta: 
    model = models.EssayQuestion 

编辑:

我必须补充一点,我需要做出此覆盖在运行时,模型类将来自于结果的意见逻辑

回答

3

你的意思是在运行?是的你可以。这里有一个简单的方法来做到这一点:

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

谢谢denvaar!对不起,我刚刚开始搞乱django。您能否请您详细解答您的答案 – SaidAkh

+0

@SaidAkh当然,但我认为我需要了解您为了提供有意义的东西而想要做的更好一点。 – denvaar

+0

根据视图逻辑,我将在运行时向'ModelForm'提供不同的模型。 – SaidAkh

0

是的,你可以。在django文档中查看Form Inheritance

您可以EssayQuestion创建一个新的形式和Meta内部类继承MCQuestionForm.Meta

class EssayQuestionForm(MCQuestionForm): 

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