2014-11-01 113 views
0

我想生成一个网站的主页,其中包含不同类型的各个部分。有一个关于我们的部分,最近的项目部分等。我的目标是将视图逻辑和模板渲染留给组成这个项目的各个应用程序(关于,组合等)。我目前的解决方案包括动态地构造一个Django模板,然后使其像这样:我可以使用django模板呈现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 %} 

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

回答

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, 
    }) 

我已创建一个自定义的templatetag(render),它知道如何调用个别应用程式的render_section视图。下面是我用它来渲染网页模板:

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

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

但是,这里有一些重大缺点:

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

不是一个完全的答案,但它可能有助于某人。