【问题标题】:Can I use a django template to render django templates?我可以使用 django 模板来呈现 django 模板吗?
【发布时间】:2014-11-01 18:04:48
【问题描述】:

我正在尝试生成一个包含不同类型的各个部分的网站主页。有一个“关于我们”部分,一个“最近的项目”部分等。我的目标是将视图逻辑和模板渲染留给组成这个项目的各个应用程序(关于、投资组合等)。我目前的解决方案是动态构建一个 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 %}

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

【问题讨论】:

    标签: python django templates


    【解决方案1】:

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

    但这有一些主要缺点:

    • 这是一个设置,所以你不能只为某些模板更改它(动态切换它是邪恶的)
    • 它只适用于简单的变量标签,而不适用于更复杂的东西(如{% for x in y %})

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

    【讨论】:

      【解决方案2】:

      我在 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 %}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-10
        • 2021-10-11
        • 2021-09-24
        • 2021-09-05
        • 1970-01-01
        • 2021-08-17
        • 2011-03-21
        相关资源
        最近更新 更多