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 数组值的问题的主要内容,如果未能解决你的问题,请参考以下文章
自定义模板方法(类似django中的simple_tag) | Tornado
Django(模板语言-自定义filter和simple_tag)