Django: Диспетчер URL не преобразует поле DateField в '%Y-%m-%d'
Я новичок в Django и столкнулся с проблемой - не могу преобразовать строку в объект времени и обратно с помощью register_converter
.
У меня есть дата Jan 1, 2000 и мне нужно преобразовать ее в 2000-01-01. Я создал конвертер, зарегистрировал его, но в шаблоне я вижу дату как Jan 1, 2000.
Как я могу это исправить?
Это urls.py
:
from django.urls import path, register_converter
from datetime import datetime
class PubDateConverter:
regex = r'[0-9]{4}-[0-9]{2}-[0-9]{2}'
format = '%Y-%m-%d'
def to_python(self, value):
return datetime.strptime(value, self.format)
def to_url(self, value):
return value.strftime(self.format)
register_converter(PubDateConverter, 'date')
urlpatterns = [
path('books/<date:pub_date>/', book_view, name='book_view'),
]
Это models.py
:
class Book(models.Model):
name = models.CharField('Name', max_length=64)
author = models.CharField('Author', max_length=64)
pub_date = models.DateField('Pub_date')
def __str__(self):
return self.name + " " + self.author
Это views.py
:
def book_list(request):
return render(request, 'books/book_list.html', {'book_list': Book.objects.all()})
А в шаблоне я подставляю значение следующим образом:
{% for book in book_list %}
<p>Date: {{ book.pub_date }}</p>
{% endfor %}
Я использую Django версии Django==4.0.5
Конвертер регистрации действительно преобразует поле, но только в контексте url: https://docs.djangoproject.com/en/4.0/ref/urls/#register-converter
В ответ вы получаете оригинальные объекты book
(см. ответ в браузере). Вы можете изменить ответ, создав BookView
from django.views.generic import DetailView
class BookView(DetailView):
queryset = Book.objects.all()
def get_object(self):
obj = super().get_object()
obj.pub_date_str = obj.pub_date.strftime('%Y-%m-%d')
return obj
и затем верните его в паттерне:
path('books/<date:pub_date>/', BookView.as_view(), name='book_view')
PS. Это не проверено, это просто идея.