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):
    ...
Вернуться на верх