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. Это не проверено, это просто идея.

Вернуться на верх