推迟渲染Django模板标签

时间:2018-06-11 12:17:41

标签: python django django-templates

我将旧的PHP项目移植到Django。在此项目中,广告使用javascript显示。为此,我编写了一个模板标签,用于生成(使用模板)相应的代码。但是,在页面的HTML head标记中,应生成所有广告的列表以预加载这些广告。问题是head标记是在基本模板中生成的,该基本模板在实际页面内容之前呈现。在渲染时,渲染广告列表尚不清楚。

在网上搜索我发现了两种可能的解决方案(说实话,我有点惊讶的是我的搜索没有进一步突然出现,尽管这很容易被归咎于糟糕的google-fu技能......):

  • https://django-sekizai.readthedocs.io/en/latest/这似乎是最优雅的解决方案,但只支持Django 1.10(我使用的是2.0)。它也受限于可以使用模板标签的位置,这对我来说是一个主要问题(具体来说:我需要在if语句中使用render_block标签,这是不可能的。)
  • https://github.com/codysoyland/django-phased在此解决方案中,模板呈现两次。然后,在第一遍中生成渲染广告的列表,因此可以在第二遍中完成在头标记中生成广告列表。这个库现在已有6年历史,并且存在Django 2.0的各种问题。我也担心性能,因为这个项目的模板会变得很大。

另一种解决方案可能是创建从某个地方获取广告列表的中间件(上下文?请求对象?),并在响应发送给用户之前将它们插入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。

0 个答案:

没有答案