ajax结合sweetalert实现删除操作的二次确认
修改网页上某个标签的样式
f12-->inspect-->Styles-->background-color
f12-->inspect-->div.sweet-alert.showSweetAlert
报错: Forbidden (CSRF token missing or incorrect.): /
解决: settings.py-->MIDDLEWARE-->注释掉'django.middleware.csrf.CsrfViewMiddleware',
def home(request):
import time
if request.is_ajax():
time.sleep(2) # 模拟两秒延迟
back_dic = {'code': 1000, 'msg': ''}
delete_id = request.POST.get('delete_id')
models.User.objects.filter(pk=delete_id).delete()
back_dic['msg'] = '数据已经删除'
# 通常后端会将ajax请求数据的处理结果以字典形式返回,
# JsonResponse会自动将后端的字典转换成前端的object类型数据
return JsonResponse(back_dic)
user_queryset = models.User.objects.all()
return render(request, 'home.html', locals())
'''
<style>
div.sweet-alert.showSweetAlert { # 标签选择器 + 类选择器修改背景色
background-color: yellow;
}
div.sweet-alert.showSweetAlert h2 { # 标签选择器 + 类选择器 + 后代选择器修改内边距
padding: 25px;
}
</style>
<td>{{ user_obj.get_gender_display }}</td> # 函数自动加括号调用
<a href="#" class="btn btn-primary btn-sm">编辑</a> # 加#使页面不会一直刷新
<a href="#" class="btn btn-danger btn-sm cancel" user_id="{{ user_obj.pk }}">删除</a>
# 不能使用id标识标签, for循环会出现多个重复标签 # 自定义user_id属性标识要删除的数据的主键id
<script>
$('.cancel').on(
'click',
function () {
var $btn = $(this); // 指代当前被点击的a标签
swal({
...
showLoaderOnConfirm: true, // 网络延迟等待动画效果
},
function (isConfirm) {
if (isConfirm) { // 在弹出已经删除框前发送删除数据的ajax请求
$.ajax({
url: '',
type: 'post',
data: {'delete_id': $btn.attr('user_id')},
success: function (data) {
if (data.code == 1000) {
swal('准备跑路吧!', '已经删了', 'success');
$btn.parent().parent().remove(); // 通过DOM操作在页面不刷新情况下直接删除数据行标签
}
...
}
)
</script>
</body>
'''
bulk_create快速批量插入数据
def insert(request):
book_list = []
for i in range(1000):
book_obj = models.Book(title='第%s本书' % (i,)) # 先生成book对象并添加到book列表
book_list.append(book_obj)
models.Book.objects.bulk_create(book_list) # 批量插入数据
简易版分页器推导
def insert(request):
all_count = models.Book.objects.count() # 总的数据数
per_page_num = 10 # 每页展示的数据量
page_amount, data_remaining = divmod(all_count, per_page_num) # 总页数向下取整, 数据分页后剩余数据量
if data_remaining:
page_amount += 1 # 如果分页后有剩余数据, 分页数+1
current_page = int(request.GET.get('page', 1)) # 起始页, 默认为1
html = '' # 记录分页器展示的页码
temp = current_page # 临时变量处理分页器左边界展示
if temp <= 5:
temp = 5
for i in range(temp - 5, temp + 5):
# 将用户点选的页码高亮显示
if i + 1 == current_page:
html += '<li class="active"><a href="?page=%s">%s</a></li>"' % (i + 1, i + 1,)
# 每次以用户点选也为中心展示10页
else:
html += '<li><a href="?page=%s">%s</a></li>"' % (i + 1, i + 1,)
stat_data_index = (current_page - 1) * per_page_num # 每页的起始数据的索引值
end_data_index = current_page * per_page_num # 每页的结束数据的索引值
show_book_queryset = models.Book.objects.all()[stat_data_index:end_data_index] # 展示用户想获取的页码中的数据
return render(request, 'insert.html', locals())
'''
...
{% for book_obj in show_book_queryset %}
<p>{{ book_obj }}</p>
{% endfor %}
...
... # 分页器开始
</li>
{{ html|safe }} # 前端取消转义
...
'''
自定义分页器的使用
一般创建utils文件夹存放第三方组件
django内置的分页模块不好用
queryset支持切片操作
def insert(request):
all_count = models.Book.objects.count() # 总的数据数
current_page = int(request.GET.get('page', 1)) # 当前页
queryset = models.Book.objects.all()
page_obj = Pagination(current_page, all_count, 10, 10)
page_data = queryset[page_obj.start: page_obj.end]
return render(request, 'insert.html', locals())
'''
class Pagination(object):
def __init__(self, current_page, all_count, per_page_num=10, pager_count=10):
"""
封装分页相关数据
:param current_page: 当前页
:param all_count: 数据库中的数据总条数
:param per_page_num: 每页显示的数据条数
:param pager_count: 分页器显示的页码数量
用法:
queryset = model.tableName.objects.all()
page_obj = Pagination(current_page, all_count, per_page_num=10, pager_count=10)
page_data = queryset[page_obj.start:page_obj.end]
前端获取每页展示的数据用page_data
前端使用分页器及其显示的页码数量用page_obj.page_html
...
'''