我有以下CBV和自定义混音,AjaxFormMixin_Home
和AjaxFormMixin_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_Home
和paginatedObject_Production
都退回BaseView
。
例如,
下面只返回AjaxFormMixin_Home
类BaseView(AjaxFormMixin_Home,AjaxFormMixin_Production,FormMixin,View):
以下仅返回AjaxFormMixin_Production
类BaseView(AjaxFormMixin_Production,AjaxFormMixin_Home,FormMixin,View):
最后,我注意到编译器完全忽略了第二个mixin(取决于继承的顺序)。
怎样才能解决这类问题呢?
谢谢!
答案 0 :(得分:0)
我不认为你问题中的例子足以重现问题。简要地看了一下代码后,问题可能是are calling super().get_context_data()
而不是self.get_context_data()
。
然而,即使修复了上下文,我也不认为您当前的方法会起作用。您可以使用get_context_data
多个mixin,因为每个mixin都可以更新上下文。我不明白您认为多种form_valid
或form_invalid
方法是如何协同工作的。
我会考虑将每个单独的表单发布到不同的视图。然后你的mixins只需覆盖get_context_data
方法,你就可以为每个表单提供一个简单的视图。
顺便说一句,我不认为你的mixins需要继承ContextMixin
。只需继承object
。
答案 1 :(得分:0)
感谢 Daniel 为您的贡献,并指出了命名对话的改进。如果你让我知道代码如何偏离最佳实践,我会很感激。因为我是自学成才。
感谢 Alasdair 指出表单提交和验证的问题。
我解决了这个问题,不是通过改变对get_context_data
的超级调用,而是通过改变每个mixin中方法的命名约定。上下文数据未正确更新的原因似乎是因为,
BaseView
继承了两个mixins。并且GET调用它正在引用重复的方法名称,即使功能完全不同。
感谢您的时间!