• day_37:后端day08Django框架前后端不分离模式实现项目管理系统(增删差改)


    一。功能分析

    1)项目列表

    ### 项目列表
    
    一次性查询所有项目,以表格的形式展示,页面上要有添加按钮,每个项目要有编辑,删除按钮对应操作
    
    - url : /projects/
    - method:get
    - content-type: html

    例子:

    1)添加视图

    def project_list(request):
        """
        项目列表视图(列表展示功能)
        实现步骤:
        1.设置视图、模板和配置路由
        2.给模板引入表格和修改title
        3.在视图中取出数据库数据并传递给视图(context方法传递,模板中{}进行接收)
        4.模板中接收数据,并使用for循环把数据填充在模板中
        5.模板中的序号取值,使用for的自身机制,每次for循环都会存在forloop,其中counter代表从1开始,counter0代表从0开始
        6.给模板添加操作按钮,并设置样式
        7.模板添加 ‘添加’按钮
        """
        # 1.数据库中查询所有的项目数据
        objs = Project.objects.all()
        # 使用django中反向解析获取添加项目的视图地址,并返回给模板
        create_url = reverse('projects:create')
        return render(request, 'projects/list.html', context={'objs': objs, 'create_url': create_url})

    2)添加模板(使用的技术栈:https://v3.bootcss.com/)

    <html lang="zh-CN">
      <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
        <title>项目{% if obj %}修改{% else %}添加{% endif %}</title>
    
        <!-- Bootstrap -->
        <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">
    
        <!-- HTML5 shim 和 Respond.js 是为了让 IE8 支持 HTML5 元素和媒体查询(media queries)功能 -->
        <!-- 警告:通过 file:// 协议(就是直接将 html 页面拖拽到浏览器中)访问页面时 Respond.js 不起作用 -->
        <!--[if lt IE 9]>
          <script src="https://cdn.jsdelivr.net/npm/html5shiv@3.7.3/dist/html5shiv.min.js"></script>
          <script src="https://cdn.jsdelivr.net/npm/respond.js@1.4.2/dest/respond.min.js"></script>
        <![endif]-->
      </head>
      <body>
        <h1>项目{% if obj %}修改{% else %}添加{% endif %}</h1>
        <div style=" 800px">
            <form class="form-horizontal" method="post">
              <div class="form-group">
                <label for="name" class="col-sm-2 control-label">项目名称</label>
                <div class="col-sm-10">
                  <input type="text" class="form-control" id="name" name="name" placeholder="项目名称" value={{ obj.name }}>
                </div>
              </div>
              <div class="form-group">
                <label for="leader" class="col-sm-2 control-label">项目负责人</label>
                <div class="col-sm-10">
                  <input type="text" class="form-control" id="leader" name="leader" placeholder="项目负责人" value={{ obj.leader }}>
                </div>
              </div>
              <div class="form-group">
                <label for="desc" class="col-sm-2 control-label">项目描述</label>
                <div class="col-sm-10">
                    <textarea  class="form-control" id="desc" name="desc" cols="30" rows="10">{{ obj.desc }}</textarea>
                </div>
              </div>
              <div class="form-group">
                <div class="col-sm-offset-2 col-sm-10">
                  <button type="submit" class="btn btn-default">{% if obj %}修改{% else %}添加{% endif %}</button>
                </div>
              </div>
            </form>
        </div>
        <!-- jQuery (Bootstrap 的所有 JavaScript 插件都依赖 jQuery,所以必须放在前边) -->
        <script src="https://cdn.jsdelivr.net/npm/jquery@1.12.4/dist/jquery.min.js" integrity="sha384-nvAa0+6Qg9clwYCGGPpDQLVpLNn0fRaROjHqs13t4Ggj3Ez50XnGQqc/r8MhnRDZ" crossorigin="anonymous"></script>
        <!-- 加载 Bootstrap 的所有 JavaScript 插件。你也可以根据需要只加载单个插件。 -->
        <script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js" integrity="sha384-aJ21OjlMXNL5UyIl/XNwTMqvzeRMZH2w8c5cRVpzpU8Y5bApTppSuUkhZXN0VxHd" crossorigin="anonymous"></script>
      </body>
    </html>

    3)配置路由

    app_name = 'projects'
    urlpatterns = [
        path('', views.project_list, name='list')
    ]

    4)进行访问

    2)项目增加

    ### 项目增加
    
    首先打开项目增加表单页面,然后填写表单提交post请求增加,成功后显示项目列表页面
    
    增加表单页面
    
    - url:/projects/create/
    - method: get
    - content-type:html
    
    post请求提交增加
    
    - url:/projects/create/
    - method:post
    - content-type:重定向

     例子:

    1)视图方法实现:

    class ProjectCreateView(View):
        """项目添加功能"""
    
        def get(self, request):
            """
            项目添加页面
            实现步骤:
            1.创建添加项目的视图类
            2.创建新增项目的模板detail
            3.在模板中。引入表单控件
            4.配置路由
            5.在list视图中,使用反向解析获取添加项目的视图方法的地址,并返回给list模板并配置跳转的路径,实现动态路由
                反向解析方法:
                    1.django:reverse('projects:create')
                    2.模板中:{{ create_url }}
            6.deatil模板中修改 模板字段,并设置表单提交方法为post
            """
            return render(request, 'projects/detail.html')
    
        def post(self, request):
            """
            项目添加
            实现步骤:
            1.编辑页面点击提交进入该方法
            2.接收表单参数
            3.获取对应数据库的数据,进行修改并保存
            4.返回到列表页面
            """
            # 1.接受表单数据
            # 2.创建模型对象并保存到数据库
            obj = Project()
            obj.name = request.POST.get('name')
            obj.leader = request.POST.get('leader')
            obj.desc = request.POST.get('desc')
            obj.save()
            # 3.跳转到项目列表页面
            return redirect(reverse('projects:list'))

    2)模板配置:

    步骤:

    a.在首页视图中反向解析 新增页面的接口地址,并传递给模板

    b.使用视图传递的反向解析的新增接口的url信息,并在首页模板"添加"按钮中插入跳转路由地址

    c.新增添加项目的视图方法:

    class ProjectCreateView(View):
        """项目添加功能"""
    
        def get(self, request):
            """
            项目添加页面
            实现步骤:
            1.创建添加项目的视图类
            2.创建新增项目的模板detail
            3.在模板中。引入表单控件
            4.配置路由
            5.在list视图中,使用反向解析获取添加项目的视图方法的地址,并返回给list模板并配置跳转的路径,实现动态路由
                反向解析方法:
                    1.django:reverse('projects:create')
                    2.模板中:{{ create_url }}
            6.deatil模板中修改 模板字段,并设置表单提交方法为post
            """
            return render(request, 'projects/detail.html')
    
        def post(self, request):
            """
            项目添加
            实现步骤:
            1.编辑页面点击提交进入该方法
            2.接收表单参数
            3.获取对应数据库的数据,进行修改并保存
            4.返回到列表页面
            """
            # 1.接受表单数据
            # 2.创建模型对象并保存到数据库
            obj = Project()
            obj.name = request.POST.get('name')
            obj.leader = request.POST.get('leader')
            obj.desc = request.POST.get('desc')
            obj.save()
            # 3.跳转到项目列表页面
            return redirect(reverse('projects:list'))

    d.新增添加项目数据的模板,并对数据进行绑定

    <html lang="zh-CN">
      <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
        <title>项目{% if obj %}修改{% else %}添加{% endif %}</title>
    
        <!-- Bootstrap -->
        <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">
    
        <!-- HTML5 shim 和 Respond.js 是为了让 IE8 支持 HTML5 元素和媒体查询(media queries)功能 -->
        <!-- 警告:通过 file:// 协议(就是直接将 html 页面拖拽到浏览器中)访问页面时 Respond.js 不起作用 -->
        <!--[if lt IE 9]>
          <script src="https://cdn.jsdelivr.net/npm/html5shiv@3.7.3/dist/html5shiv.min.js"></script>
          <script src="https://cdn.jsdelivr.net/npm/respond.js@1.4.2/dest/respond.min.js"></script>
        <![endif]-->
      </head>
      <body>
        <h1>项目{% if obj %}修改{% else %}添加{% endif %}</h1>
        <div style=" 800px">
            <form class="form-horizontal" method="post">
              <div class="form-group">
                <label for="name" class="col-sm-2 control-label">项目名称</label>
                <div class="col-sm-10">
                  <input type="text" class="form-control" id="name" name="name" placeholder="项目名称" value={{ obj.name }}>
                </div>
              </div>
              <div class="form-group">
                <label for="leader" class="col-sm-2 control-label">项目负责人</label>
                <div class="col-sm-10">
                  <input type="text" class="form-control" id="leader" name="leader" placeholder="项目负责人" value={{ obj.leader }}>
                </div>
              </div>
              <div class="form-group">
                <label for="desc" class="col-sm-2 control-label">项目描述</label>
                <div class="col-sm-10">
                    <textarea  class="form-control" id="desc" name="desc" cols="30" rows="10">{{ obj.desc }}</textarea>
                </div>
              </div>
              <div class="form-group">
                <div class="col-sm-offset-2 col-sm-10">
                  <button type="submit" class="btn btn-default">{% if obj %}修改{% else %}添加{% endif %}</button>
                </div>
              </div>
            </form>
        </div>
        <!-- jQuery (Bootstrap 的所有 JavaScript 插件都依赖 jQuery,所以必须放在前边) -->
        <script src="https://cdn.jsdelivr.net/npm/jquery@1.12.4/dist/jquery.min.js" integrity="sha384-nvAa0+6Qg9clwYCGGPpDQLVpLNn0fRaROjHqs13t4Ggj3Ez50XnGQqc/r8MhnRDZ" crossorigin="anonymous"></script>
        <!-- 加载 Bootstrap 的所有 JavaScript 插件。你也可以根据需要只加载单个插件。 -->
        <script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js" integrity="sha384-aJ21OjlMXNL5UyIl/XNwTMqvzeRMZH2w8c5cRVpzpU8Y5bApTppSuUkhZXN0VxHd" crossorigin="anonymous"></script>
      </body>
    </html>

    f.定义路由

    app_name = 'projects'
    urlpatterns = [
        path('', views.project_list, name='list'),
        path('create/', views.ProjectCreateView.as_view(), name='create')
    ]

    g.效果展示

    3)项目修改

    ### 项目修改
    
    首先,打开某个已存在的项目详情页,然后修改项目,并提交post请求,成功跳转到项目列表页面
    
    - url:/projects/update/<pk>/
    - method:get
    - content-type:html
    
    post请求提交增加
    
    - url:/projects/update/<pk>/
    - method:post
    - content-type:重定向

     例子:

    步骤:

    a.在首页模板中,使用模板解析编辑接口的路径 传递 数据的pk(pk等于主键id)值

     b.定义视图方法:
    class ProjectUpdateView(View):
        """项目更新视图功能"""
    
        def get(self, request, pk):
            """
            返回更新页面的模板
            步骤:
            1.创建update.html的模板文件,并修改
            2.编写get方法,配置路由(路由是路径参数形式<int:pk>)
            3.list页面,编辑按钮 反向解析路由并携带当前操作的项目id 请求后台get方法
            4.跟进项目id,从数据库获取数据
            5.该项目数据返回给模板
            6.模板对字段数据进行展示
            """
            obj = Project.objects.get(pk=pk)
            return render(request, 'projects/detail.html', context={'obj': obj})
    
        def post(self, request, pk):
            """更新对象"""
            # 1.获取要修改的对象
            obj = Project.objects.get(pk=pk)
            # 2.获取表单数据,并修改对象
            obj.name = request.POST.get('name')
            obj.leader = request.POST.get('leader')
            obj.desc = request.POST.get('desc')
            obj.save()
            # 3.跳转到项目列表页面
            return redirect(reverse('projects:list'))
    c.定义编辑模板
    <html lang="zh-CN">
      <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
        <title>项目{% if obj %}修改{% else %}添加{% endif %}</title>
    
        <!-- Bootstrap -->
        <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">
    
        <!-- HTML5 shim 和 Respond.js 是为了让 IE8 支持 HTML5 元素和媒体查询(media queries)功能 -->
        <!-- 警告:通过 file:// 协议(就是直接将 html 页面拖拽到浏览器中)访问页面时 Respond.js 不起作用 -->
        <!--[if lt IE 9]>
          <script src="https://cdn.jsdelivr.net/npm/html5shiv@3.7.3/dist/html5shiv.min.js"></script>
          <script src="https://cdn.jsdelivr.net/npm/respond.js@1.4.2/dest/respond.min.js"></script>
        <![endif]-->
      </head>
      <body>
        <h1>项目{% if obj %}修改{% else %}添加{% endif %}</h1>
        <div style=" 800px">
            <form class="form-horizontal" method="post">
              <div class="form-group">
                <label for="name" class="col-sm-2 control-label">项目名称</label>
                <div class="col-sm-10">
                  <input type="text" class="form-control" id="name" name="name" placeholder="项目名称" value={{ obj.name }}>
                </div>
              </div>
              <div class="form-group">
                <label for="leader" class="col-sm-2 control-label">项目负责人</label>
                <div class="col-sm-10">
                  <input type="text" class="form-control" id="leader" name="leader" placeholder="项目负责人" value={{ obj.leader }}>
                </div>
              </div>
              <div class="form-group">
                <label for="desc" class="col-sm-2 control-label">项目描述</label>
                <div class="col-sm-10">
                    <textarea  class="form-control" id="desc" name="desc" cols="30" rows="10">{{ obj.desc }}</textarea>
                </div>
              </div>
              <div class="form-group">
                <div class="col-sm-offset-2 col-sm-10">
                  <button type="submit" class="btn btn-default">{% if obj %}修改{% else %}添加{% endif %}</button>
                </div>
              </div>
            </form>
        </div>
        <!-- jQuery (Bootstrap 的所有 JavaScript 插件都依赖 jQuery,所以必须放在前边) -->
        <script src="https://cdn.jsdelivr.net/npm/jquery@1.12.4/dist/jquery.min.js" integrity="sha384-nvAa0+6Qg9clwYCGGPpDQLVpLNn0fRaROjHqs13t4Ggj3Ez50XnGQqc/r8MhnRDZ" crossorigin="anonymous"></script>
        <!-- 加载 Bootstrap 的所有 JavaScript 插件。你也可以根据需要只加载单个插件。 -->
        <script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js" integrity="sha384-aJ21OjlMXNL5UyIl/XNwTMqvzeRMZH2w8c5cRVpzpU8Y5bApTppSuUkhZXN0VxHd" crossorigin="anonymous"></script>
      </body>
    </html>
    d.定义路由
    app_name = 'projects'
    urlpatterns = [
        path('', views.project_list, name='list'),
        path('create/', views.ProjectCreateView.as_view(), name='create'),
        path('update/<int:pk>/', views.ProjectUpdateView.as_view(), name='update')
    ]
     f.效果展示

    4)项目删除

    ### 项目删除
    
    在项目列表点击对应项目删除按钮,删除成功后跳转到项目列表页面。
    
    - url:/projects/delete/<pk>/
    - method:get
    - content-type:重定向

     例子:

    步骤:

    a.在首页模板中,使用模板解析编辑接口的路径 传递 数据的pk(pk等于主键id)值

    b.定义视图方法
    def project_delete(request, pk):
        """删除项目"""
        # 1.获取对象,并删除
        obj = Project.objects.get(pk=pk)
        obj.delete()
        # 2.跳转到项目页
        return redirect(reverse('projects:list'))
    c.定义路由
    app_name = 'projects'
    urlpatterns = [
        path('', views.project_list, name='list'),
        path('create/', views.ProjectCreateView.as_view(), name='create'),
        path('update/<int:pk>/', views.ProjectUpdateView.as_view(), name='update'),
        path('delete/<int:pk>/', views.project_delete, name='delete')
    ]
    d.效果展示

    二。分析不足之处

    ## 不足之处
    
    1. 模板前端页面写起来麻烦,逻辑和后端耦合
    2. 视图没有做校验
    
    3. 视图代码冗余
    4. 路由规则繁琐
    5. 没有翻页
    6. 没有查询
    爱折腾的小测试
  • 相关阅读:
    table-layout:fixed 布局注意事项
    resize 按钮不会被伪元素遮盖
    background-size:100% 100% 时 background-position: % 失效
    利用 background 和 filter 模糊指定区域
    window.location.href = window.location.href 跳转无反应 a 超链接 onclick 点击跳转无反应
    如何在前台脚本通过json传递数据到后台(使用微软自带的ajax)
    .clear 万能清除浮动
    个人博客开通了
    Mysql The user specified as a definer ('test'@'%') does not exist
    MERGE INTO 解决大数据量复杂操作更新慢的问题
  • 原文地址:https://www.cnblogs.com/newsss/p/15559790.html
Copyright © 2020-2023  润新知