零基础学Python|Python高阶学习Django框架(三)--用户管理功能案例实现

发布于:2023-09-28 ⋅ 阅读:(60) ⋅ 点赞:(0)

作者简介:Java、前端、Python开发多年,做过高程,项目经理,架构师

主要内容:Java项目开发、毕业设计开发、面试技术整理、最新技术分享

收藏点赞不迷路  关注作者有好处

文末获得源码

目录

三,开发用户管理功能模块

3.1 用户查询

3.2 用户添加

3.3 用户修改

3.4 用户删除

3.5 用户列表分页


三,开发用户管理功能模块

本章节主要实现对用户信息的增删改查操作,结合前所学知识和基础案例,用户登录后完成对用户信息的增加、查询、修改和删除操作。并实现用户查询的分页操作。

3.1 用户查询

views.py中定义查询列表接口方法:

 #用户列表查询
 def userlist(request):
      #查询所有的用户
      userlist = UserInfo.objects.all()
      return render(request,"userlist.html",{"userlist":userlist})

urls.py中定义路由配置:

 path("userlist/",views.userlist),

定义userlist.html页面:

 {% load static %}
 ​
 <!DOCTYPE html>
 <html lang="en">
 <head>
     <meta charset="UTF-8">
     <title>用户列表</title>
     <script src="{% static 'js/bootstrap.js'%}"></script>
     <script src="{% static 'js/jquery-3.3.1.js'%}"></script>
     <link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}"></link>
 </head>
 <body>
    <p align="center">
        <span align="center">
            <a href="/touseradd">添加用户</a>
        </span>
    </p>
    <table class="table table-striped">
        <thead>
           <th>用户编号</th>
           <th>账户</th>
           <th>密码</th>
           <th>年龄</th>
           <th>操作</th>
        </thead>
        <tbody>
           {% for user in userlist %}
              <tr>
                  <td>{{user.id}}</td>
                  <td>{{user.name}}</td>
                  <td>{{user.password}}</td>
                  <td>{{user.age}}</td>
                  <td><a href="/touserupdate?id={{user.id}}">编辑</a>--<a href="/userDel?id={{user.id}}">删除</a></td>
              </tr>
           {% endfor %}
        </tbody>
    </table>
 </body>
 </html>

在此页面中可以通过路由连接添加页面,更新页面,并直接访问删除路由进行用户信息删除。

3.2 用户添加

在views.py中添加跳转到添加页面的路由函数:

 #用户添加页面
 def touseradd(request):
     return render(request,"useradd.html")

在urls.py中定义路由配置:

 path("touseradd/",views.touseradd),

开发useradd.html页面:


{% load static %}
 <!DOCTYPE html>
 <html lang="en">
 <head>
     <meta charset="UTF-8">
     <title>用户添加</title>
     <script src="{% static 'js/bootstrap.js'%}"></script>
     <script src="{% static 'js/jquery-3.3.1.js'%}"></script>
     <link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}"></link>
 </head>
 <body>
   <div align="center" style="font-size: 24px">
       用户添加页面
   </div>
   <hr>
   <form name="useraddform" method="post" action="/useradd/">
       {% csrf_token %}
       <table class=".table" align="center">
 ​
           <tr>
               <td>用户名:<input type="text" name="name" class="form-control"></td>
           </tr>
           <tr>
               <td>密码:<input type="password" name="password" class="form-control"></td>
           </tr>
           <tr>
               <td>年龄:<input type="text" name="age" class="form-control"></td>
           </tr>
           <tr>
               <td><input type="submit" value="添加"></td>
           </tr>
       </table>
   </form>
 </body>
 </html>
  注:
  1.post请求的提交url指定时,后面必须加一个 /,  action="/useradd/"
  2.必须添加  {% csrf_token %}
  django项目中默认对POST请求进行了csrf认证,只需要在模板提交数据的代码块中加入模板标签{{% vsrf_token %}}即可,(不需要注销seetings.py配置文件MIDDLEWARE列表中的'django.middleware.csrf.CsrfViewMiddleware',),模板页面在渲染时会自动在相应位置渲染成隐藏的input标签:<input type="hidden" name="csrfmiddlewaretoken" value="8J4z1wiUEXt0gJSN59dLMnktrXFW0hv7m4d40Mtl37D7vJZfrxLir9L3jSTDjtG8">每次都是随机的
 ​

