2015-05-14 112 views
0

我正在創建一個基於Django的Web應用程序,它是服務器端呈現的。不過,現在有幾頁我想使用來自Feed的JavaScript重新呈現。Django包含html而不解析模板標籤

我寧願使用DRY方法並重新使用我現有的Django模板,將它們包含到標籤內的頁面上。

那麼我可以用我的選擇的模板庫(有很多支持Django模板)

但是我卡在最簡單的東西,包括模板沒有解析!下面是我嘗試的方法不工作

預計輸出

<ul> 
    <li>John Doe</a></li> 
    <li>Sally Taylor</a></li> 
    <li>David Smith</a></li> 
</ul> 
<script type="text/template"> 
    <ul> 
    {% for person in people %} 
     <li>{{ person.name }}</a></li> 
    {% endfor %} 
    </ul> 
</script> 

方法1部 - 作品,但我要重複相同的HTML兩次

的index.html

{% include "includes/list.html" %} 
<script type="text/template"> 
    {% include "includes/list.html" with script=1 %} 
</script> 

list.html

{% if script = 1 %} 
{% verbatim %} 
    <ul> 
     {% for person in people %} 
      <li>{{ person.name }}</a></li> 
     {% endfor %} 
    </ul> 
{% endverbatim %} 
{% else %} 
<ul> 
    {% for person in people %} 
     <li>{{ person.name }}</a></li> 
    {% endfor %} 
</ul> 
{% endif %} 

方法2 - 不輸出達到了循環後

的index.html

{% include "includes/list.html" %} 
<script type="text/template"> 
    {% include_raw "includes/list.html" %} 
</script> 

tags.py

from django import template 
from django.template import loader, Context 

register = template.Library() 

@register.simple_tag 
def include_raw(templatename): 
    return loader.get_template(templatename).render(Context()) 

任何幫助將不勝感激!

+0

'{%如果腳本= 1%}'應該是'{%如果腳本== 1%}' – karthikr

+0

該方法工作正常,但這意味着我必須重複我的html兩次! –

回答

0

所以我解決它使用此解決方案: https://gist.github.com/HenrikJoreteg/742160

的代碼,使其工作是:

的index.html

{% load pages_tags %} 
{% include "includes/list.html" %} 
<script type="text/template"> 
    {% raw_include "includes/list.html" %} 
</script> 

list.html

<ul> 
    {% for person in people %} 
     <li>{{ person.name }}</a></li> 
    {% endfor %} 
</ul> 

pages_tags。PY

from django import template, conf 
register = template.Library() 

@register.simple_tag 
def raw_include(path): 
    import os.path 

    for template_dir in conf.settings.TEMPLATE_DIRS: 
     filepath = '%s/%s' % (template_dir, path) 
     if os.path.isfile(filepath): 
      break 

    fp = open(filepath, 'r') 
    output = fp.read() 
    fp.close() 
    return output 

下面是一個例子項目中顯示它的所有一起工作,包括使用JavaScript渲染客戶端模板:

https://github.com/kmturley/django-client-templates

而且我也做了這個jsperf測試的不同表現神社樣式的模板庫:

https://jsperf.com/jinja-client-side-libraries/5

相關問題