Как реализовать импорт и вызов функции в template django или организовать работу с контекстом?

Пишу сайт для интернет-магазина на django. Хочу сделать оптимизацию и привести в порядок данные в контексте. Все страницы html состоят из большого набора вложений, частично повторяющихся на других страницах, частично своих:

{% include "div_top.html" %}
{% include "div_menu.html%" }
свой уникальный код
{% include "div_bestsellers.html" %}
{% include "div_top_brands.html" %}
{% include ...%}

Каждому вложению нужен свой набор данных в контексте. Я писал контекстные менеджеры и регистрировал их в settings. Что-то вроде:

<context_processors.py>:

...
def add_brands_to_context(request):
    brands = Brand.objects.all()
    context = {'brands': {'all': brands, 'top': {}}}
    top_brands = sorted([brand for brand in brands], key=lambda x: x.get_products_count(), reverse=True)[:8]
    context['brands']['top'] = top_brands
    return context

<settings.py>:

'context_processors': [
                ...
                'store.context_processors.add_brands_to_context',     
]

Хочу переделать так, чтобы не кидать все данные в общий контекст скопом, ведь не все они нужны для загружаемой страницы, а могут быть нужно одному/двум вложениям, которых может даже не быть именно в этой странице

Как сделать аналог для подгружаемого куска страницы (который в include): <div_top_brands.html>:

 {% import store.context_processors.add_brands_to_context %} 
 {% brands = add_brands_to_context(request) %}

И далее использовать в темплэйте brands аналогично получаемому просто из контекста. Как все это сделать грамотно, без необходимости не усложняя код?

PS. Джанго занимаюсь меньше месяца, все вроде понятно, но копаюсь в тонкостях и многое еще не переварил. Помогите, по возможности, с небольшими фрагментами - что надо/не надо в settings, в context-processors.py/<любойдругой>.py, на общих html страницах, в html-вложениях (includes). Заранее спасибо.


Ответы (1 шт):

Автор решения: Primero

Пока ничего лучше не придумал, чем переделать на templatetags:

register = template.Library()

@register.simple_tag(takes_context=True)
def add_brands_to_context(context):
    brands = Brand.objects.all()
    context['brands'] = {'all': brands, 'top': {}}
    top_brands = sorted([brand for brand in brands], key=lambda x: x.get_products_count(), reverse=True)[:8]
    context['brands']['top'] = top_brands
    return ''

И в шаблоне в нужном месте:

{% add_brands_to_context %}
{% for brand in brands.top %}
    ....

Из-за возврата пустой строки выглядит костылево, но хотя бы кидается в контекст только при подгрузке нужного фрагмента

→ Ссылка