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博客共有。欢迎转载,但必须保留此段声明,且在文章页面明显位置给出原文连接!

原文地址:https://www.cnblogs.com/victorfengming/p/11930964.html