我有一个详细视图。我需要能够有url args和extra_args (bar
和page_title
在下面的例子)在模板中像TemplateView
做什么,例如,如果我有以下url:
path('foo/<slug:bar>', views.FooView.as_view(), {'page_title':'Foos of the world'}, name='foo',),
然后在模板中,它从上下文中期望'page_title',而不是view.kwargs.page_title
(由于整个站点框架)。
我想我跟踪了mixin的附加url参数直接在上下文中到ContextMixin,但是当我尝试添加mixin到DetailView
,例如
class FooView(ContextMixin, DetailView):
我得到一个错误:TypeError: Cannot create a consistent method resolution order (MRO) for bases ContextMixin, DetailView
我认为DetailView
继承自ContextMixin
,在这种情况下,为什么它不提供功能?
你得到这个错误,因为DetailView
已经继承自ContextMixin
,所有内置的通用视图,呈现模板继承自ContextMixin
,它定义了get_context_data
方法。TemplateView
在调用get_context_data
时将所有视图关键字参数传递到上下文中,这可以从源代码[GitHub]中看到:
class TemplateView(TemplateResponseMixin, ContextMixin, View): """ Render a template. Pass keyword arguments from the URLconf to the context. """ def get(self, request, *args, **kwargs): context = self.get_context_data(**kwargs) return self.render_to_response(context)
你可以在你的视图中覆盖get_context_data
,或者如果你想在多个视图中使用它,你可以创建一个mixin来做到这一点:
class KwargsContextMixin:
def get_context_data(self, *args, **kwargs):
context = super().get_context_data(*args, **kwargs)
# Update the context with the views kwargs, note `self.kwargs` is different from `kwargs`
context.update(self.kwargs)
return context
class FooView(KwargsContextMixin, DetailView):
...