2016-05-23 100 views
1

我無法獲得顯示的inclusion_tag的內容。我沒有收到錯誤,所以我知道標籤正在註冊,我幾乎可以肯定它正在正確加載。標籤在crudapp/templatetags/crudapp_tags.py創建Django inclusion_tag內容不顯示

from django import template 
register = template.Library() 

@register.inclusion_tag("forum.html") 
def results(poll): 
    form = 'blah' 
    return {'form': form} 

模板/ forum.html

{% extends 'index.html' %} 
{% load crudapp_tags %} 
{% results poll %} 
<p>aaa</p> 
{% block homepage %} 
<p>bbb</p> <!-- Only this displays --> 
{% if form %} 
<p>Form exists</p> 
{% endif %} 
{% for item in form %} 
<p>This is {{ item }}</p> 
{% endfor %} 
<div> 
    <p>{% if user.is_authenticated %}Add a New Topic: <a href="{% url 'topic_form' %}"><span class="glyphicon glyphicon-plus"></span></a>{% endif %}</p> 
</div> 
<div> 
    <p>{{ totalposts.count }} posts, {{ totaltopics.count }} topics, {{ totalusers.count }} users, {{ totalviews.numviews}} views</p> 
</div> 
{% endblock %} 

設置文件如下,

enter image description here

+1

這裏的東西沒有意義;您的包含標籤正在呈現使用標籤本身的模板。 –

+0

另外'templates'目錄應該位於你的app目錄中,而不是項目的根目錄,除非你已經明確地告訴Django去看那裏。 – solarissmoke

+0

我認爲你誤解了包含標籤的作用。包含標籤呈現*另一個*模板。由於您在塊外部有'{%results poll%}',因此標記的結果將永遠不會顯示。也許你想要一個[作業標籤](https://docs.djangoproject.com/en/1.9/howto/custom-template-tags/#assignment-tags)代替(在Django 1.9中,你可以使用簡單的標籤而不是分配標籤)。 – Alasdair

回答

2

如果您正在使用包含標記,則標記呈現另一個模板。您需要將使用form的代碼從forum.html中移出並放入新的模板中。 results.html

results.html

{% if form %} 
<p>Form exists</p> 
{% endif %} 
{% for item in form %} 
<p>This is {{ item }}</p> 
{% endfor %} 

然後改變自己的代碼來

@register.inclusion_tag("results.html") 
def results(poll): 
    form = 'blah' 
    return {'form': form} 

最後使用這個模板,因爲你是延伸的模板,你需要移動,然後標記成塊,否則結果將不會被使用。

{% block homepage %} 
{% results poll %} 
... 
{% endblock %} 

如果你想將項目添加到模板的上下文,而不是渲染另一個模板,然後你想有一個simple tag來代替。

@register.simple_tag 
def fetch_result(): 
    result = ['foo', 'bar'] 
    return result 

然後在你的模板:

{% fetch_result as result %} 

{% for item in result %} 
<p>This is {{ item }}</p> 
{% endfor %} 

{% fetch_result as result %}作品在Django 1.9+簡單的標記。在早期版本中,您需要assignment tag

+0

當你說一個'item'時,你的意思只是一個字符串,或者可能仍然是查詢的結果,這是我希望以後的結果。但現在我只想簡化它並在模板中加入「blah」。 –

+0

如果您正在使用簡單標記,則結果可以是您喜歡的任何對象。你使用了一個字符串'blah',我把它改成了'['foo','blah']',因爲它在循環模板列表中更有意義。如果你願意,它可以是一個查詢集。 – Alasdair

+0

模板應該在應用程序crudapp的模板目錄中,即使我已經在settings.py中指定了模板是在問題中顯示的文件中設置的位置嗎? settings.py看起來像這樣,TEMPLATES = [ {BACKEND':'django.template.backends.django.DjangoTemplates', 'DIRS':[os.path.join(BASE_DIR,「templates」)] ,. ........... –