zoukankan      html  css  js  c++  java
  • 测试平台开发(五)Django实现项目管理功能

    一、创建用户应用

    打开 Tools > Run manage.py Task…,运行 startapp空格加应用名称

    startapp projects

    生成应用后一定要记得将应用名加入到settings.py文件里名为INSTALLED_APPS的列表中,遵循规范加入到列表的最后,再添加应用也一样

    1 # settings.py
    2 INSTALLED_APPS=[
    3   ……,
    4   'projects',
    5 ]

    二、编写数据模型

     1 # projects/models.py
     2 from django.db import models
     3 
     4 from utils.base_models import BaseModel
     5 
     6 
     7 class Projects(BaseModel):
     8     id = models.AutoField(primary_key=True, verbose_name='id主键')
     9     name = models.CharField(max_length=50, unique=True, verbose_name='项目名')
    10     leader = models.CharField(max_length=50, verbose_name='负责人')
    11     tester = models.CharField(max_length=50, verbose_name='测试人员')
    12     programer = models.CharField(max_length=50, verbose_name='开发人员')
    13     publish_app = models.CharField(max_length=50, verbose_name='应用名称')
    14     desc = models.CharField(max_length=200, verbose_name='简要描述', blank=True, default="", null=True)
    15 
    16     class Meta:
    17         db_table = 'lx_projects'
    18         verbose_name = '项目信息'
    19         verbose_name_plural = verbose_name
    20 
    21     def __str__(self):
    22         return self.name

    迁移数据库,打开 Tools > Run manage.py Task…,依次行

    makemigrations
    migrate

    三、编写视图函数

    1.表单校验,在projects目录下创建forms.py文件,用来校验创建项目数据和修改时输入的数据

      1 # projects/forms.py
      2 from django import forms
      3 from django.core.exceptions import ValidationError
      4 
      5 from projects.models import Projects
      6 
      7 
      8 class CreateForm(forms.Form):
      9     name = forms.CharField(
     10         label="项目名",
     11         required=True,
     12         max_length=50,
     13         min_length=2,
     14         error_messages={
     15             "required": "项目名不能为空",
     16             "max_length": "项目名最长不能超过50个字符",
     17             "min_length": "项目名最小长度为2"
     18         })
     19     leader = forms.CharField(
     20         label="负责人",
     21         required=True,
     22         max_length=50,
     23         min_length=2,
     24         error_messages={
     25             "required": "负责人不能为空",
     26             "max_length": "负责人最长不能超过50个字符",
     27             "min_length": "负责人最小长度为2"
     28         })
     29     tester = forms.CharField(
     30         label="测试人员",
     31         required=True,
     32         max_length=50,
     33         min_length=2,
     34         error_messages={
     35             "required": "测试人员不能为空",
     36             "max_length": "测试人员最长不能超过50个字符",
     37             "min_length": "测试人员最小长度为2"
     38         })
     39     programer = forms.CharField(
     40         label="开发人员",
     41         required=True,
     42         max_length=50,
     43         min_length=2,
     44         error_messages={
     45             "required": "开发人员不能为空",
     46             "max_length": "开发人员最长不能超过50个字符",
     47             "min_length": "开发人员最小长度为2"
     48         })
     49     publish_app = forms.CharField(
     50         label="应用名称",
     51         required=True,
     52         max_length=50,
     53         min_length=2,
     54         error_messages={
     55             "required": "应用名称不能为空",
     56             "max_length": "应用名称最长不能超过50个字符",
     57             "min_length": "应用名称最小长度为2"
     58         })
     59     desc = forms.CharField(
     60         label="简要描述",
     61         required=False,
     62         max_length=200,
     63         error_messages={
     64             "max_length": "简要描述最长不能超过200个字符",
     65         })
     66 
     67     def clean_name(self):
     68         val = self.cleaned_data.get("name")
     69         ret = Projects.objects.filter(name=val).values("name")
     70         if not ret:
     71             return val
     72         else:
     73             raise ValidationError("该项目名已存在!")
     74 
     75 
     76 class UpdateForm(forms.Form):
     77     name = forms.CharField(
     78         label="项目名",
     79         required=False,
     80         max_length=50,
     81         min_length=2,
     82         error_messages={
     83             "max_length": "项目名最长不能超过50个字符",
     84             "min_length": "项目名最小长度为2"
     85         })
     86     leader = forms.CharField(
     87         label="负责人",
     88         required=False,
     89         max_length=50,
     90         min_length=2,
     91         error_messages={
     92             "max_length": "负责人最长不能超过50个字符",
     93             "min_length": "负责人最小长度为2"
     94         })
     95     tester = forms.CharField(
     96         label="测试人员",
     97         required=False,
     98         max_length=50,
     99         min_length=2,
    100         error_messages={
    101             "max_length": "测试人员最长不能超过50个字符",
    102             "min_length": "测试人员最小长度为2"
    103         })
    104     programer = forms.CharField(
    105         label="开发人员",
    106         required=False,
    107         max_length=50,
    108         min_length=2,
    109         error_messages={
    110             "max_length": "开发人员最长不能超过50个字符",
    111             "min_length": "开发人员最小长度为2"
    112         })
    113     publish_app = forms.CharField(
    114         label="应用名称",
    115         required=False,
    116         max_length=50,
    117         min_length=2,
    118         error_messages={
    119             "max_length": "应用名称最长不能超过50个字符",
    120             "min_length": "应用名称最小长度为2"
    121         })
    122     desc = forms.CharField(
    123         label="简要描述",
    124         required=False,
    125         max_length=200,
    126         error_messages={
    127             "max_length": "简要描述最长不能超过200个字符",
    128         })

    2.在utils目录下的common.py文件写入一个字典去除空值的函数,下面回用到

    1 # utils/common.py
    2 ……
    3 
    4 def removeEmpty(data):
    5     data2 = {}
    6     for o in data:
    7         if not data[o] == '':
    8             data2[o] = data[o]
    9     return data2

    3.编写用户应用的视图函数

      1 # projects/views.py
      2 from django.http import JsonResponse
      3 from django.views import View
      4 from django.core.paginator import Paginator
      5 
      6 from projects.forms import CreateForm, UpdateForm
      7 from projects.models import Projects
      8 from utils.common import result, removeEmpty
      9 from utils.jwt_permission_required import auth_permission_required
     10 
     11 
     12 class CreateListView(View):
     13     # 分页 + 项目名模糊查询
     14     @auth_permission_required("class_func")
     15     def get(self, request):
     16         result["message"] = "查询成功"
     17         result["success"] = True
     18         page = request.GET.get("page", 1)
     19         size = request.GET.get("size", 10)
     20         name = request.GET.get("name", "")
     21         projects = Projects.objects.filter(is_delete=False, name__contains=name)
     22         projectss = Paginator(projects, size)
     23         project_list = []
     24         for project in projectss.page(page):
     25             project_list.append({
     26                 'id': project.id,
     27                 'name': project.name,
     28                 'leader': project.leader,
     29                 'tester': project.tester,
     30                 'programer': project.programer,
     31                 'publish_app': project.publish_app,
     32                 'desc': project.desc
     33             })
     34         result["details"] = {
     35             "records": project_list,
     36             "pages": projectss.num_pages,
     37             "total": projectss.count
     38         }
     39         # JsonResponse第一个参数默认只能为dict字典,如果设为其他类型,需要将safe设为False
     40         return JsonResponse(result, safe=False, status=200)
     41 
     42     # 创建数据
     43     @auth_permission_required("class_func")
     44     def post(self, request):
     45         result["message"] = "保存失败"
     46         result["success"] = False
     47         result["details"] = None
     48         json_data = request.body.decode('utf-8')
     49         if json_data:
     50             python_data = eval(json_data)
     51             data = CreateForm(python_data)
     52             if data.is_valid():
     53                 print(data.cleaned_data)
     54                 Projects.objects.create(**data.cleaned_data)
     55                 result["message"] = "保存成功"
     56                 result["success"] = True
     57                 result["details"] = data.cleaned_data
     58                 return JsonResponse(result, status=200)
     59             else:
     60                 result["details"] = data.errors
     61                 return JsonResponse(result, status=400)
     62         return JsonResponse(result, status=500)
     63 
     64 
     65 class UpdateDeleteView(View):
     66     # 更新数据
     67     @auth_permission_required("class_func")
     68     def put(self, request, pk):
     69         result["message"] = "更新失败"
     70         result["success"] = False
     71         result["details"] = None
     72         ret = Projects.objects.filter(id=pk, is_delete=False).values("id")
     73         if ret:
     74             json_data = request.body.decode('utf-8')
     75             if json_data:
     76                 python_data = eval(json_data)
     77                 data = UpdateForm(python_data)
     78                 if data.is_valid():
     79                     a = Projects.objects.filter(name=python_data["name"]).values("id").first()
     80                     if not a or a["id"] == pk:
     81                         d = removeEmpty(data.cleaned_data)
     82                         Projects.objects.filter(id=pk).update(**d)
     83                         result["message"] = "更新成功"
     84                         result["success"] = True
     85                         result["details"] = d
     86                         return JsonResponse(result, status=200)
     87                     else:
     88                         result["details"] = "该项目名已存在"
     89                         return JsonResponse(result, status=400)
     90                 else:
     91                     result["details"] = data.errors
     92                     return JsonResponse(result, status=400)
     93             return JsonResponse(result, status=500)
     94         else:
     95             result["details"] = "项目不存在"
     96             return JsonResponse(result, status=400)
     97 
     98     # 逻辑删除
     99     @auth_permission_required("class_func")
    100     def delete(self, request, pk):
    101         result["message"] = "删除失败"
    102         result["success"] = False
    103         result["details"] = None
    104         ret = Projects.objects.filter(id=pk, is_delete=False).values("id").first()
    105         if ret:
    106             project = Projects.objects.get(id=pk)
    107             project.is_delete = True
    108             project.save()
    109             result["message"] = "删除成功"
    110             result["success"] = True
    111             return JsonResponse(result, status=200)
    112         result["details"] = "项目不存在"
    113         return JsonResponse(result, status=400)
    114 
    115 # 获取id和name
    116 @auth_permission_required("func")
    117 def names(reuqest):
    118     result["message"] = "查询成功"
    119     result["success"] = True
    120     projects = Projects.objects.filter(is_delete=False).values("id", "name")
    121     project_list = []
    122     for project in projects:
    123         project_list.append({
    124             'id': project["id"],
    125             'name': project["name"],
    126         })
    127     result["details"] = project_list
    128     return JsonResponse(result, safe=False, status=200)

    四、编写应用的路由

    在projects目录下创建urls.py文件

     1 #projects/urls.py
     2 from django.urls import path
     3 
     4 from projects import views
     5 
     6 urlpatterns = [
     7     path('', views.CreateListView.as_view()),
     8     path('<int:pk>', views.UpdateDeleteView.as_view()),
     9     path('names',views.names)
    10 ]

    五、定义全局路由

    1 # testplatform/urls.py
    2 from django.contrib import admin
    3 from django.urls import path, include
    4 
    5 urlpatterns = [
    6     path('api/admin/', admin.site.urls),
    7     path('api/user/', include("users.urls")),
    8     path('api/project/', include("projects.urls"))
    9 ]

    六、测试

    1. 分页+项目名模糊查询

     2. 创建数据

    3. 更新数据

     4. 逻辑删除

    5. 获取id和name

    GitHub持续更新:地址https://github.com/debugf/testplatform

     转载请注明出处,商用请征得作者本人同意,谢谢!!!

  • 相关阅读:
    Codeforces 570E
    Codeforces 570D
    Codeforces 1136E
    Codeforces 570
    小白学习sprint boot容易遇到了一些问题
    力扣 234. 回文链表
    力扣198. 打家劫舍
    力扣543. 二叉树的直径
    力扣141.环形链表
    剑指offer1.跳台阶 & 力扣70.爬楼梯
  • 原文地址:https://www.cnblogs.com/debugf/p/13428555.html
Copyright © 2011-2022 走看看