我将旧的PHP项目移植到Django。在此项目中,广告使用javascript显示。为此,我编写了一个模板标签,用于生成(使用模板)相应的代码。但是,在页面的HTML head
标记中,应生成所有广告的列表以预加载这些广告。问题是head
标记是在基本模板中生成的,该基本模板在实际页面内容之前呈现。在渲染时,渲染广告列表尚不清楚。
在网上搜索我发现了两种可能的解决方案(说实话,我有点惊讶的是我的搜索没有进一步突然出现,尽管这很容易被归咎于糟糕的google-fu技能......):
render_block
标签,这是不可能的。)另一种解决方案可能是创建从某个地方获取广告列表的中间件(上下文?请求对象?),并在响应发送给用户之前将它们插入head
标记中的特定位置。我对此并不十分热衷,因为它需要在原始渲染过程之外渲染该列表。它也不是一个非常直观的解决方案,可能会让未来的贡献者感到困惑。
因此,考虑到所有这些注意事项,我的问题是:有没有办法将head
标记中的广告列表的呈现推迟到以后的点,此时呈现的广告列表是已知?
修改
在评论中,请求我之后的结果的代码片段。头部应包含以下内容:
<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>
由于决定在模板中何时何地投放广告(取决于网页内容),因此事先不知道广告将实际显示的位置。
修改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。