Как я могу предотвратить дублирование запросов БД при использовании тега включения Django? - PullRequest
0 голосов
/ 30 апреля 2019

Итак, представьте, если у меня есть виджет, который я зарегистрировал как тег включения, например:

@register.inclusion_tag('tags/widget.html', takes_context=True)
def widget(context):

    return {'qs': Foo.objects.all(),
            'request': context['request'],}

В шаблоне виджета я зацикливаю некоторые записи в объекте Foo. Я включаю виджет в свое Мега Меню и мой Нижний колонтитул. Эти шаблоны явно разделены. И включены в base.html

Однако сейчас, когда я загружаю главную страницу, я дважды нажимаю на базу данных для одного и того же виджета (меню и нижнего колонтитула), поэтому я получаю повторяющийся запрос. Как я могу предотвратить что-то подобное?

Мне нравится идея тега включения, но я не хочу повторяющихся запросов.

1 Ответ

1 голос
/ 30 апреля 2019

Вы можете вызвать свой тег в base.html и сохранить данные, которые он возвращает, а затем передать их другим суб-шаблонам, которым могут понадобиться эти данные.

Но я не думаю, что вы можете использовать inclusion_tag больше.Вам, вероятно, нужно использовать что-то вроде simple_tag.Вот пример:

simple_tag:

@register.simple_tag
def widget(some_data):
    return Foo.objects.all()

базовый шаблон:

# You can access the result as foo_objs
{% widget some_data as foo_objs %}

# pass the data to other templates:
{% include "menu.html" with foo_objs=foo_objs %}
{% include "footer.html" with foo_objs=foo_objs %}

Теперь функция виджетавызывается один раз, и данные могут передаваться.

Django документы включают в себя

...