拆分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),
]

完成