Django将url args/extra_kwargs直接传递给模板,就像TemplateView一样,但是使用了De



我有一个详细视图。我需要能够有url args和extra_args (barpage_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):
...

最新更新