在views.py中添加用户的函数:

 #用户添加
 def useradd(request):
     name = request.POST.get("name")
     password = request.POST.get("password")
     age = request.POST.get("age")
     UserInfo.objects.create(name=name,password=password,age=age)
     #重新查询所有的用户
     userlist = UserInfo.objects.all()
     return render(request,"userlist.html",{"userlist":userlist})

在urls.py中定义路由配置:

 path("useradd/",views.useradd),

3.3 用户修改

用户修改应该是先查询数据进行页面回显,再执行数据更新操作。

在views.py中定义跳转更新页面的函数:此函数中先根据所传参数ID查询用户信息并携带到用户更新页面

 #用户更新页面
 def touserupdate(request):
     id = request.GET.get("id")
     user = UserInfo.objects.filter(id=id).first()
     return render(request,"userupdate.html",{"user":user})

在urls.py中定义路由配置:

 path("touserupdate/",views.touserupdate),

定义用户更新页面:

 {% load static %}
 <!DOCTYPE html>
 <html lang="en">
 <head>
     <meta charset="UTF-8">
     <title>用户更新</title>
     <script src="{% static 'js/bootstrap.js'%}"></script>
     <script src="{% static 'js/jquery-3.3.1.js'%}"></script>
     <link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}"></link>
 </head>
 <body>
   <div align="center" style="font-size: 24px">
       用户更新页面
   </div>
   <hr>
   <form name="useraddform" method="post" action="/userupdate/">
       {% csrf_token %}
       <table class=".table" align="center">
           <input type="hidden" name="id" value="{{user.id}}">
           <tr>
               <td>用户名:<input type="text" name="name" class="form-control" value="{{user.name}}"></td>
           </tr>
           <tr>
               <td>密码:<input type="password" name="password" class="form-control" value="{{user.password}}"></td>
           </tr>
           <tr>
               <td>年龄:<input type="text" name="age" class="form-control" value="{{user.age}}"></td>
           </tr>
           <tr>
               <td><input type="submit" value="添加"></td>
           </tr>
       </table>
   </form>
 </body>
 </html>

在 views.py中定义执行更新的函数:更新后重新查询所有用户进入用户列表

 #用户信息更新
 def userupdate(request):
     name = request.POST.get("name")
     password = request.POST.get("password")
     age = request.POST.get("age")
     id = request.POST.get("id")
     #根据ID执行更新
     UserInfo.objects.filter(id=id).update(name=name,password=password,age=age)
     #重新查询所有的用户
     userlist = UserInfo.objects.all()
     return render(request,"userlist.html",{"userlist":userlist})

在urls.py中定义路由配置:

 path("userupdate/",views.userupdate)

3.4 用户删除

在用户列表页面中直接请求用户删除接口,并将用户ID传入执行删除即可。

在views.py中定义执行用户删除的函数:

 #用户删除
 def userDel(request):
     id = request.GET.get("id")
     UserInfo.objects.filter(id=id).delete()
     #重新查询所有的用户
     userlist = UserInfo.objects.all()
     return render(request,"userlist.html",{"userlist":userlist})

在urls.py中定义路由配置:

 path("userDel/",views.userDel),

至此整个用户管理的增删改查操作案例开发完毕。下面升级一下,实现用户列表分页查询。

3.5 用户列表分页

Django提供了一些类实现管理数据分页,这些类位于django/core/paginator.py中

