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() // 获取idvar 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 Qif 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 templatefrom django.utils.html import format_htmlregister = 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# 判断当前页是否小于5if p <= 5:start = 1end = 10# 判断当前页大于总页数if p > count-5:start = count-5end = count# 判断总页数小于10if count < 10:start = 1end = countpageHtml = ''# 首页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博客共有。欢迎转载,但必须保留此段声明,且在文章页面明显位置给出原文连接!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/455627.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

套接字 资料查阅

(3)套接字(socket) 一个完整的网络应用程序包括客户端和服务器两个部分。网间通信进程需要由两个进程组成&#xff0c;并且只能用同一种协议。也就是说&#xff0c;不能在通信的一端使用TCP协议&#xff0c;而另一端则用UDP协议。一个完整的网络通信需要一个五元组来标识…

linux mysql安装_Linux下安装mysql服务(超详细)

Mysql数据库的安装对于开发者来说&#xff0c;是我们必然会面对的问题&#xff0c;它的安装过程其实并不复杂&#xff0c;并且网络上的安装教程也非常多&#xff0c;但是对于新手来说&#xff0c;各种不同形式的安装教程&#xff0c;又给新手们带来了要选择哪种方式进行安装的难…

dash 和 bash 切换

#先看看是用的哪个 shellls -al /bin/sh #如果是dash&#xff0c;切换到bashsudo ln -fs /bin/bash /bin/sh转载于:https://www.cnblogs.com/abolide/p/6874265.html

Django中使用ajax技术概述

ajax 1.什么是ajax ajax就是在不刷新整个页面的情况下&#xff0c;去更新局部页面的内容&#xff08;无刷新技术&#xff09; 2.ajax有什么优点 最大的一点是页面无刷新&#xff0c;在页面内与服务器通信&#xff0c;给用户的体验非常好。 使用异步方式与服务器通信&#x…

IE、FF脚本兼容性问题

1.window.event IE有这个对象&#xff1b;FF没有&#xff0c;FF通过参数传递 2.获取事件源 IE&#xff1a;srcElement FF&#xff1a;target 3.添加与去除事件 IE&#xff1a;element.attachEvent("onclick", function(){}) element.detachEvent("onclick"…

ARM MOV和 LDR指令关系

ARM是RISC结构&#xff0c;数据从内存到CPU之间的移动只能通过L/S指令来完成&#xff0c;也就是ldr/str指令。比如想把数据从内存中某处读取到寄存器中&#xff0c;只能使用ldr比如&#xff1a;ldr r0, 0x12345678就是把0x12345678这个地址中的值存放到r0中。而mov不能干这个活…

day2 操作系统

一.为何要有操作系统 程序员无法把所有的硬件操作细节都了解到&#xff0c;管理这些硬件并且加以优化使用是非常繁琐的工作&#xff0c;这个繁琐的工作就是操作系统来干的&#xff0c;有了他&#xff0c;程序员就从这些繁琐的工作中解脱了出来&#xff0c;只需要考虑自己的应用…

Django之model模型

模型 1.如何安装pymysql 1.file->settings->Project Interpreter 2.点击右边的"" 3.搜索pymysql 4.点击最下面的"install package" 5.安装成功会提示"Package "pymysql" install successfully"2.如何在django中配置mysql 1.在…

python安装不了jupyter_python学习笔记——Windowns下Python3之安装jupyter

Windowns下Python3之安装jupyter Jupyter notebook&#xff1a; 一个交互式笔记本&#xff0c;支持运行40多种编程语言。 利用它来写Python&#xff0c;代码和运行结果都可以保存下载&#xff0c;十分方便。本文主要以自身的安装过程为例&#xff0c;结合遇到的问题&#xff0c…

Java文件读写操作

http://blog.csdn.net/jiangxinyu/article/details/7885518/ 比较齐全&#xff0c;有多种文件读写操作转载于:https://www.cnblogs.com/maowuyu-xb/p/7238170.html

视频编码与封装方式详解

1. 编码方式和封装格式... 1 2. 视频编码标准两大系统... 2 MPEG-1. 2 MPEG-2. 3 MPEG-3. 3 MPEG-4. 3 ITU-T. 4 WMV. 4 3. 常用视频编码方式有Xvid( 4 4. 常见存储封装格式... 6 5. 几种常见的转换格式设置... 7 6. 无损视频编码... 9 1. 编码方式和封装格式常见…

Binder

问&#xff1a;为什么Android要采用Binder作为IPC机制 答案来自百度知道&#xff1a; &#xff08;1&#xff09;从性能的角度数据拷贝次数&#xff1a;Binder数据拷贝只需要一次&#xff0c;而管道、消息队列、Socket都需要2次&#xff0c;但共享内存方式一次内存拷贝都不需要…

matlab 三维核密度图_Matlab精彩画图示例:三维网状图和三维曲面图

接上篇&#xff1a;Matlab精彩画图示例&#xff1a;绘制图上图这篇介绍两个绘制三维图的命令&#xff1a;mesh - 绘制三维网状图surf - 绘制三维曲面图matlab代码如下&#xff1a;绘制三维图的matlab代码示例程序运行结果如下&#xff1a;mesh(X,Y,Z) draws a wireframe mesh w…

Django之templates模板

模板的使用 1.如何使用模板 在manage.py的同级文件夹中创建templates在setting.py的文件中把第58行DIRS: [ ],改成DIRS: [os.path.join(BASE_DIR,templates)], 知识点: os.path.join(BASE_DIR,templates) 拼接两个字符串 BASE_DIR找到项目根目录127.0.0.1:8000/myadmin/templ…

STL容器删除元素的陷阱

今天看Scott Meyers大师的stl的用法&#xff0c;看到了我前段时间犯的一个错误&#xff0c;发现我写的代码和他提到错误代码几乎一模一样&#xff0c;有关stl容器删除元素的问题&#xff0c;错误的代码如下&#xff1a;std::vector<struct> mFriendList;...std::vector&l…

JDBC1

1.jdbc的概述 是sun公司统一提供的一套接口规范,各个数据库生产商提供实现 注册驱动,获得连接,获得执行的SQL语句对象,释放资源 package com.learn.jdbc;import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException;import org.junit.Test;publ…

无符号哥伦布指数编码

在H264编解码中&#xff0c;哥伦布指数编码是经常用到的&#xff0c;下面是无符号哥伦布指数编码的C代码&#xff1a; static inline int bs_read_ue( bs_t *s ){ int i 0; while( bs_read1( s ) 0 && s->p < s->p_end && i < 32 ) { …

django后台多页面分页逻辑python代码

#!/usr/bin/env python # -*- coding:utf-8 -*- # Created by 秋叶夏风# 本模块的功能:<>def get_page_list(max_page,curr_page,leng):用于生成页数列表:param max_page:最大页数:param curr_page:当前页数:param leng:分页步长:return:list# max_page 20# curr_page …

python程序怎么保存到u盘_python实现usb自动拷贝程序的方法

python实现usb自动拷贝程序的方法 发布时间&#xff1a;2020-06-28 09:07:05 来源&#xff1a;亿速云 阅读&#xff1a;135 作者&#xff1a;清晨 这篇文章将为大家详细讲解有关python实现usb自动拷贝程序的方法&#xff0c;小编觉得挺实用的&#xff0c;因此分享给大家做个参考…

young people can also be a leader

2019独角兽企业重金招聘Python工程师标准>>> The leaders or directors of organizations are often older people. But some people say that young people can also be a leader. To what extent do you agree or disagree? In my view , young people can also …