Django не перенаправляет на страницу подтверждения при удалении

Django не перенаправляет на страницу подтверждения при удалении.

Привет всем,

Я сделал стандартный CRUD на таблице, которая является внешним ключом для другой таблицы. Я использую класс представления Django. Create, Read и Update работают, но у меня есть ошибка с Delete. Когда я удаляю один элемент, я перенаправляюсь на детальную страницу (страницу чтения) с хорошим адресом удаления ('localhost/table_name/pk/delete').
. Я следую стандартному способу, описанному в Django Project и в нескольких учебниках.

Следующая часть моего кода:

model.py :

class Badge(models.Model):
    id_badge = models.AutoField(primary_key=True)
    title = models.CharField(max_length=100)
    category = models.CharField(max_length=60)
    level = models.IntegerField()
    image_badge = models.ImageField(upload_to='badge_image/', null=True, blank=True, default='ex-par-nat_logo.png')

    class Meta:
        managed = True
        db_table = 'badge'

view.py:

from django.shortcuts import redirect, render
from UsersApp.tribut_sign_up_form import TributSignUpForm
from UsersApp.tutor_sign_up_form import TutorSignUpForm
from UsersApp.child_sign_up_form import ChildSignUpForm
from django.contrib.auth import authenticate, login
from django.contrib.auth import logout as account_logout
from UsersApp.models import Tribut, Tutor, Child, Account
from django.http import HttpResponse
from django.contrib.auth.decorators import login_required
from UsersApp.decorator import tribut_required

@method_decorator([login_required, author_required], name='dispatch')
class BadgeListView(ListView):
    model = Badge
    ordering = ('title', )
    template_name = 'ArticlesApp/badge_list.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        return context

    def get_queryset(self):
        queryset = Badge.objects.all()
        return queryset

@method_decorator([login_required, author_required], name='dispatch')
class BadgeCreateView(CreateView):
    model = Badge
    # form_class = ArticleCreationForm
    fields = ('title', 'category', 'level', 'image_badge')
    template_name = 'ArticlesApp/badge_create.html'

    def get_context_data(self, **kwargs):
        return super().get_context_data(**kwargs)

    def form_valid(self, form):
        form.save()
        return redirect('badge_list')

@method_decorator([login_required], name='dispatch')
class BadgeReadView(DetailView):
    model = Badge
    template_name = 'ArticlesApp/badge_read.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        return context

@method_decorator([login_required, author_required], name='dispatch')
class BadgeUpdateView(UpdateView):
    model = Badge
    fields = ['title', 'category', 'level', 'image_badge']
    template_name = 'ArticlesApp/badge_update.html'

    def get_success_url(self):
        view_name = 'badge_list'
        return reverse_lazy(view_name)

@method_decorator([login_required, author_required], name='dispatch')
class BadgeDeleteView(DeleteView):
    model = Badge
    success_url = reverse_lazy('badge_list')

url.py:

from django.conf import settings
from django.conf.urls.static import static
from django.urls import path, include
from ArticlesApp import views as article_views

urlpatterns = [
    path('badge/', article_views.BadgeListView.as_view(), name='badge_list'),
    path('badge/add/', article_views.BadgeCreateView.as_view(), name='badge_create'),
    path('badge/<int:pk>/<slug:slug>/', article_views.BadgeReadView.as_view(), name='badge_read'),
    path('badge/<int:pk>/', article_views.BadgeUpdateView.as_view(), name='badge_update'),
    path('badge/<int:pk>/delete/',
         article_views.BadgeDeleteView.as_view(
             template_name='ArticlesApp/badge_confirm_delete.html'),
         name='badge_confirm_delete'),
]
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

badge_confirm_delete.html:

{% extends "base_user.html" %}
{% block content %}
<form method="post">{% csrf_token %}
    <p>Are you sure you want to delete "{{ object }}"?</p>
    <input type="submit" value="Confirm">
</form>
{% endblock %}

Большое спасибо за помощь, Себастьен

Django перебирает шаблоны url в порядке их определения и возвращает первый, который соответствует входящему пути.

Путь "badge/1/delete/" соответствует url "badge_read", поскольку это первый url, который соответствует ("delete" является допустимым slug).

Переместите url "badge_confirm_delete" перед url "badge_read", чтобы он совпадал первым

urlpatterns = [
    path('badge/', article_views.BadgeListView.as_view(), name='badge_list'),
    path('badge/add/', article_views.BadgeCreateView.as_view(), name='badge_create'),
    path('badge/<int:pk>/delete/',
         article_views.BadgeDeleteView.as_view(
             template_name='ArticlesApp/badge_confirm_delete.html'),
         name='badge_confirm_delete'),
    path('badge/<int:pk>/<slug:slug>/', article_views.BadgeReadView.as_view(), name='badge_read'),
    path('badge/<int:pk>/', article_views.BadgeUpdateView.as_view(), name='badge_update'),
]

Теперь это означает, что "delete" не может быть использован в качестве slug, если это проблема, вы можете изменить части пути так, чтобы действие было на первом месте, например "badge/delete/int:pk/"

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