Как передать объект сразу во все View?

Есть base-tamplate, содержащий меню, где menu - объект, содержащий все записи модели Menu:
<ul class="nav justify-content-center nav-pills">
{% for item in menu %}
<li class="nav-item">
<a class="nav-link" id="{{ item.item_id }}" href="{{ item.link }}" title="{{ item.title }}">{{ item.item }}</a>
</li>
{% endfor %}
</ul>

от него наследуются все остальные темплейты.
Соответственно, чтобы отображать это меню на всех страницах, нужно передавать объект menu во все View, например:
class ArticleDetailView(DetailView):
    model = Article
    def get_context_data(self, **kwargs):
        context = super(ArticleDetailView, self).get_context_data(**kwargs)
        context['menu'] = MenuItems.objects.all()
        return context

или
def about(request):
    menu = MenuItems.objects.all()
    return render(request, 'blog/about.html', {'menu':menu,})


Как-то это вообще не очень, я точно помню, когда изучал django что-то читал про наследование объекта из base-темплейта на все дочерние, но никак не могу найти и освежить знания.
  • Вопрос задан
  • 168 просмотров
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Django
Седой и строгий
Для таких целей служат контекстные процессоры.

context_processors.py
def menu(request):
    return {'menu': MenuItems.objects.all()}

settings.py
TEMPLATES = [
    {
        ...
        'OPTIONS': {
            'context_processors': [
                ...
                'mysite.context_processors.menu',
            ],
            ...
        }
    }
]
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
tema_sun
@tema_sun
Проще всего свой контекст процессор сделать.

Создаете файл, например, context_processors.py
def custom_proc(request):
    return {'menu': MenuItems.objects.all() }


И потом в settings.py добавляете его в соответсвующий блок
TEMPLATES = [
    {
        'BACKEND': ...,
        'DIRS': ...,
        'OPTIONS': {
            'context_processors': [
                ...,
                'path.to.context_processors.custom_proc',
            ],
        },
    },
]
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы