我想将用户删除从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-->;<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')
并因此使用相同的";技巧";使用迷你表格。