В Django, как я могу перебрать результат пользовательского тега шаблона, который требует аргументов? - PullRequest
4 голосов
/ 16 марта 2009

Если я создал тег шаблона:

@register.simple_tag
def last_books(a_cat, cutoff=5):
    objects = Books.objects.filter(category=a_cat)
    return objects[:cutoff]

Как я могу сделать что-то подобное в моем шаблоне:

{% for book in last_books 'Sports' 3 %}

В настоящее время я получаю эту ошибку:

для операторов 'for' следует использовать формат 'для x в y': для x в last_books 'Sports' 3

Ответы [ 2 ]

7 голосов
/ 16 марта 2009

Лично я просто передал бы книгу как контекстную переменную через представление. Таким образом, вам не нужен тег шаблона.

Кроме того, вместо этого вы можете использовать декоратор include_tag, который оборачивает идею рендеринга включаемого шаблона с пользовательским контекстом в текущий документ.

Но если вы хотите продолжить работу по текущему пути, декоратор simple_tag не подходит. Это для использования, когда вам нужно вернуть string, который вы хотите визуализировать прямо в шаблон. То, что вы пытаетесь сделать, это установить переменную контекста шаблона. Это немного сложнее, но не слишком сложно. Создайте узел примерно так:

class LastBooksNode(template.Node):
    def __init__(self, category, cutoff=5, var_name='books'):
        self.category = category
        self.cutoff = cutoff
        self.var_name = var_name
    def render(self, context):
        context[self.var_name] = Books.objects.filter(category=self.category)[:self.cutoff]
        return ''

@register.tag(name='last_books')
def do_last_books(parser, token):
    error = False
    try:
        tag_name, category, cutoff, _as, var_name = token.split_contents()
        if _as != 'as':
            error = True
    except:
        error = True

    if error:
        raise TemplateSyntaxError, 'last_books must be of the form, "last_books <category> <cutoff> as <var_name>"'
    else:
        return LastBooksNode(a_cat, cutoff, var_name)

Затем вы бы вызвали тег шаблона с помощью:

{% import <your tag library> %}
{% last_books 'category' 5 as my_books %}
{% for book in my_books %}
    ....
{% endfor %}

Не проверено, но я надеюсь, что это демонстрирует идею. Однако, как уже упоминалось выше, передача книг непосредственно представлению через контекст или использование тега include_tag может быть проще, если вы не собираетесь использовать это в нескольких местах.

2 голосов
/ 16 марта 2009

Почему бы не с ?

...