Как реализовать импорт и вызов функции в 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 шт):
Пока ничего лучше не придумал, чем переделать на 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 %}
....
Из-за возврата пустой строки выглядит костылево, но хотя бы кидается в контекст только при подгрузке нужного фрагмента