Проблемы со значениями массива simple_tag в шаблоне Django - PullRequest
0 голосов
/ 25 марта 2012

Я пытаюсь передать массив в мой шаблон с простым тегом. Я создал свой модуль в 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>

Однако почему-то кажется, что ссылки всегда пусты. Когда я попробовал метод pages_navigation в оболочке python, он работал нормально ..

Возможно ли, что вы не можете вернуть массивы из простых методов тегов?

Ответы [ 2 ]

5 голосов
/ 25 марта 2012

Из документов :

Многие теги шаблонов принимают ряд аргументов - строк или переменных шаблона - и возвращают 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}

и создание файла 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 %}

, который вызовет тег шаблона, отобразит его и вставит в ваш шаблон

4 голосов
/ 25 марта 2012

В новом 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...