Почему теги шаблона localize и USE_L10N иногда дают разные результаты?

Согласно Django docs, тег шаблона localize позволяет более тонко контролировать локализацию в шаблонах, чем общая настройка USE_L10N = True.

Однако включение локализации не всегда приводит к такому же результату, как установка USE_L10N = True.

Например,

# USE_L10N = True in settings.py

{% load l10n %}
{{some_datetime_value|date}}

# Date is shown and localized

vs

# USE_L10N = False in settings.py

{% load l10n %}
{% localize on %}
{{some_datetime_value|date}}
{% endlocalize %}

# Date is shown and NOT localized

Почему эти два результата отличаются? И есть ли способ заставить тег localize правильно локализовать в этих случаях?

Как отметил в комментариях Брайан Дестура, это похоже на ошибку Django.

Преобразование объекта datetime в объект date перед передачей его в шаблон может сработать для одного объекта, но будет очень неудобно, если вам придется обращаться к полям модели, которые хранятся в формате datetime (например, в циклах for).

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

custom_tags.py

@register.filter
def get_date(value):
    return value.date()

template.html

{% load i10n %}
{% load custom_tags %}

{% localize on %}
{{some_datetime_value|get_date}}
{% endlocalize %}

#localizes the format correctly
Вернуться на верх