Я пытаюсь использовать преобразователи URL, встроенные в Django, для преобразования строки даты и времени в URL в объект даты в моих представлениях.
Они работают, как и ожидалось, если я ввожу URL вручную, ноПопытка создать URL для него не может найти соответствие.
Мои конвертеры просты:
from django.utils.timezone import datetime
from datetime import time
class DateConverter:
regex = '[0-9]{4}-[0-9]{2}-[0-9]{2}'
def to_python(self,value):
return datetime.strptime(value,"%Y-%m-%d")
def to_url(self,value):
return value.strftime("%Y-%m-%d")
class TimeConverter:
regex = '[0-9]{4}'
def to_python(self,value):
t = datetime.strptime(value,"%H%M")
return time(t.hour,t.minute)
def to_url(self,value):
return value.strftime("%H%M")
В моем шаблоне у меня есть несколько вложенных циклов, которые циклически переключаются через доступные временные интервалы, где я вызываю url
для каждой комбинации временных интервалов:
<a href="{% url 'club_boats:trip_booking' trip_date slot.slot.start_time slot.slot.end_time boat.boat.pk %}">Join</a>
Мой urls.py
файл:
from django.urls import path, register_converter
from . import converters, views
register_converter(converters.DateConverter, 'date')
register_converter(converters.TimeConverter,'time')
urlpatterns = [
path('<int:boat_id>',views.detail,name='detail'),
path('<date:trip_date>/',views.day_view,name='day_view'),
path('<date:trip_date>/<time:trip_start_time>/<time:trip_end_time>/<int:boat>/',views.trip_booking,name='trip_booking'),
path('', views.day_view, name='day_view')
]
Я подтвердил, что типы данных соответствуют ожидаемым (время, дата и т. Д.), Но обратное преобразование неКажется, что это не происходит.
Когда я пытаюсь загрузить шаблон, содержащий указанный выше url
вызов, я получаю ошибку NoReverseMatch:
Reverse for 'trip_booking' with arguments '(datetime.datetime(2019, 7, 1, 0, 0), datetime.time(9, 0), datetime.time(12, 30), 1)' not found. 1 pattern(s) tried: ['club_boats/(?P<trip_date>[0-9]{4}-[0-9]{2}-[0-9]{2})\\/(?P<trip_start_time>[0-9]{4})\\/(?P<trip_end_time>[0-9]{4})\\/(?P<boat>[0-9]+)\\/$']
Очевидно, что он видит шаблон, ночего-то не хватает.