我可以使用django模板来渲染django模板吗?

时间:2014-11-01 18:04:49

标签: python django templates

我正在尝试生成一个网站的主页,其中包含不同类型的各个部分。有一个“关于我们”部分,一个“最近的项目”部分等。我的目标是将视图逻辑和模板渲染留给构成该项目的各个应用程序(关于,投资组合等)。我当前的解决方案涉及动态构建django模板然后渲染它,如下所示:


myapp / templatetags / myapp_tags.py中的

@register.simple_tag
def render_sections(sections):
    template = ""
    for section in sections:
        if section.type == "about":
            template += "{% load about %}"
            template += "{% render_about_section %}"
        elif section.type == "portfolio":
            template += "{% load portfolio %}"
            template += "{% render_portfolio_section %}"
    return render_to_string(template)
模板/ index.html中的

{% load myapp_tags %}
{% block content %}
{% render_sections %}
{% endblock %}

由于我已经在动态构建模板,我想知道:为什么我不能使用django的模板系统来渲染django模板?可以替换上述代码的示例模板是:

{% for s in sections %}
{% load {{s.type}} %}
{% render_{{s.type}}_section %}}
{% endfor %}

我能做些什么来完成这项工作?有没有更好的方法来呈现异构项目列表?

2 个答案:

答案 0 :(得分:1)

您可以在设置中添加TEMPLATE_STRING_IF_INVALID = '{{ %s }}'。这将使用{{ variable_name }}替换每个无效变量,如here所述。

但这有一些主要的缺点:

  • 这是一个设置,因此您无法仅为某些模板更改它(并动态切换它只是邪恶的)
  • 它仅适用于简单变量标签,而不适用于更复杂的内容(如{% for x in y %}

不是一个完整的答案,但它可能对某人有帮助。

答案 1 :(得分:0)

我在Django文档中找到了我自己的问题的答案:

  

https://docs.djangoproject.com/en/dev/ref/templates/api/#limitations-with-string-literals

     

“Django的模板语言无法逃脱用于其自身语法的字符。”

我通过使用带有请求对象并返回字符串的视图函数替换自定义render_[app]_section模板标签来解决问题。例如,这里是投资组合应用的render_section功能:

def render_section(request)
    projects = Project.objects.filter(featured=True)
    return render_to_string("portfolio/section.html", {
        'projects': projects,
    })

我创建了一个自定义模板标签(render),知道如何调用单个应用的render_section视图。这是我用来呈现主页的模板:

{% for section in sections %}
{% render section %}
{% endfor %}