Django后台项目之用户管理功能开发流程
项目功能开发流程
1 先写列表页(加载出来数据就行)
ob = User_vip.objects.filter(is_del='004001').order_by('-cts')
2 写添加功能
2.1 创建addOrDoadd视图方法
2.2 添加访问addOrDoadd的路由
2.3 在index.html页面吧添加的按钮的链接不全
<a style="color:#fff;" href="{% url 'myadmin/user/add' %}">
<span class="am-icon-plus"></span>新增
</a>
2.4 构建视图逻辑
2.4.1 判断请求方法
如果是get就加载模板,如果是post就处理逻辑
2.4.2 处理逻辑
- 接受参数
(data = request.POST.dict())
- 删除
csrf(data.pop('csrfmiddlewaretoken'))
- 验证所有信息是否添加规范
- 验证添加的信息是否重复
- 抛异常,调用模型执行添加操作
- 保存操作
- 返回提示信息
3 写修改功能
3.1.创建editOrDoedit的视图函数
3.2 在子路由中添加访问editOrDoedit的路径
3.3 在index.html中修改的链接不全
3.4 把add.html复制一份名称修改成edit.html
3.5 构建视图逻辑
3.5.1 判断请求方法
- 如果为get就加载模板
- 如果为post就处理数据
- 根据传过来id查询信息
- 发送至模板,展示在html的表单中
3.5.2 处理逻辑
- 接收参数
- 接受id
- 删除csrf
- 验证所有信息
- 验证修改是否重复(注意:要去除自身)
num = User_vip.objects.filter(nick_name=data['nick_name'],\
is_del="004001").exclude(id=data['uid']).count()
- 构建修改数据
- 抛异常,实例化对象
- 保存操作
- 返回提示信息
4 写删除
4.1 修改index.html的删除按钮的路径
4.2 创建user_del的视图函数
4.3 创建可以访问user_del的路径
4.4 构建视图函数的逻辑
- 接受参数
- 构建修改数据
- 抛异常,实例化对象
- 保存操作
- 返回提示信息
5 完善index.html当中表格中的select修改状态(使用ajax技术)
5.1 给select添加class=“sel_status"和uid=”{{ v.id }}"
5.2 在本页面代码的最后一个{% endblock %}之前构建js程序
<script></script>
5.3 在script标签中构建select的change(下拉框改变事件)事件,并且获取到状态的值和
id{
$(.sel_status).change(function(){
// 获取状态的值
var status = $(this).val()
// 获取id
var uid = $(this).attr('uid')
})
}
5.4 在change事件中构建ajax请求
// 构建ajax
$.get('{% url 'myadmin/user/edit_status' %}',{'uid':uid,'status':status},function(data){
},'json')1
5.5 构建视图函数逻辑
- 引入JsonResponse方法
- 接受ajax传过来的参数
- 实例化对象
- 构建修改数据
- 抛异常,保存操作
- 返回提示信息
return JsonResponse({'msg':'修改成功!'})
5.6 在第4步中的ajax请求的function函数中弹出返回的信息
alert(data.msg)
6 完善index.html中的组合搜索
6.1 修改select和input提交的名称
<select data-am-selected="{btnSize: 'sm'}" style="display: none;" name="type">
<input type="text" class="am-form-field " placeholder="可以组合搜索" name="keywords">
- 把button按钮中的
type="button"
删掉 - 在第1步,和第2步的最外面添加form表单,并且提交地址为myadmin/user/list
<form action="{% url 'myadmin/user/list' %}"></form>
6.2 在index的视图函数(整个开发步骤的第一步)中完善逻辑
# 接受查询的参数
user_type = request.GET.get('type',None)
keywords = request.GET.get('keywords',None)
# 导入Q方法
from django.db.models import Q
if user_type:
if user_type == 'all':
if keywords:
# SELECT * FROM User_vip WHERE LIKE (nick_name '%keywords%',age '%keywords%')
ob = ob.filter(
Q(nick_name__contains=keywords)|
Q(age__contains=keywords)|
Q(sex__contains=keywords)|
Q(email__contains=keywords)|
Q(phone__contains=keywords)|
Q(intergral__contains=keywords)|
Q(status__contains=keywords)|
Q(price__contains=keywords))
else:
search = {user_type+'__contains':keywords}
ob = ob.filter(**search)
6.3 在本功能的第一步中完善默认值
完善index视图函数,把type和keywords传递到模板中
<select data-am-selected="{btnSize: 'sm'}" style="display: none;" name="type">
<option value="all" {% if type == 'all' %}selected{% endif %}>所有类别</option>
<option value="nick_name" {% if type == 'nick_name' %}selected{% endif %}>昵称</option>
<option value="age" {% if type == 'age' %}selected{% endif %}>年龄</option>
<option value="sex" {% if type == 'sex' %}selected{% endif %}>性别</option>
<option value="email" {% if type == 'email' %}selected{% endif %}>邮箱</option>
<option value="phone" {% if type == 'phone' %}selected{% endif %}>电话</option>
<option value="intergral" {% if type == 'intergral' %}selected{% endif %}>积分</option>
<option value="status" {% if type == 'status' %}selected{% endif %}>状态</option>
<option value="price" {% if type == 'price' %}selected{% endif %}>资产</option>
</select>
<input type="text" class="am-form-field " placeholder="可以组合搜索" name="keywords" {% if keywords %}value="{{ keywords }}"{% endif %}>
注:以上if中间的内容为补全内容
7 完善优化分页
7.1 在views文件夹的同级目录中创建templatetags的文件夹(文件夹名称只能是templatetags)
7.2 在templatetags文件夹中创建pagetag.py
7.3 填写pagetag.py中的内容
from django import template
from django.utils.html import format_html
register = template.Library()
@register.simple_tag
# 定义分页优化的函数
def PageShow(count,request):
# count 是总页数
# request 请求对象
# count = int(count)
# p接收当前的页码数
p = int(request.GET.get('page',1))
# 获取url中的所有参数
data = request.GET.dict()
print(count,type(count))
args = ''
for k,v in data.items():
if k != 'page':
args += '&'+k+'='+v
# 开始
start = p-5
# 结束
end = p+4
# 判断当前页是否小于5
if p <= 5:
start = 1
end = 10
# 判断当前页大于总页数
if p > count-5:
start = count-5
end = count
# 判断总页数小于10
if count < 10:
start = 1
end = count
pageHtml = ''
# 首页
pageHtml += '<li><a href="?page=1{args}">首页</a></li>'.format(args=args)
# 上一页
if p>1:
pageHtml += '<li><a href="?page={p}{args}">上一页</a></li>'.format(p=p-1,args=args)
for x in range(start,end+1):
if p == x:
pageHtml += '<li class="am-active"><a href="?page={p}{args}">{p}</a></li>'.format(p=x,args=args)
else:
pageHtml += '<li><a href="?page={p}{args}">{p}</a></li>'.format(p=x,args=args)
# 下一页
if p<count:
pageHtml += '<li><a href="?page={p}{args}">下一页</a></li>'.format(p=p+1,args=args)
# 尾页
pageHtml += '<li><a href="?page={p}{args}">尾页</a></li>'.format(p=count,args=args)
return format_html(pageHtml)
7.4 在index的视图函数(整个开发步骤的第一步)中完善逻辑
# 导入分页类
from django.core.paginator import Paginator
# 实例化分页类
p = Paginator(ob,5)
# 获取当前的页码数
pageindex = request.GET.get('page',1)
# 获取当前页的数据
userlist = p.page(pageindex)
# 获取所有页码
# pages = p.page_range
# 获取总页数
pages = p.num_pages
7.5 把第4步pages传递到模板中
7.6 修改index.html页面中的分页内容
{% load pagetag %}
{% PageShow page request %}
作者:秋叶夏风
出处:https://blog.csdn.net/qq_40223983
本文版权归作者和CSDN博客共有。欢迎转载,但必须保留此段声明,且在文章页面明显位置给出原文连接!