2014-11-01 222 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 %}

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