Форматирование строк даты в Django в формат YYYY-MM-DD
Когда мы передаем объект date
в django view и рендерим в html, он выводится в следующем формате.
'Oct. 7, 2022', 'Sept. 9, 2022', 'Aug. 12, 2022', 'July 15, 2022', 'June 17, 2022', 'May 20, 2022', 'April 22, 2022', 'March 25, 2022', 'Feb. 25, 2022', 'Jan. 28, 2022', 'Dec. 31, 2021', 'Feb. 11, 2022', 'Nov. 5, 2021'
Вот пример того, как выглядит каждый месяц. Я хочу преобразовать его в формат YYYY-MM-DD
.
Я использую нижеприведенный подход, который является рабочей версией, но я ищу оптимизированный код для того же самого.
import re
import datetime
date_value = 'Sept. 9, 2022'
date_value = re.split("[., ]", date_value)
date_value[0] = date_value[0][:3]
date_value = ' '.join(date_value)
date_value = datetime.datetime.strptime(date_value, '%b %d %Y').strftime('%Y-%m-%d')
print(date_value)
>> 2022-09-09
Есть ли другой способ напрямую конвертировать его в этот формат?
Этот вопрос не о форматировании даты django как date_value |date:"Y-M-d"
на UI. Скорее я хочу сделать это в бэкенде на python.
Я не знаю, как выглядит ваш файл settings.py, но попробуйте установить параметры settings в
#settings.py
...
TIME_ZONE = 'UTC'
USE_TZ = True
У меня есть проект с этими настройками, и он отображает даты в шаблоне HTML, без дальнейшего форматирования (см. изображение).
Если вы хотите сделать это только для некоторых значений даты внутри представления, вы можете вызвать функцию 'isoformat()' из модуля datetime python. Посмотрите, как ее можно использовать для поля DateField в приведенном ниже коде.
models.py
class Article(models.Model):
title = models.CharField(max_length=50)
delivery_date = models.DateField()
...
views.py
def get_article_date(request):
article = Article.objects.get(id=1)
formatted_date = article.delivery_date.isoformat()
return render(request, 'template.html', {'date': formatted_date})
А если вы используете QuerySets и не только рендерите даты, вы можете написать пользовательский фильтр шаблона, который форматирует даты в шаблоне (см. код ниже)
views.py
def get_article_date(request):
articles = Article.objects.all()
return render(request, 'template.html', {'articles': articles})
template.html
{% load custom_filters %}
{% for article in articles %}
<p>{{ article.name }}, delivered on {{ article.delivery_date|format_date }}</p>
{% endfor %}
custom_filters.py
from django import template
register = template.Library()
@register.filter
def format_date(value):
return value.isoformat()