Django模板中simple_tag数组值的问题

pla*_*rsh 0 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}
Run Code Online (Sandbox Code Playgroud)

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

<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>
Run Code Online (Sandbox Code Playgroud)

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

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

Tim*_*ony 5

来自文档:

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

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

因此,您最好使用包含标记:

@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}
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

在原始模板中,您可以包含以下内容:

{% load pages_navigation %}
{% page_navigation %}
Run Code Online (Sandbox Code Playgroud)

它将调用模板标记,呈现它并将其插入到模板中