Django 模板中 simple_tag 数组值的问题

Posted

技术标签:

【中文标题】Django 模板中 simple_tag 数组值的问题【英文标题】:Problems with simple_tag array values in Django Template 【发布时间】:2012-04-09 06:47:45 【问题描述】:

我正在尝试使用一个简单的标签将一个数组传递给我的模板。 我在 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 方法时,它运行良好..

有没有可能你不能从简单的标签方法返回数组?

【问题讨论】:

【参考方案1】:

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 %

它将调用模板标签,渲染它并将其插入到您的模板中

【讨论】:

thx,我很确定就是这样,我正在查看包含标签,但我只在模板中包含了加载标签,并认为这也已经包含了模板。我明天再试一次并发布结果【参考方案2】:

在新的 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 版本。

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

【讨论】:

以上是关于Django 模板中 simple_tag 数组值的问题的主要内容,如果未能解决你的问题,请参考以下文章

通过 simple_tag 向 Django 模板发送数据

自定义模板方法(类似django中的simple_tag) | Tornado

Django自定义simple_tag和filter

Django(模板语言-自定义filter和simple_tag)

Django(模板语言-自定义filter和simple_tag)

18)django-模板的过滤器和tag,自定义simple_tag和filter