Paginator对象

 Paginator(列表,int):返回分页对象,参数1为要进行分页的列表数据,每面数据的条数(Limit)
 ​
 属性
 count:对象总数
 ​
 num_pages:页面总数
 ​
 page_range:页码列表,从1开始,例如[1, 2, 3, 4]
 ​
 方法
 page(num):下标以1开始,如果提供的页码不存在,抛出InvalidPage异常
 ​
 异常exception
 InvalidPage:当向page()传入一个无效的页码时抛出
 ​
 PageNotAnInteger:当向page()传入一个不是整数的值时抛出
 ​
 EmptyPage:当向page()提供一个有效值,但是那个页面上没有任何对象时抛出

Page对象

 创建对象
 Paginator对象的page()方法返回Page对象,不需要手动构造
 ​
 属性
 object_list:当前页上所有对象的列表
 ​
 number:当前页的序号,从1开始
 ​
 paginator:当前page对象相关的Paginator对象
 ​
 方法
 has_next():如果有下一页返回True
 ​
 has_previous():如果有上一页返回True
 ​
 has_other_pages():如果有上一页或下一页返回True
 ​
 next_page_number():返回下一页的页码,如果下一页不存在,抛出InvalidPage异常
 ​
 previous_page_number():返回上一页的页码,如果上一页不存在,抛出InvalidPage异常
 ​
 len():返回当前页面对象的个数
 ​
 迭代页面对象:访问当前页面中的每个对象

修改用户查询列表函数:userlist

 from django.core.paginator import Paginator
 #用户列表查询
 def userlist(request):
      page = request.GET.get("page")
      print("page....",page)
      if page is None:
          page = 1
      try:
          current_page = int(page)
      except:
          page = 1
      #查询所有的用户
      userlist = UserInfo.objects.all()
      # 分页器
      paginator = Paginator(userlist, 5)
      # 当前分页对象
      page = paginator.page(current_page)
      print(page)
      print(page.object_list) # 当前页要展示的数据
      # django3.2以后提供了一个页码生成器
      page_range = paginator.get_elided_page_range(current_page,on_each_side=3,on_ends=3)
      print(page_range)
      return render(request,"userlist.html",{"page":page})

修改用户列表页面:userlist.html

 {% load static %}
 ​
 <!DOCTYPE html>
 <html lang="en">
 <head>
     <meta charset="UTF-8">
     <title>用户列表</title>
     <script src="{% static 'js/bootstrap.js'%}"></script>
     <script src="{% static 'js/jquery-3.3.1.js'%}"></script>
     <link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}"></link>
 </head>
 <body>
    <p align="center">
        <span align="center">
            <a href="/touseradd">添加用户</a>
        </span>
    </p>
    <table class="table table-striped">
        <thead>
           <th>用户编号</th>
           <th>账户</th>
           <th>密码</th>
           <th>年龄</th>
           <th>操作</th>
        </thead>
        <tbody>
           {% for user in page.object_list %}
              <tr>
                  <td>{{user.id}}</td>
                  <td>{{user.name}}</td>
                  <td>{{user.password}}</td>
                  <td>{{user.age}}</td>
                  <td><a href="/touserupdate?id={{user.id}}">编辑</a>--<a href="/userDel?id={{user.id}}">删除</a></td>
              </tr>
           {% endfor %}
        </tbody>
    </table>
    <p>
        {% for item in page_range %}
        <a href="{{ item }}">{{ item }}</a>
        {% endfor %}
    </p>
    <p align="center">
        {% if page.has_previous %}
        <a href="?page=1">首页</a>
        <a href="?page={{ page.previous_page_number }}">上一页</a>
        <a href="?page={{ page.previous_page_number }}">{{ page.previous_page_number }}</a>
        {% endif %}
        <a>{{ page.number }}</a>
        {% if page.has_next %}
        <a href="?page={{ page.next_page_number }}">{{ page.next_page_number }}</a>
        <a href="?page={{ page.next_page_number }}">下一页</a>
        <a href="?page={{ page.paginator.num_pages }}">尾页</a>
        {% endif %}
    </p>
 </body>
 </html>

实现效果:


网站公告

今日签到

点亮在社区的每一天
去签到