Отложить рендеринг тега шаблона Django - PullRequest
0 голосов
/ 11 июня 2018

Я портирую старый проект PHP на Django.В этом проекте реклама отображается с использованием JavaScript.Для этого я написал тег шаблона, который генерирует (используя шаблон) соответствующий код.Однако в теге HTML head страницы должен быть создан список всех объявлений для предварительной загрузки этих объявлений.Проблема в том, что тег head генерируется в базовом шаблоне, который отображается перед фактическим содержимым страницы.В то время, когда показ списка рекламных объявлений еще не был известен.

При поиске в Интернете я нашел два возможных решения (честно говоря, я немного удивлен, что в моих поисках больше ничего не появлялось, хотя этоможно легко обвинить в плохих навыках Google-фу ...):

  • https://django -sekizai.readthedocs.io / en / latest / Это, кажется, наиболееэлегантное решение, но поддерживается только для Django 1.10 (я использую 2.0).Также ограничено использование тегов шаблона, что является для меня серьезной проблемой (в частности: мне нужно использовать тег render_block в операторе if, что невозможно).
  • https://github.com/codysoyland/django-phased В этом решении шаблон отображается дважды.Список отображаемых объявлений затем будет сгенерирован на первом проходе, и, таким образом, создание списка объявлений в теге head может быть выполнено на втором проходе.Этой библиотеке сейчас 6 лет, и у нее есть всевозможные проблемы с Django 2.0.Я также беспокоюсь о производительности, потому что шаблоны этого проекта могут стать довольно большими.

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

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

edit

В комментариях делается запрос на фрагмент кода изрезультат я после.Заголовок должен содержать следующее:

<html>
    <head>
        <script>
            googletag.cmd.push(function () {
                // These are the definitions that should come from the ad positions that are rendered later on
                googletag.defineSlot('/12345678/Ad_Button', [200, 20], 'ad-button').addService(googletag.pubads());
                googletag.defineSlot('/12345678/Ad_728x90', [728, 90], 'ad-728x90').addService(googletag.pubads());
                googletag.defineSlot('/12345678/Ad_160x600left', [160, 600], 'ad-160x600left').addService(googletag.pubads());

                googletag.pubads().disableInitialLoad();
                googletag.pubads().enableSingleRequest();
                googletag.pubads().collapseEmptyDivs(true);
                googletag.enableServices();
            })
        </script>
    <head>
    [..]
</html>

При отображении страницы я создал шаблонный тег, который генерирует следующий рекламный код для каждого объявления (в данном случае для первой строки в теге head).):

<div id="ad-button">
    <script>
        googletag.cmd.push(function(){
            googletag.display("ad-button");
        });
    </script>
</div>

Поскольку решение о том, какое объявление, когда и где выполняется в шаблонах (в зависимости от содержимого страницы), заранее неизвестно, какие объявления будут отображаться на самом деле.

Edit 2

Чтобы лучше понять проблему, это также может помочь узнать о настройке шаблонов.Я упростил шаблоны, чтобы они отображали только необходимые данные.

Допустим, я просматриваю подробный вид некоторого типа контента.Представление загружает следующий шаблон:

{% extends 'base.html' %}

{% block content %}
    {% show_ad 200 20 Button %}
{% endblock %}

Тег шаблона show_ad отображает следующий шаблон.Переменная ad_type является третьим параметром тега шаблона show_ad:

<div id="ad-{{ ad_type|lower }}">
    <script>
        googletag.cmd.push(function(){
            googletag.display("ad-{{ ad_type|lower }}");
        });
    </script>
</div>

. При первом редактировании создается второй фрагмент HTML.

Базовый шаблон аналогиченпервый фрагмент HTML в первом редактировании:

<html>
    <head>
        <script>
            googletag.cmd.push(function () {
                {% render_ads_js %}

                googletag.pubads().disableInitialLoad();
                googletag.pubads().enableSingleRequest();
                googletag.pubads().collapseEmptyDivs(true);
                googletag.enableServices();
            })
        </script>
    <head>
    {% block content %}
    {% endblock %}
</html>

В этом случае render_ads_js будет отображать JavaScript, определяющий рекламу.

...