Страница не найдена (404) Ни одно бронирование не соответствует заданному запросу - веб-приложение Django
Мне трудно понять, в чем проблема. Я парсю slug в url, через мое представление, полученный из SlugField в моей модели. Для экземпляра объекта, который существует в моей базе данных, slug успешно анализируется в url. Однако я получаю приведенную выше ошибку и не могу понять, почему.
Соответствующей моделью является Booking, а поле slug выглядит следующим образом:
booking_reference = models.SlugField(verbose_name="Slug Field", blank=False, unique=True)
(я хотел использовать booking_reference в качестве поля slug).
Мой views.py выглядит следующим образом:
class EditBookingView(UpdateView, NextUrlMixin):
model = Booking
form_class = BookingForm
template_name = 'bookings/edit_booking.html'
success_url = '/'
default_next = '/'
def form_valid(self, form):
form.instance.user = self.request.user
form.save()
next_path = self.get_next_url()
return redirect(next_path)
def get_context_data(self, **kwargs):
context = super(EditBookingView, self).get_context_data(**kwargs)
context['slug'] = self.kwargs['booking_reference']
return context
def get_object(self):
slug = self.kwargs.get('booking_reference')
return get_object_or_404(Booking, booking_reference=slug)
А мои urls.py следующие:
from django.urls import path
from .views import (
CreateBookingView,
ViewBookingsView,
EditBookingView,
DeleteBookingView
)
app_name = 'bookings'
urlpatterns = [
path('createbooking/<str:slug>/', CreateBookingView.as_view(), name='create_booking'),
path('viewbookings/<str:slug>/', ViewBookingsView.as_view(), name='view_booking'),
path('editbooking/<str:slug>/', EditBookingView.as_view(), name='edit_booking'),
path('cancelbooking/<str:slug>/', DeleteBookingView.as_view(), name='delete_booking'),
]
Обратите внимание, у меня есть представление списка, для которого ссылка на бронирование успешно отображается под каждым экземпляром модели. Именно из этого представления я могу перейти в вышеупомянутое EditView со следующей строкой в шаблоне listview:
<div class="row text-center mt-3">
<a class="btn btn-primary justify-content-md-center mb-5" href='{% url "bookings:edit_booking" slug=item.booking_reference %}' role="button" >Edit Booking</a>
</div>
Как я уже сказал, я дважды проверил, действительно ли slug, парсируемый в мой url, присутствует в моей базе данных в поле "booking_reference" для экземпляра модели, и это так.
Любая помощь будет очень признательна!
Чтобы отследить проблему:
Вы получаете 404
В методе get_object_or_404 у вас есть get_object(), где вы ищете Booking на основе переменной 'slug'
Переменная slug устанавливается при запросе self.kwargs.get('booking_reference')
А kwarg 'booking_reference' установлен...?
В вашем файле URLs переменная имеет значение <str:slug>
. На самом деле, Django не знает о ней ничего другого по отношению к модели, пока она не будет использована каким-либо образом, например, для получения экземпляра.
Попытка get('booking_reference')
возвращает None. Модель знает, что такое booking_reference, но URL не обеспечивает эту связь. Отсюда 404.
Для исправления: нужно просто переключиться на
self.kwargs.get('slug')
(Вам также может понадобиться обновить get_context() аналогичным образом)