【问题标题】:Problems with simple_tag array values in Django TemplateDjango 模板中 simple_tag 数组值的问题
【发布时间】: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 方法时,它运行良好..

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

【问题讨论】:

    标签: django django-templates


    【解决方案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

    【讨论】:

      猜你喜欢
      • 2018-07-13
      • 2012-05-14
      • 1970-01-01
      • 2018-05-04
      • 1970-01-01
      • 1970-01-01
      • 2017-04-12
      • 2010-11-16
      相关资源
      最近更新 更多