Django CBV:自定义mixin,它覆盖了一个View的相同方法

时间:2018-04-29 20:53:10

标签: django inheritance django-views mixins

我有以下CBV和自定义混音,AjaxFormMixin_HomeAjaxFormMixin_Production

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

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

# 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 中的继承顺序只会返回特定mixin定义的context。我需要将paginatedObject_HomepaginatedObject_Production都退回BaseView

例如,

  1. 下面只返回AjaxFormMixin_Home

    定义的上下文

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

  2. 以下仅返回AjaxFormMixin_Production

    定义的上下文

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

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

    怎样才能解决这类问题呢?

    谢谢!

2 个答案:

答案 0 :(得分:0)

我不认为你问题中的例子足以重现问题。简要地看了一下代码后,问题可能是are calling super().get_context_data()而不是self.get_context_data()

然而,即使修复了上下文,我也不认为您当前的方法会起作用。您可以使用get_context_data多个mixin,因为每个mixin都可以更新上下文。我不明白您认为多种form_validform_invalid方法是如何协同工作的。

我会考虑将每个单独的表单发布到不同的视图。然后你的mixins只需覆盖get_context_data方法,你就可以为每个表单提供一个简单的视图。

顺便说一句,我不认为你的mixins需要继承ContextMixin。只需继承object

答案 1 :(得分:0)

感谢 Daniel 为您的贡献,并指出了命名对话的改进。如果你让我知道代码如何偏离最佳实践,我会很感激。因为我是自学成才。

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

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

  1. BaseView继承了两个mixins。并且GET调用它正在引用重复的方法名称,即使功能完全不同。
    1. Alasdair ,正如您正确指出的那样,表单验证是一个问题,因为每个mixin都有相同的方法名称。
  2. 感谢您的时间!