Django DeleteView未进行删除



我想将用户删除从FBV转换为CBV

我的FBV

def delete_student(request, pk):
student = get_object_or_404(Student, pk=pk)
student.delete()
return HttpResponseRedirect(reverse("students:get_students"))

我的CBV

class DeleteStudentView(DeleteView):
model = Student
form_class = StudentForm
template_name = "students/students_list.html"
success_url = reverse_lazy("students:get_students")

student_list.html

<td><a type="button" class="btn btn-danger"
href="{% url 'students:delete_student' student.pk %}">Delete</a>
</td>

没有错误,但没有发生任何选择。可能是什么问题?

DeleteView通过POST或DELETE请求删除。根据HTTP协议的规范,这是强制性的。您的FBV不符合HTTP。

因此,您需要制作一个迷你表格来完成此操作。例如,使用以下内容制作隐藏表单:

<td>lt;按钮类=";btn-btn危险";onclick=">delete_item({{student.pk}}(">删除<按钮>lt/td><!--&hellip--&gt;<form方法=";张贴";动作=";{%url'学生:delete_student'%}"id=";delete_form"gt;{%csrf_token%}<输入类型=";隐藏的";name=";pk";id=";delete_pk"><表单><脚本>函数delete_item(pk({var hidden_item=document.getElementById("delete_pk"(;hidden_item.value=pk;var form=document.getElementById("delete_form"(;form.submit((;}<脚本>

urls.py中,我们为不带参数的StudentDeleteView定义了一个条目:

# students/urls.py
from django.urls import path
app_name = 'students'
urlpatterns = [
# …
path('student/delete/', StudentDeleteView.as_view(), 'delete_student'),
# …
]

DeleteView中,然后使用主键确定对象:

from django.shortcuts import get_object_or_404

class DeleteStudentView(DeleteView):
model = Student
success_url = reverse_lazy('students:get_students')
defget_object(self, *args, **kwargs):
return get_object_or_404(Student,pk=self.request.POST.get('pk'))

为了使基于函数的视图符合HTTP,您应该强制它只能通过POST或DELETE请求来实现,例如使用@require_http_methods(…)装饰器[Django-doc]:

from django.shortcuts import get_object_or_404, redirect
from django.views.decorators.http import require_http_methods

@require_http_methods(["DELETE", "POST"])
def delete_student(request):
student = get_object_or_404(Student, pk=request.POST.get('pk'))
student.delete()
return redirect('students:get_students')

并因此使用相同的";技巧";使用迷你表格。

最新更新