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

  • 相关阅读:
    SQL Server系统表sysobjects介绍
    tofixed方法 四舍五入
    (function($){})(jQuery);
    DOS批处理命令-字符串操作
    IF ERRORLEVEL 和 IF %ERRORLEVEL% 区别
    Gpupdate命令详解
    DOS批处理中%cd%和%~dp0的区别
    SetACL 使用方法详细参数中文解析
    Lazarus 1.6 增加了新的窗体编辑器——Sparta_DockedFormEditor.ipk
    Lazarus 1.44升级到1.6 UTF8处理发生变化了
  • 原文地址:https://www.cnblogs.com/victorfengming/p/11930964.html
Copyright © 2011-2022 走看看