Я портирую старый проект 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, определяющий рекламу.