我可以使用Django模板来呈现Django模板吗?

2024-05-02 21:37:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图生成一个网站的主页,其中包含不同类型的不同部分。有一个'关于我们'部分,一个'最近的项目'部分等,我的目标是离开视图逻辑和模板呈现的个人应用程序组成这个项目(关于,投资组合等)。我目前的解决方案是动态构建django模板,然后呈现它,如下所示:


在myapp/templatetags/myapp中_标签.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)

在模板中/索引.html:

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

既然我已经在动态地构建一个模板,我就在想:为什么我不能使用django的模板系统来呈现django模板呢?可以替换上述代码的示例模板如下:

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

我能做些什么来让它工作?有没有更好的方法来呈现异类项目的列表?你知道吗


Tags: 项目djangoin模板fortypeload动态
2条回答

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

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

“Django’s template language has no way to escape the characters used for its own syntax.”

我已经解决了这个问题,用视图函数替换了定制的render_[app]_sectiontemplatetags,这些函数接受一个请求对象并返回一个字符串。例如,下面是公文包应用程序的render_section函数:

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

我已经创建了一个定制的templatetag(render),它知道如何调用单个应用程序的render_section视图。以下是我用来呈现主页的模板:

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

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

但这有一些主要缺点:

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

不是一个完整的答案,但它可能会帮助一些人。你知道吗

相关问题 更多 >