拆分ModelForm类
在app01/utils下新建form.py,目录不固定
将views.py中编写的ModelForm类拆分出来
form.py
from app01 import models from django import forms from django.core.validators import RegexValidator from django.core.exceptions import ValidationError from app01.utils.bootstrap import BootStrapModelForm class UserModelForm(BootStrapModelForm): # 设置更多校验,用户名至少为三个字符 name = forms.CharField(min_length=3, label="用户名") class Meta: model = models.UserInfo # fields返回给前端HTML页面为一个又一个<input...>输入框 # 后续增加字段只需要在views.py中修改fields = ["name", "password", "age"],前端会自动生成 # 外键depart只需要写depart,不需要写他自动生成的depart_id fields = ["name", "password", "age", "acount", "creata_time", "gender", "depart"] # 为fields自动生成的input框添加样式,一个一个添加 # widgets = { # "name": forms.TextInput(attrs={"class": "form-control"}), # "password": forms.PasswordInput(attrs={"class": "form-control"}), # } # 为fields自动生成的input框添加样式,一个一个添加比较麻烦,可用: # def __init__(self, *args, **kwargs): # super().__init__(*args, **kwargs) # # 循环找到所有的插件,添加class = "form-control"样式 # for name, field in self.fields.items(): # # 让某个字段不加form-control样式 # # if name == "password": # # continue # # field.widget.attrs = {"class": "form-control", "placeholder": field.label} class PrettyModelForm(BootStrapModelForm): # # #添加手机号的校验规则 # # 方法一:正则 # mobile = forms.CharField( # label="手机号", # validators=[RegexValidator(r'^1[3-9]\d{9}$', '手机号格式错误')] # ) class Meta: model = models.PrettyNum # fields = ["mobile", "price", "level", "status"]表示自定义的字段 # fields = "__all__"表示所有字段 # exclude = ['level']表示排除哪个字段 fields = "__all__" # def __init__(self, *args, **kwargs): # super().__init__(*args, **kwargs) # # 循环找到所有的插件,添加class = "form-control"样式 # for name, field in self.fields.items(): # # 让某个字段不加form-control样式 # # if name == "password": # # continue # # field.widget.attrs = {"class": "form-control", "placeholder": field.label} # # 添加手机号的校验规则 # # #方法二:钩子方法 # def clean_mobile(self): # txt_mobile = self.cleaned_data["mobile"] # # if len(txt_mobile) != 11: # # 验证不通过 # raise ValidationError("格式错误") # #验证通过,用户输入的值返回 # return txt_mobile # 钩子方法 def clean_mobile(self): txt_mobile = self.cleaned_data["mobile"] exists = models.PrettyNum.objects.filter(mobile=txt_mobile).exists() if exists: raise ValidationError("手机号已存在") return txt_mobile class PrettyEditModelForm(BootStrapModelForm): # #添加手机号的校验规则 # 方法一:正则 mobile = forms.CharField( label="手机号", validators=[RegexValidator(r'^1[3-9]\d{9}$', '手机号格式错误')] ) #显示mobile,但不可修改 # mobile = forms.CharField(disabled=True, label="手机号") class Meta: model = models.PrettyNum fields = [ "mobile", "price", "level", "status"] # def __init__(self, *args, **kwargs): # super().__init__(*args, **kwargs) # # 循环找到所有的插件,添加class = "form-control"样式 # for name, field in self.fields.items(): # # 让某个字段不加form-control样式 # # if name == "password": # # continue # # field.widget.attrs = {"class": "form-control", "placeholder": field.label} # 钩子方法 def clean_mobile(self): #self.instance.pk当前编辑那一行的ID # print(self.instance.pk) txt_mobile = self.cleaned_data["mobile"] # [手机号不能已在数据库,不能重复] # exists = models.PrettyNum.objects.filter(mobile=txt_mobile).exists() # exclude(id=self.instance.pk)排除自己ID以外 #排除自己以外,其他的数据手机号是否重复? exists = models.PrettyNum.objects.exclude(id=self.instance.pk).filter(mobile=txt_mobile).exists() if exists: raise ValidationError("手机号已存在") return txt_mobile
views.py中导入
from app01.utils.form import UserModelForm, PrettyModelForm, PrettyEditModelForm
拆分部门管理、用户管理、靓号管理
在app01/新建views文件夹,app01/views/下新建depart.py、pretty.py、user.py分别用于存放部门管理、靓号管理、用户管理的视图函数
将views.py中的视图函数拆分到depart.py、pretty.py、user.py,并将views.py删除
depart.py
from django.shortcuts import render, redirect from app01 import models from app01.utils.pagination import Pagination from app01.utils.form import UserModelForm, PrettyModelForm, PrettyEditModelForm # Create your views here. def depart_list(request): """部门列表""" # 去数据库中获取所有的部门列表 # 获取到的数据为queryset类型,[对象,对象,对象] queryset = models.Department.objects.all() return render(request, 'depart_list.html', {'queryset': queryset}) def depart_add(request): """添加部门""" if request.method == "GET": return render(request, 'depart_add.html') # 获取用户POST提交过来的数据 title = request.POST.get("title") # 保存到数据库 models.Department.objects.create(title=title) # 重定向回部门列表 return redirect("/depart/list/") def depart_delete(request): """删除部门""" # 获取ID # http://127.0.0.1:8000/depart/delete/?nid=1通过nid传参 nid = request.GET.get('nid') # 删除 models.Department.objects.filter(id=nid).delete() # 跳转回部门列表 return redirect("/depart/list/") def depart_edit(request, nid): """修改部门""" if request.method == "GET": # 根据nid, 获取他的数据 row_object = models.Department.objects.filter(id=nid).first() print(row_object.id, row_object.title) return render(request, 'depart_edit.html', {'row_object': row_object}) # 获取用户提交的标题 title = request.POST.get("title") # 根据ID找到数据库中提交的数据并进行更新 # models.Department.objects.filter(id=nid).update(title=title,其他字段=xxx) models.Department.objects.filter(id=nid).update(title=title) # 跳转回部门列表 return redirect("/depart/list/")
pretty.py
from django.shortcuts import render, redirect from app01 import models from app01.utils.pagination import Pagination from app01.utils.form import UserModelForm, PrettyModelForm, PrettyEditModelForm def prettynum_list(request): """靓号列表""" #循环创建300条数据 # for i in range(300): # models.PrettyNum.objects.create(mobile="15002609022", price=10, level=1, status=1) # # http://127.0.0.1:8000/prettynum/list/?q=0710浏览器传入参数 # value = request.GET.get('q') # #筛选出mobile中包含0710的手机号 # data_dict = {"mobile__contains": "0710"} # res = models.PrettyNum.objects.filter(**data_dict) # print(res) data_dict = {} search_data = request.GET.get('q', "") if search_data: data_dict[ "mobile__contains"] = search_data # res = models.PrettyNum.objects.filter(**data_dict) # print(res) queryset = models.PrettyNum.objects.filter(**data_dict).order_by("-level") page_object = Pagination(request, queryset) context = { "search_data": search_data, 'queryset': page_object.page_queryset, #分完页的数据 "page_string": page_object.html() #生成的页码 } return render(request, 'prettynum_list.html', context) def prettynum_add(request): """添加靓号""" if request.method == "GET": form = PrettyModelForm() return render(request, 'prettynum_add.html', {"form": form}) # POST提交,进行数据校验 form = PrettyModelForm(data=request.POST) if form.is_valid(): # 如果数据合法,保存到数据库 form.save() return redirect('/prettynum/list') # 如果数据不合法,显示错误信息 return render(request, 'prettynum_add.html', {"form": form}) def prettynum_edit(request, nid): """编辑靓号""" row_object = models.PrettyNum.objects.filter(id=nid).first() if request.method == "GET": # 根据ID去数据库获取要编辑的那一行数据(对象) # row_object = models.UserInfo.objects.filter(id=nid).first() # instance = row_object自动将要编辑的那一行数据显示出来 form = PrettyEditModelForm(instance=row_object) return render(request, 'prettynum_edit.html', {'form': form}) # 修改后提交 # 修改数据更新而不是新建 # row_object = models.UserInfo.objects.filter(id=nid).first() form = PrettyEditModelForm(data=request.POST, instance=row_object) if form.is_valid(): # form.save()默认是保存的用户输入的所有数据 # 如果想要在用户输入以外在增加一些值用form.instance.字段名 = 某个值 form.save() return redirect('/prettynum/list/') return render(request, 'prettynum_edit.html', {"form": form}) def prettynum_delete(request, nid): """删除靓号""" models.PrettyNum.objects.filter(id=nid).delete() return redirect('/prettynum/list/')
user.py
from django.shortcuts import render, redirect from app01 import models from app01.utils.pagination import Pagination from app01.utils.form import UserModelForm, PrettyModelForm, PrettyEditModelForm def user_list(request): """用户管理""" # 获取数据库中所有数据列表,得到的为queryset类型,[obj,obj,obj] queryset = models.UserInfo.objects.all() page_object = Pagination(request, queryset, page_size=2) """ #循环拿到数据用python语言 for obj in queryset: # print(obj.id, obj.name, obj.acount, obj.creata_time, type(obj.creata_time)) # type(obj.creata_time)注意:type查看creata_time类型为datatime,需将其转换为字符串 # datatime转换为字符串obj.creata_time.strftime("%Y-%m-%d") # print(obj.id, obj.name, obj.acount, obj.creata_time.strftime("%Y-%m-%d"), obj.get_gender_display()) # obj.gender #取到的是我们自己定义的性别1或2 # obj.get_gender_display()#取到的是性别1或2对应的值男或女 格式就是get_字段名称_display() # 若models.py中定义了level_choices,获取level的值格式就是get_level_display() # print(obj.name, obj.depart.title) # obj.depart_id #取到的为数据库值,1、2、3、4 # obj.depart #根据id自动关联的表中获取那一行数据depart对象 # obj.depart.title # 获取部门id所对应的中文名称 print(obj.id, obj.name, obj.acount, obj.creata_time.strftime("%Y-%m-%d"), obj.get_gender_display(), obj.depart.title) """ context ={ "queryset": page_object.page_queryset, "page_string": page_object.html() , } return render(request, 'user_list.html', context) def user_add(request): """添加用户(原始方式)""" if request.method == "GET": context = { 'gender_choices': models.UserInfo.gender_choices, 'depart_list': models.Department.objects.all() } return render(request, 'user_add.html', context) # 获取用户提交的数据 user = request.POST.get('user') pwd = request.POST.get('pwd') age = request.POST.get('age') acount = request.POST.get('ac') ctime = request.POST.get('ctime') gender = request.POST.get('gd') depart_id = request.POST.get('dp') # 添加到数据库 models.UserInfo.objects.create(name=user, password=pwd, age=age, acount=acount, creata_time=ctime, gender=gender, depart_id=depart_id) # 返回到用户列表页面 return redirect("/user/list/") def user_model_form_add(request): """添加用户(ModelForm版本)""" if request.method == "GET": form = UserModelForm() return render(request, 'user_model_form_add.html', {"form": form}) # 用户POST提交数据,数据校验 form = UserModelForm(data=request.POST) if form.is_valid(): # 如果数据合法,打印数据 print(form.cleaned_data) # 如果数据合法,保存到数据库 form.save() return redirect('/user/list/') # else: # # 如果数据不合法,输出错误信息 # print(form.errors) # 校验失败,在页面上显示错误信息 return render(request, 'user_model_form_add.html', {"form": form}) def user_edit(request, nid): """编辑用户""" row_object = models.UserInfo.objects.filter(id=nid).first() if request.method == "GET": # 根据ID去数据库获取要编辑的那一行数据(对象) # row_object = models.UserInfo.objects.filter(id=nid).first() # instance = row_object自动将要编辑的那一行数据显示出来 form = UserModelForm(instance=row_object) return render(request, 'user_edit.html', {'form': form}) # 修改后提交 # 修改数据更新而不是新建 # row_object = models.UserInfo.objects.filter(id=nid).first() form = UserModelForm(data=request.POST, instance=row_object) if form.is_valid(): # form.save()默认是保存的用户输入的所有数据 # 如果想要在用户输入以外在增加一些值用form.instance.字段名 = 某个值 form.save() return redirect('/user/list/') return render(request, 'user_edit.html', {"form": form}) def user_delete(request, nid): models.UserInfo.objects.filter(id=nid).delete() return redirect('/user/list/')
修改urls.py
将拆分的depart, pretty, user导入
from app01.views import depart, pretty, user
修改为
from django.contrib import admin from django.urls import path from app01 import views from app01.views import depart, pretty, user urlpatterns = [ # path('admin/', admin.site.urls), #部门表 path('depart/list/', depart.depart_list), path('depart/add/', depart.depart_add), path('depart/delete/', depart.depart_delete), # http://127.0.0.1:8000/depart/1/edit/以这种方式传递nid # http://127.0.0.1:8000/depart/13/edit/ path('depart/<int:nid>/edit/', depart.depart_edit), #用户表 path('user/list/', user.user_list), path('user/add/', user.user_add), path('user/model/form/add/', user.user_model_form_add), path('user/<int:nid>/edit/', user.user_edit), path('user/<int:nid>/delete/', user.user_delete), #靓号表 path('prettynum/list/', pretty.prettynum_list), path('prettynum/add/', pretty.prettynum_add), path('prettynum/<int:nid>/edit/', pretty.prettynum_edit), path('prettynum/<int:nid>/delete/', pretty.prettynum_delete), ]
完成