Django CBV:覆盖一个视图的相同方法的自定义混合

Django CBV's: Custom mixin's that override the same method of one View

我有以下带有自定义混合的 CBV,AjaxFormMixin_HomeAjaxFormMixin_Production

# app1/views.py
class BaseView(AjaxFormMixin_Home, AjaxFormMixin_Production, FormMixin, View):

基于某些 ajax 条件,两个 mixin 都会根据 FormMixin 的要求覆盖 def get_context_data(self, **kwargs):。见下文,

# app1/mixins.py
class AjaxFormMixin_Home(ContextMixin, object):

   def get_context_data(self, **kwargs):
       context = super(AjaxFormMixin_Home, self).get_context_data(**kwargs)
       obj = UserNote.objects.all()
       paginatedObject_Home = Paginator(obj, 5)
       page = self.request.GET.get('userNotepage')
       context.update('paginatedObject_Home':paginatedObject_Home.page(page))
       return context

# app2/mixins.py
class AjaxFormMixin_Production(ContextMixin, object):

   def get_context_data(self, **kwargs):
       context = super(AjaxFormMixin_Production, self).get_context_data(**kwargs)
       obj = Production.objects.all()
       paginatedObject_Production = Paginator(obj, 5)
       page = self.request.GET.get('productionPage')
       context.update('paginatedObject_Production':paginatedObject_Production.page(page))
       return context

现在,这就是问题所在。 更改 BaseView 中的继承顺序 仅 returns context 由那个特定的 mixin 定义。我需要 return paginatedObject_HomepaginatedObject_ProductionBaseView

例如,

  1. 以下将仅 return 由 AjaxFormMixin_Home

    定义的上下文

    class BaseView(AjaxFormMixin_Home, AjaxFormMixin_Production, FormMixin, View):

  2. 而下面只会 return 由 AjaxFormMixin_Production

    定义的上下文

    class BaseView(AjaxFormMixin_Production, AjaxFormMixin_Home, FormMixin, View):

最后,我注意到编译器完全忽略了第二个 mixin(取决于继承顺序)。

如何解决此类问题?

谢谢!

我认为您问题中的示例不足以重现问题。简单查看代码后,问题可能是您 are calling super().get_context_data() 而不是简单地 self.get_context_data().

但是,即使这修复了上下文,我也不认为您当前的方法会奏效。你可以有多个带有 get_context_data 的 mixin,因为每个 mixin 都可以更新上下文。我不明白您认为多个 form_validform_invalid 方法是如何协同工作的。

我会考虑将每个单独的表单发布到不同的视图。那么你的mixins只需要覆盖get_context_data方法,你就可以对每个表单有一个简单的视图。

顺便说一句,我不认为你的 mixin 需要继承 ContextMixin。继承自 object.

感谢 Daniel 的贡献,并指出命名约定的改进。如果你让我知道代码如何偏离我自学的最佳实践,我将不胜感激。

感谢 Alasdair 指出表单提交和验证的问题。

我不是通过将超级调用更改为 get_context_data 而是通过更改每个 mixin 中方法的命名约定来解决问题的。上下文数据未正确更新的原因似乎是因为,

  1. BaseView 继承了两个混入。对它的 GET 调用引用了重复的方法名称,即使功能大相径庭。
    1. Alasdair,正如您正确指出的那样,表单验证是一个问题,因为每个 mixin 的方法名称都相同。

谢谢你们抽出时间!