我正在尝试生成一个网站的主页,其中包含不同类型的各个部分。有一个“关于我们”部分,一个“最近的项目”部分等。我的目标是将视图逻辑和模板渲染留给构成该项目的各个应用程序(关于,投资组合等)。我当前的解决方案涉及动态构建django模板然后渲染它,如下所示:
:
@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 %}
我能做些什么来完成这项工作?有没有更好的方法来呈现异构项目列表?
答案 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 %}