Django CBV:覆盖一个视图的相同方法的自定义混合
Django CBV's: Custom mixin's that override the same method of one View
我有以下带有自定义混合的 CBV,AjaxFormMixin_Home
和 AjaxFormMixin_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_Home
和 paginatedObject_Production
到 BaseView
。
例如,
以下将仅 return 由 AjaxFormMixin_Home
定义的上下文
class BaseView(AjaxFormMixin_Home, AjaxFormMixin_Production, FormMixin, View):
而下面只会 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_valid
或 form_invalid
方法是如何协同工作的。
我会考虑将每个单独的表单发布到不同的视图。那么你的mixins只需要覆盖get_context_data
方法,你就可以对每个表单有一个简单的视图。
顺便说一句,我不认为你的 mixin 需要继承 ContextMixin
。继承自 object
.
感谢 Daniel 的贡献,并指出命名约定的改进。如果你让我知道代码如何偏离我自学的最佳实践,我将不胜感激。
感谢 Alasdair 指出表单提交和验证的问题。
我不是通过将超级调用更改为 get_context_data
而是通过更改每个 mixin 中方法的命名约定来解决问题的。上下文数据未正确更新的原因似乎是因为,
BaseView
继承了两个混入。对它的 GET 调用引用了重复的方法名称,即使功能大相径庭。
- Alasdair,正如您正确指出的那样,表单验证是一个问题,因为每个 mixin 的方法名称都相同。
谢谢你们抽出时间!
我有以下带有自定义混合的 CBV,AjaxFormMixin_Home
和 AjaxFormMixin_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_Home
和 paginatedObject_Production
到 BaseView
。
例如,
以下将仅 return 由
定义的上下文AjaxFormMixin_Home
class BaseView(AjaxFormMixin_Home, AjaxFormMixin_Production, FormMixin, View):
而下面只会 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_valid
或 form_invalid
方法是如何协同工作的。
我会考虑将每个单独的表单发布到不同的视图。那么你的mixins只需要覆盖get_context_data
方法,你就可以对每个表单有一个简单的视图。
顺便说一句,我不认为你的 mixin 需要继承 ContextMixin
。继承自 object
.
感谢 Daniel 的贡献,并指出命名约定的改进。如果你让我知道代码如何偏离我自学的最佳实践,我将不胜感激。
感谢 Alasdair 指出表单提交和验证的问题。
我不是通过将超级调用更改为 get_context_data
而是通过更改每个 mixin 中方法的命名约定来解决问题的。上下文数据未正确更新的原因似乎是因为,
BaseView
继承了两个混入。对它的 GET 调用引用了重复的方法名称,即使功能大相径庭。- Alasdair,正如您正确指出的那样,表单验证是一个问题,因为每个 mixin 的方法名称都相同。
谢谢你们抽出时间!