測試平台開發(五)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

 

 轉載請注明出處,商用請征得作者本人同意,謝謝!!!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM