В шаблонном движке Django возможно ли запустить фильтр через весь массив? - PullRequest
0 голосов
/ 07 марта 2011

Например, если у меня есть массив объектов datetime.date, я бы хотел применить фильтр формата даты к каждому из его элементов, но при этом использовать строковое представление массива по умолчанию.

С учетом массива даты, который выглядит следующим образом:

[datetime.date(2011, 2, 28), datetime.date(2011, 3, 1), datetime.date(2011, 3, 2)]

Предполагая, что я уже передал его в контекст шаблона, я хотел бы сделать это в шаблоне:

<script>
    // ...
    var dates = {{ my_date_array|date:'b d, Y' }};
    // ...
</script>

так что выдает:

    var dates = ['Feb 28, 2011', 'Mar 1, 2011', 'Mar 2, 2011'];

.. вместо того, чтобы проходить через элементы массива.

Возможно ли это по умолчанию, без создания пользовательского фильтра?

1 Ответ

1 голос
/ 07 марта 2011

Глядя на источник , я бы сказал, что это невозможно при использовании фильтра date по умолчанию.

Вам придется либо использовать цикл в шаблоне, либо создатьПользовательский фильтр, который принимает список объектов даты.

Обновление:

Создать собственный фильтр с помощью существующего должно быть относительно легко.Например:

from django.template.defaultfilters import date
from django import template
register = template.Library()

# Only mildly tested. Use with caution.
def datelist(values, arg=None):
    try:
        outstr = "', '".join([date(v, arg) for v in values])
    except TypeError: # non-iterable?
        outstr = date(values, arg)
    return "['%s']" % outstr
register.filter('datelist', datelist)

Если вам не нравится этот подход для определения повторяющихся объектов, вы также можете использовать:

# requires Python >=2.4
from collections import Iterable

if isinstance(values, Iterable):
    # ....
...