Предобработка данных из базы данных, перед их выводом в HTML шаблон Django

Всем привет!


В моем проекте есть необходимость вывода всех записей из таблицы в БД на страничку. Этот кейс закрыть легко, но проблема в том, что в записи присутсвует дата, которую нужно выводить в формате дд-мм-гггг, а не гггг-мм-дд.


Окей, написать функцию, которая это все обработает - легко, но каким образом это дело передать в context? Просто изначально я туда передаю все записи нужной мне таблицы:

records = IpcArchive.objects.all()
context = {
    "all_records": records,
}

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


Подскажите, пожалуйста, как можно решить данную проблему... Есть идея, чтобы сразу через view рендерить HTML шаблон, но не будет ли это костыльно?


Ответы (1 шт):

Автор решения: Chillie

Во-первых, как указал @rpe4ka722, в settings есть настройка DATE_FORMAT (и ее datetime-товарищ DATETIME_FORMAT, которая задает формат дат во всей системе.

Синтаксис указан в документации.

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

Таким образом, в нашем шаблоне это может выглядеть так:

{% for item in all_records %} 
    {{item.somedate|date:"%d-%m-%Y"}}
{% endfor %}

Если функционала встроенных фильтров вам не хватит, можно легко создать свои фильтры.

Ну и в третьих, вы можете создать собственный list или другую структуру, в которую положите нужные обработанные данные:

records = IpcArchive.objects.all()
modified_records = []
for rec in records:
    new_record = ... # тут мы что-то считаем или преобразуем и т.д.
    modified_records.append(new_record)
context = {
    "all_records": modified_records,
}

Еще один доступный путь - через аннотации и агрегацию, но это скорее о преобразовании query, чем о том, что вам нужно.

Как видите, доступных способов много, можно выбирать то, что больше подходит и удобно вам.

→ Ссылка