我正在尝试使用简单标记将数组传递给我的模板。 我在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方法时,它工作得很好..
是否有可能无法从简单标记方法返回数组?
答案 0 :(得分:5)
许多模板标签采用了许多参数 - 字符串或模板变量 - 并在进行一些处理后返回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