在django中的模板标记内的文本内使用上下文变量

时间:2017-02-14 22:54:14

标签: django django-templates templatetags

我想在我的模板中做这样的事情。

{% include "blogs/blogXYZ.html" %}

XYZ部分应该是可变的。即如何将上下文变量传递给此位置。例如,如果我正在阅读第一篇博客,我应该能够包含blog1.html。如果我正在阅读第二篇博客,我应该能够包括blog2.html等。 django有可能吗?

1 个答案:

答案 0 :(得分:2)

您可以编写custom tag来接受变量以在运行时构建模板名称。

以下方法利用string.format函数构建动态模板名称,当您需要传递两个以上的变量来格式化模板名称时,它可能会遇到一些问题,因此您可能需要修改和自定义以下代码可满足您的要求。

<强> your_app_dir / templatetags / custom_tags.py

from django import template
from django.template.loader_tags import do_include
from django.template.base import TemplateSyntaxError, Token


register = template.Library()


@register.tag('xinclude')
def xinclude(parser, token):
    '''
    {% xinclude "blogs/blog{}.html/" "123" %}
    '''
    bits = token.split_contents()
    if len(bits) < 3:
        raise TemplateSyntaxError(
            "%r tag takes at least two argument: the name of the template to "
            "be included, and the variable" % bits[0]
        )
    template = bits[1].format(bits[2])
    # replace with new template
    bits[1] = template
    # remove variable
    bits.pop(2)
    # build a new content with the new template name
    new_content = ' '.join(bits)
    # build a new token,
    new_token = Token(token.token_type, new_content)
    # and pass it to the build-in include tag
    return do_include(parser, new_token)  # <- this is the origin `include` tag

模板中的用法:

<!-- load your custom tags -->
{% load custom_tags %}

<!-- Include blogs/blog123.html -->
{% xinclude "blogs/blog{}.html" 123 %}

<!-- Include blogs/blog456.html -->
{% xinclude "blogs/blog{}.html" 456 %}