Страница не найдена (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() аналогичным образом)

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