【问题标题】:Override Meta in ModelForm在 ModelForm 中覆盖 Meta
【发布时间】:2016-11-30 05:28:19
【问题描述】:

如果我有:

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

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

class Meta:
    model = models.EssayQuestion

编辑:

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

【问题讨论】:

    标签: python django forms


    【解决方案1】:

    你的意思是在运行时?是的你可以。这是一个简单的方法:

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

    【讨论】:

    • 感谢登瓦尔!对不起,我刚刚开始弄乱 django。能否请您详细说明一下您的答案
    • @SaidAkh 当然,但我认为我需要了解您想要做的更好一点,以便提供有意义的东西。
    • 根据视图逻辑,我将在运行时向ModelForm 提供不同的模型。
    • @SaidAkh 看看我更新的答案,希望对您有所帮助。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2016-03-20
        • 1970-01-01
        • 1970-01-01
        • 2011-02-28
        • 1970-01-01
        • 2012-04-10
        • 2019-08-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多