Django inclusion_tag contents not displaying

三世轮回 提交于 2019-12-13 02:11:57

问题


I cannot get the contents of an inclusion_tag to display. I am not getting an errors so i know that the tag is registering and I am almost certain that it is loading correctly. The tag is created in crudapp/templatetags/crudapp_tags.py

from django import template
register = template.Library()

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

templates/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 %}

The file set up is as follows,


回答1:


If you are using an inclusion tag, then the tag renders another template. You need to move the code that uses form out of forum.html and into a new template, e.g. results.html

results.html

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

Then change your tag to use this template

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

Finally, since you are extending a template, you need to move then tag into a block, otherwise the result won't be used.

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

If you want to add an item to the template context instead of rendering another template, then you want a simple tag instead.

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

Then in your template:

{% fetch_result as result %}

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

The {% fetch_result as result %} works for simple tags in Django 1.9+. In earlier versions, you want an assignment tag.



来源:https://stackoverflow.com/questions/37390990/django-inclusion-tag-contents-not-displaying

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!