跳到主要内容

批量删除学生信息

上一节我们实现了删除一个学生信息的功能,但是如果要删除的学生信息较多,那么就需要使用批量删除来提升删除效率。本节我们就来实现批量删除功能。

我们先来看一下最终要实现的效果:

  1. 点击页面最上方的「全选」checkbox,能一次性把当前页所有学生都勾选上/取消勾选
  2. 勾选若干条记录后,点击「批量删除」按钮
  3. 弹出确认框 → 确认后批量删除选中的学生 → 删除成功后自动刷新页面

好,我们直接开始动手!

1.先来配置路由​

# 代码位置:students/urls.py
from django.urls import path
from .views import StudentBulkDeleteView

app_name = 'student'

urlpatterns = [
# ... 其他路由
path('bulk-delete/', StudentBulkDeleteView.as_view(), name='bulk_delete'),
]

**说明:**批量删除不需要获取学生id, 被选中的学生id可以从前端获取。

2.创建后端视图​

创建StudentBulkDeleteView,继承DeleteView父类。通常删除会使用POST方法,所以需要在StudentBulkDeleteView类中定义一个post()方法。代码如下:

# views.py
from django.views.generic import DeleteView
from django.http import JsonResponse
from django.contrib import messages
from .models import Student

class StudentBulkDeleteView(DeleteView):
model = Student
# 不需要指定 success_url,因为我们用 ajax 返回 json

def post(self, request, *args, **kwargs):
selected_ids = request.POST.getlist('student_ids')

if not selected_ids:
return JsonResponse({
'status': 'error',
'messages': '请选择要删除的学生'
}, status=400)

try:
# 筛选出要删除的对象(增加安全性:只删除本应用内的记录)
queryset = self.get_queryset().filter(id__in=selected_ids)
deleted_count = queryset.count()

queryset.delete()

return JsonResponse({
'status': 'success',
'messages': f'成功删除 {deleted_count} 条学生记录'
})

except Exception as e:
return JsonResponse({
'status': 'error',
'messages': f'删除失败:{str(e)}'
}, status=400)

【代码解析】

  1. 这里使用getlist(key) 方法专门用来获取可能有多个同名字段的值,并返回一个列表。

    如果表单中有多个 name 为 student_ids 的输入(通常是 checkbox),用户勾选了哪些,服务器就会收到哪些对应的 value 值。例如,[1,2,3]。

  2. self.get_queryset().filter(id__in=selected_ids) 只删除本应用内的记录。如果用户提交的学生id为[1,2,3], 而数据库中只有[1,3], 那么只删除id为1和3的记录。这是一种安全防御。

  3. queryset.count() 用与获取到的数量。

  4. queryset.delete() 调用django自身的删除方法。

3.在前端模板中准备好必要的元素​

确保你的学生列表表格(通常是 <table>)长这样:

<!-- student_list.html 片段 -->
<thead>
<tr>
<th><input type="checkbox" id="select-all"></th>
<th>学号</th>
<th>姓名</th>
<th>班级</th>
<!-- ...其他字段 -->
<th>操作</th>
</tr>
</thead>
<tbody>
{% for student in page_obj %}
<tr>
<td><input type="checkbox" name="student_ids" value="{{ student.id }}"></td>
<td>{{ student.student_id }}</td>
<td>{{ student.name }}</td>
<td>{{ student.class_name }}</td>
<!-- ... -->
<td><!-- 单个删除按钮等 --></td>
</tr>
{% endfor %}
</tbody>
🔒 试读结束

继续阅读完整内容

以上为免费预览。前往「Django + Vue 全栈课程」,查看后续完整讲解、案例演示和配套资料。

查看课程详情