Django Передавайте urls args непосредственно в шаблон, как TemplateView, но с DetailView
У меня есть детальное представление. Мне нужно иметь возможность иметь url args в шаблоне, как это делает TemplateView
, например, если у меня есть следующий url:
path('foo/', 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
, это видно из исходного кода [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):
...