一、創建用戶應用
打開 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
轉載請注明出處,商用請征得作者本人同意,謝謝!!!