Django 将 url args/extra_kwargs 直接传递给模板,如 TemplateView,但带有 DetailView
Django Pass url args/extra_kwargs directly to template like TemplateView, but with DetailView
我有一个详细视图。我需要能够像 TemplateView
那样在模板中包含 url args 和 extra_args(下面示例中的 bar
和 page_title
),例如如果我有以下 url:
path('foo/<slug:bar>', views.FooView.as_view(), {'page_title':'Foos of the world'}, name='foo',),
然后在模板中,它期望来自上下文的 'page_title',而不是 view.kwargs.page_title
(由于整个站点框架)。
我想我找到了用于在上下文中直接将 urls args 附加到 ContextMixin 的混音,但是当我尝试将混音添加到 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
时将所有视图关键字参数传递到上下文中,这可以从 source code [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
,或者如果您想在多个视图中使用它,您可以创建一个混合来实现:
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):
...
我有一个详细视图。我需要能够像 TemplateView
那样在模板中包含 url args 和 extra_args(下面示例中的 bar
和 page_title
),例如如果我有以下 url:
path('foo/<slug:bar>', views.FooView.as_view(), {'page_title':'Foos of the world'}, name='foo',),
然后在模板中,它期望来自上下文的 'page_title',而不是 view.kwargs.page_title
(由于整个站点框架)。
我想我找到了用于在上下文中直接将 urls args 附加到 ContextMixin 的混音,但是当我尝试将混音添加到 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
时将所有视图关键字参数传递到上下文中,这可以从 source code [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
,或者如果您想在多个视图中使用它,您可以创建一个混合来实现:
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):
...