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(下面示例中的 barpage_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):
    ...