Джанго велосипедные шаблоны - PullRequest
0 голосов
/ 25 ноября 2011

Мне нужно вывести объекты в шаблоне Django, чтобы у каждого объекта был свой шаблон. Шаблоны хранятся в переменной «шаблоны» следующим образом - ['path / to / template1', 'path / to / template2', ...]

Есть ли способ "зациклить" эти шаблоны в цикле объектов, как-то так:

{% for object in objects %}
   {% cycle templates as template %}
   {% include template %} // this code is just for example
{% endfor %}

Я не могу включить эти шаблоны непосредственно в список объектов, поскольку он генерируется тегом шаблона paginator.

Есть идеи? Спасибо.

Ответы [ 2 ]

1 голос
/ 26 ноября 2011

Я написал тег шаблона, который получает переменную списка и циклически повторяет ее.

from django import template
from django.template.base import TemplateSyntaxError, Node

from itertools import cycle as itertools_cycle

register = template.Library()

class CycleListNode(Node):
    def __init__(self, list_variable, template_variable):
        self.list_variable = list_variable
        self.template_variable = template_variable

    def render(self, context):
        if self not in context.render_context:
            # First time the node is rendered in template
            context.render_context[self] = itertools_cycle(context[self.list_variable])
        cycle_iter = context.render_context[self]
        value = cycle_iter.next()
        if self.template_variable:
            context[self.template_variable] = value
        return ''

@register.tag
def cycle_list(parser, token):
    args = token.split_contents()
    if len(args) != 4 or args[-2] != 'as':
        raise TemplateSyntaxError(u"Cycle_list tag should be in the format {% cycle_list list as variable %}")
    return CycleListNode(args[1], args[3])

Это довольно просто, но решает проблему.

0 голосов
/ 25 ноября 2011

вы можете создать тег шаблона, который будет делать то, что вы хотите с шаблонами, и он должен принимать путь (путь шаблона) в качестве аргумента, тогда все, что вам нужно сделать, это передать переменную пути шаблона пути, которая должнаконтекст, если вы используете контекст запроса для вашего пользовательского тега шаблона, например,

{% custom_tag path_to_template_dir %}
...