Django模板中simple_tag数组值的问题

时间:2012-03-25 14:01:17

标签: django django-templates

我正在尝试使用简单标记将数组传递给我的模板。 我在app / templatetags / pages_navigation.py下创建了我的模块,在我看来代码应该没问题:

from django import template
from pages.models import Page

register = template.Library()

@register.simple_tag(name='links')
def pages_navigation():
  pages = Page.objects.all()
  links = [['Events','/']]

  for page in pages:
    links.append([page.title, '/'+page.url])

  return {'links':links}

在我的模板中,我尝试访问这样的链接:

<ul>
{% if links %}
  {% for link in links %}
    <a href="{{link.1}}"><li>{{link.0}}</li></a>
  {% endfor %}
{% else %}
  <li>no pages found</li>
{% endif%}
</ul>

然而,不知何故,似乎链接总是空的。 当我在python shell中尝试pages_navigation方法时,它工作得很好..

是否有可能无法从简单标记方法返回数组?

2 个答案:

答案 0 :(得分:5)

From the docs

  

许多模板标签采用了许多参数 - 字符串或模板变量 - 并在进行一些处理后返回page_navigation

simple tags用于打印一条信息,而不是将某些结果分配给变量(在您的情况下为列表)

因此,您最好使用inclusion tag

@register.inclusion_tag('links.html')
def page_navigation(a, b, *args, **kwargs):
    pages = Page.objects.all()
    links = [['Events','/']]
    for page in pages:
        links.append([page.title, '/'+page.url])
    return {'links':links}

并在模板目录中创建links.html文件:

<ul>
{% if links %}
    {% for link in links %}
    <a href="{{link.1}}"><li>{{link.0}}</li></a>
    {% endfor %}
{% else %}
    <li>no pages found</li>
{% endif%}
</ul>

并在原始模板中包含以下内容:

{% load pages_navigation %}
{% page_navigation %}

将调用模板标记,渲染并将其插入模板

答案 1 :(得分:4)

在新的Django 1.4中,您可以使用分配标签https://docs.djangoproject.com/en/dev/howto/custom-template-tags/#howto-custom-template-tags-assignment-tags

from django import template

register = template.Library()

@register.assignment_tag
def get_links():
    return (('Events', '/'),) + tuple((p.title, '/'+p.url) for p in Page.objects.all())

{# in template #}
{% get_links as links %}

如果您愿意,可以将它移植到您的Django版本。

此外,如果您的网页网址类似于/?page = 2,则可以尝试使用django-pagination http://pypi.python.org/pypi/django-pagination