文章目录
靓号管理
已学部分
无注释纯享
models.py
class PrettyNum(models.Model):
"""靓号表"""
mobile = models.CharField(verbose_name="手机号",max_length=11)
price = models.IntegerField(verbose_name="价格",null=True,blank=True)
# 允许为空
level_choices = ((5, "ssr"),(4,'s'),(3,'a'),(2,'b'),(1,'c'))
level = models.SmallIntegerField(verbose_name="等级",choices=level_choices,default=5)
status_choices = ((1, "占用"), (2, "未占用"))
status = models.SmallIntegerField(verbose_name="状态",choices=status_choices,default=2)
url.py
from django.contrib import admin
from django.urls import path
from bm01 import views
urlpatterns = [
# 靓号管理
path('plist/', views.plist),
path('padd/', views.prety_add),
path('pretty/<int:dpid>/del', views.pretty_delete),
path('pretty/<int:epid>/edit', views.pretty_edit),
]
views.py
def plist(request):
# 相当于select * from 表 order by level desc;
plist = models.PrettyNum.objects.all().order_by("-level")
return render(request, 'pretty_list.html', {"plist": plist})
from django import forms
class PModelForm(forms.ModelForm):
class Meta:
# fields = ["model", "price", "level", "status"]
fields = '__all__'
model = models.PrettyNum
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
for name, field in self.fields.items():
field.widget.attrs = {"class": "form-control", "placeholder": field.label}
def prety_add(request):
if request == "GET":
pform = PModelForm()
return render(request, 'pretty_add.html', {'form': pform})
pform = PModelForm(request.POST)
if pform.is_valid():
pform.save()
return redirect("/plist/")
return render(request, 'pretty_add.html', {'form': pform})
def pretty_edit(request, epid):
p_obj = models.PrettyNum.objects.filter(id=epid).first()
if request.method == "GET":
pform = PModelForm(instance=p_obj)
return render(request, 'pretty_add.html', {'form': pform})
pform = PModelForm(data=request.POST, instance=p_obj)
if pform.is_valid():
pform.save()
return redirect("/plist/")
return render(request, 'pretty_add.html', {'form': pform})
def pretty_delete(request, dpid):
models.PrettyNum.objects.filter(id=dpid).delete()
return redirect("/plist/")
pretty_list.html
{% extends 'moban.html' %}
{% block mbname %}
<div>
<div class="container">
<div class="bs-example" data-example-id="panel-without-body-with-table">
<div class="panel panel-default">
<!-- Default panel contents -->
<div class="panel-heading"><span class="glyphicon glyphicon-list" aria-hidden="true"></span> 部门列表
</div>
<!-- Table -->
<table class="table table-bordered">
<thead>
<tr>
<th>ID</th>
<th>号码</th>
<th>价格</th>
<th>级别</th>
<th>状态</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for i in plist %}
<tr>
<td>{{ i.id }}</td>
<td>{{ i.mobile }}</td>
<td>{{ i.price }}</td>
<td>{{ i.level }}</td>
<td>{{ i.status }}</td>
<td>
<a class="btn btn-primary btn-xs" href="/pretty/{{ i.id }}/edit">编辑</a>
<a class="btn btn-danger btn-xs" href="/pretty/{{ i.id }}/del">删除</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
</div>
{% endblock %}
pretty_add.html
{% extends 'moban.html' %}
{% block mbname %}
<div>
<div class="container">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">靓号添加</h3>
</div>
<div class="panel-body">
<div class="container">
<form class="form-horizontal" method="post" novalidate>
{% csrf_token %}
{% for field in form %}
<div class="form-group">
<label class="col-sm-2 control-label">{{ field.label }}: </label>
<div class="col-sm-8">
{{ field }}
{{ field.errors.0 }}
</div>
</div>
{% endfor %}
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button type="submit" class="btn btn-primary">提交</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
{% endblock %}
pretty_edit.html
{% extends 'moban.html' %}
{% block mbname %}
<div>
<div class="container">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">靓号编辑</h3>
</div>
<div class="panel-body">
<div class="container">
<form class="form-horizontal" method="post" novalidate>
{% csrf_token %}
{% for field in form %}
<div class="form-group">
<label class="col-sm-2 control-label">{{ field.label }}: </label>
<div class="col-sm-8">
{{ field }}
{{ field.errors.0 }}
</div>
</div>
{% endfor %}
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button type="submit" class="btn btn-primary">提交</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
{% endblock %}
验证
字段正则
判断是否符号手机号格式
from django.core.validators import RegexValidator
# label覆盖掉PrettyNum传过来的verbose_name信息;validators按照正则验证
mobile = forms.CharField(
label="手只因号",
validators=[RegexValidator(r'^[3-9]/d{9}$', '手机号都能输错???')]
)
正则不能操作数据库
钩子方法
定义为必须def clean_字段名(self)
cleaned_data验证后用户输入的所有数据 ,包含使用用户输入的值,获取[“列名”]
self.instance 为当前行的数据库中的数据,id=self.instance.pk ;name=self.instance.name
return 验证通过返回值 ,返回什么数据库就保存什么,覆盖掉mobile的值
输入框的错误提示raise ValidationError(“提示信息”)
判断手机号是否存在,
(add时)
from django.core.exceptions import ValidationError
# 校验方法2 :钩子方法验证
# 必须cleam_字段名
def clean_mobile(self):
# cleaned_data包含使用用户输入的值取mobile
txtm = self.cleaned_data["mobile"]
# .exists()判断手机号是否存在 true/false
existsm = models.PrettyNum.objects.filter(mobile=txtm).exists()
if existsm:
# 验证不通过返回信息
raise ValidationError("错误,手机号已存在:(")
# 验证通过返回值
return txtm
(edit)
self.instance.pk为操作列数据的id
.exclude(id=self.instance.pk)除去自己以外的元素
existsm = models.PrettyNum.objects.exclude(id=self.instance.pk).filter(mobile=txtm).exists()
写在class PModelForm()里面
from django.core.validators import RegexValidator
from django.core.exceptions import ValidationError
class PModelForm(forms.ModelForm):
'''
# 验证方式1,
# label覆盖掉PrettyNum传过来的verbose_name信息;validators按照正则验证
mobile = forms.CharField(
label="手只因号",
validators=[RegexValidator(r'^[3-9]/d{9}$', '手机号都能输错???')]
)
'''
class Meta:
fields = '__all__'
# exclude = ['price',]
# fields = ["mobile", "price", "level", "status"]
model = models.PrettyNum
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
for name, field in self.fields.items():
field.widget.attrs = {"class": "form-control", "placeholder": field.label}
'''
# 校验方法2 :钩子方法验证
# 必须cleam_字段名
def clean_mobile(self):
# cleaned_data包含使用用户输入的值取mobile
txtm=self.cleaned_data["mobile"]
if len(txtm) !=11:
# 验证不通过返回信息
raise ValidationError("错误信息:(")
# 验证通过返回值
return txtm
'''
禁止编辑
显示
mobile = forms.CharField(disabled=True, label=“不让改号”)
class PEditModelForm(forms.ModelForm):
mobile = forms.CharField(disabled=True, label="不让改号")
class Meta:
fields = ["mobile", "price", "level", "status"]
model = models.PrettyNum
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
for name, field in self.fields.items():
field.widget.attrs = {"class": "form-control", "placeholder": field.label}
无法修改手机号
不显示
fields = ["price", "level", "status"]
去掉"mobile", ,没有手机号的框
收索框
预备知识
query1 = PrettyNum.objects.filter(mobile=15576547933, id=4)
print(query1)
# 如果是空字典,表示获取所有
query_dict = {"mobile": "15576547933", "id": 4}
query2 = PrettyNum.objects.filter(**query_dict)
print(query2)
greater than lessequal
PrettyNum.objects.filter(id=4) # 等于4
PrettyNum.objects.filter(id__gt=4) # 大于4
PrettyNum.objects.filter(id__gte=4) # 大于等于4
PrettyNum.objects.filter(id__lt=4) # 小于4
PrettyNum.objects.filter(id__lte=4) # 小于等于4
PrettyNum.objects.filter(mobile__startswith="1999") # 筛选出以"1999"开头的
PrettyNum.objects.filter(mobile__endswith="1999") # 筛选出以"1999"结尾的
PrettyNum.objects.filter(mobile__contains="1999") # 筛选出包含"1999"开头的
实现
view.py
def pretty_list(request):
"""靓号列表"""
#搜素条件 默认为空
data_dict = {}
search_data = request.GET.get('query', "") # 不加后面的 "", 首次访问浏览器,搜索框中不会显示前端页面中的 placeholder="Search for..." 属性
if search_data:
# mobile_contains 表示筛选出字段 mobile 包含 search_data 数据的行
data_dict["mobile__contains"] = search_data
# data_dict 如果是空字典,表示获取所有 ,level降序
pretty_data = PrettyNum.objects.filter(**data_dict).order_by("-level")
# 加入search_data的目的是,当搜索后,搜索框内的值不会置为空
return render(request, "pretty_list.html", {"pretty_data": pretty_data, "search_data": search_data})
pretty_list.html
<form method="get">
<div class="input-group">
<input name="se" type="text" class="form-control" placeholder="Search for..." value="{{ search_data }}">
<span class="input-group-btn">
<button class="btn btn-default" type="submit" >search number</button>
</span>
</div>
</form>
分页
准备
'''
# 添加100行数据
for i in range(100):
models.PrettyNum.objects.create(mobile="1888888888", price=18, level=3, status=1)
'''
分页逻辑
from django.utils.safestring import mark_safe
def plist(request):
"""靓号列表"""
######################## 搜索
dict = {}
search_data = request.GET.get('se', "")
if search_data:
dict = {"mobile__contains": search_data}
####################### 分页
# page当前页
page = int(request.GET.get("page", 1))
page_size = 5
start = (page - 1) * page_size
end = page * page_size
# plist = models.PrettyNum.objects.order_by("-level")[start:end]
# 此时url ...list/?page=5,返回第五页的十行数据
# 计算总页数
total_count = models.PrettyNum.objects.filter(**dict).order_by("-level").count()
# 计算总页数 total_page_count:数据被分为多少页
total_page_count, div = divmod(total_count, page_size)
if div:
total_page_count += 1
# 显示的页码数量
page_show = 5
# 判断页码复合规范
# 页数小于11,能够全部展示
if total_page_count <= 2 * page_show + 1:
page_start = 1
page_end = total_page_count +1
# 页数小于5
elif page <= page_show:
page_start = 1
page_end = 2 * page_show + 1
# 页数大于 max+5
elif page >= total_page_count - page_show:
page_start = total_page_count - 2 * page_show
page_end = total_page_count +1
# 正常
else:
page_start = page - page_show
page_end = page + 1 + page_show
# 页码
page_str_list = []
# 首页
page_str_list.append('<li ><a href="?page={}">首页</a> </li>'.format( 1))
# 上一页
if page > 1:
prev = '<li ><a href="?page={}">上一页</a> </li>'.format(page-1)
else:
prev = '<li><a href="?page={}">上一页</a></li>'.format(1)
page_str_list.append(prev)
# 1到最后一页的li标签生成,,mark_safe把字符串变为安全,---->html代码
for i in range(page_start, page_end):
if i == page:
ele = '<li class="active"><a href="?page={}">{}</a> </li>'.format(i, i)
else:
ele = '<li><a href="?page={}">{}</a></li>'.format(i, i)
page_str_list.append(ele)
# 下一页
if page < total_page_count:
prev = '<li ><a href="?page={}">下一页</a> </li>'.format(page + 1)
else:
prev = '<li><a href="?page={}">下一页</a></li>'.format(total_page_count)
page_str_list.append(prev)
# 尾页
page_str_list.append('<li ><a href="?page={}">尾页</a> </li>'.format(total_page_count))
# 搜索页
ssli=""" <li>
<form class="navbar-form navbar-left" method="get">
<div class="form-group">
<input type="text" class="form-control" placeholder="Search" name="page">
</div>
<button type="submit" class="btn btn-default">Submit</button>
</form>
</li>"""
page_str_list.append(ssli)
page_string = mark_safe("".join(page_str_list))
plist = models.PrettyNum.objects.filter(**dict).order_by("-level")[start:end]
return render(request, 'pretty_list.html',
{"plist": plist,
"search_data": search_data,
"page_string": page_string,
})
html
<div>
<nav >
<ul class="pagination">
{{ page_string }}
</ul>
</nav>
</div>
分页封装 !!!
新建文件 app/untils/pagination.py
将分页的功能封装
写入
# author : Sun; time : 2023/2/8 14:19;
"""
自定义分页组件,以后使用过程中,需要:
在视图函数中:
def pretty_list(request):
# 1.根据自己的情况去筛选自己的数据
queryset = models.PrettyNum.objects.all()
# 2.实例化分页对象
page_object = Pagination(request, queryset)
context = {
"queryset": page_object.page_queryset, # 分完页数据
"page_string": page_object.html(), # 页码
}
# if request.method == "GET": # 以“GET”可以 传参 ?=888, page=1
return render(request, "pretty_list.html", context)
在html中:
# 1.数据
{% for obj in queryset %}
{{ obj.xx }}
{% endfor %}
# 2.分页
<ul class="pagination">
{{ page_string }}
</ul>
"""
from django.utils.safestring import mark_safe
class Pagination(object):
def __init__(self, request, queryset, page_pram='page', page_size=5, page_show=5):
"""
:param request: 请求的对象
:param queryset: 符合条件的数据(根据此数据进行分页处理)
:param page_size: 每页显示多少条数据
:param page_param: 获取在URL中传递的分页参数, 例如: /pretty/list/?page=21
:param page_show: 页码显示前几页后几页
"""
page = request.GET.get(page_pram, "1")
if page.isdecimal():
page = int(page)
else:
print(type(page))
page = 3
self.page = page
self.start = (page - 1) * page_size
self.end = page * page_size
total_count = queryset.count()
total_page_count, div = divmod(total_count, page_size)
if div:
total_page_count += 1
self.total_page_count = total_page_count
self.page_show = page_show
self.page_queryset = queryset[self.start:self.end]
def html(self):
# 判断页码复合规范
# 页数小于11,能够全部展示
if self.total_page_count <= 2 * self.page_show + 1:
page_start = 1
page_end = self.total_page_count + 1
# 页数小于5
elif self.page <= self.page_show:
page_start = 1
page_end = 2 * self.page_show + 1
# 页数大于 max+5
elif self.page >= self.total_page_count - self.page_show:
page_start = self.total_page_count - 2 * self.page_show
page_end = self.total_page_count + 1
# 正常
else:
page_start = self.page - self.page_show
page_end = self.page + 1 + self.page_show
# 页码
page_str_list = []
# 首页
page_str_list.append('<li ><a href="?page={}">首页</a> </li>'.format(1))
# 上一页
if self.page > 1:
prev = '<li ><a href="?page={}">上一页</a> </li>'.format(self.page - 1)
else:
prev = '<li><a href="?page={}">上一页</a></li>'.format(1)
page_str_list.append(prev)
# 1到最后一页的li标签生成,,mark_safe把字符串变为安全,---->html代码
for i in range(page_start, page_end):
if i == self.page:
ele = '<li class="active"><a href="?page={}">{}</a> </li>'.format(i, i)
else:
ele = '<li><a href="?page={}">{}</a></li>'.format(i, i)
page_str_list.append(ele)
# 下一页
if self.page < self.total_page_count:
prev = '<li ><a href="?page={}">下一页</a> </li>'.format(self.page + 1)
else:
prev = '<li><a href="?page={}">下一页</a></li>'.format(self.total_page_count)
page_str_list.append(prev)
# 尾页
page_str_list.append('<li ><a href="?page={}">尾页</a> </li>'.format(self.total_page_count))
# 搜索页
ssli = """ <li>
<form class="navbar-form navbar-left" method="get">
<div class="form-group">
<input type="text" class="form-control" placeholder="Search" name="page">
</div>
<button type="submit" class="btn btn-default">Submit</button>
</form>
</li>"""
page_str_list.append(ssli)
page_string = mark_safe("".join(page_str_list))
return page_string
views.py
def plist(request):
"""靓号列表"""
######################## 搜索 ########
data_dict = {}
search_data = request.GET.get('se', "")
if search_data:
data_dict = {"mobile__contains": search_data}
queryset = models.PrettyNum.objects.filter(**data_dict).order_by("-level")
######################## 搜索end ########
# 生成对象
# request 函数请求的对象
# queryset 将已经查找出的符合条件的数据
page_object = Pagination(request, queryset)
context = {"search_data": search_data,
"plist": page_object.page_queryset, # 调用方法生成 每一页要展示的行对象,分完页的数据,qs类型
"page_string": page_object.html(), # 调用方法生成 分页的html代码(一堆str
}
return render(request, 'pretty_list.html', context)
pretty_list.html
{% for i in plist %}
<tr>
<td>{{ i.id }}</td>
<td>{{ i.mobile }}</td>
<td>{{ i.price }}</td>
<td>{{ i.level }}</td>
<td>{{ i.status }}</td>
<td>
<a class="btn btn-primary btn-xs" href="/pretty/{{ i.id }}/edit">编辑</a>
<a class="btn btn-danger btn-xs" href="/pretty/{{ i.id }}/del">删除</a>
</td>
</tr>
{% endfor %}
....
....
<nav>
<ul class="pagination">
{{ page_string }}
</ul>
</nav>
....
分页+查找
解决问题:url中同时出现 …/?page=xxx&se=xxx
函数中修改url方法
__module __ 属性
import copy
get_object = copy.deepcopy(request.GET)
get_object.__module__ = True
get_object.setlist('page', [4]) #模拟访问page=4时
print(get_object) #获得原来的参数字典
print(get_object.urlencode())#组合原来的url参数
访问…list/?page=7&xxx=%275%27&asd=asd
带着原来的参数,又加上了page=4
修改封装
class Pagination(object):
def __init__(self, request, queryset, page_pram='page', page_size=5, page_show=5):
#添加
import copy
query_dict = copy.deepcopy(request.GET)
query_dict.__module__ = True
self.query_dict = query_dict
url中 去掉page =
修改format
self.query_dict.setlist(self.page_pram, [i])
ele = '<li class="active"><a href="?{}">{}</a> </li>'.format(self.query_dict.urlencode(), i)
完整代码
views.py
from bm01.utils.pagination import Pagination
def plist(request):
"""靓号列表"""
######################## 搜索 ########
data_dict = {}
search_data = request.GET.get('se', "")
if search_data:
data_dict = {"mobile__contains": search_data}
queryset = models.PrettyNum.objects.filter(**data_dict).order_by("-level")
######################## 分页 ########
# 生成对象
# request 函数请求的对象
# queryset 将已经查找出的符合条件的数据
page_object = Pagination(request, queryset)
context = {"search_data": search_data,
"plist": page_object.page_queryset, # 调用方法生成 每一页要展示的行对象,分完页的数据,qs类型
"page_string": page_object.html(), # 调用方法生成 分页的html代码(一堆str
}
return render(request, 'pretty_list.html', context)
preety_list.html
{% extends 'xlayout.html' %}
{% block mbname %}
<div class="container">
<div class="row cle" style="margin-bottom: 20px">
<div class="col-xs-8">
<a href="/padd/" type="button" class="btn btn-success">+添加靓号</a></div>
<div class="col-xs-4">
<form method="get">
<div class="input-group">
<input name="se" type="text" placeholder="Search for..." value="{{ search_data }}">
<span class="input-group-btn">
<button class="btn btn-default" type="submit">search number</button>
</span>
</div>
</form>
</div>
</div>
<div class="bs-example" data-example-id="panel-without-body-with-table">
<div class="panel panel-default">
<!-- Default panel contents -->
<div class="panel-heading"><span class="glyphicon glyphicon-list" aria-hidden="true"></span> 部门列表
</div>
<!-- Table -->
<table class="table table-bordered">
<thead>
<tr>
<th>ID</th>
<th>号码</th>
<th>价格</th>
<th>级别</th>
<th>状态</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for i in plist %}
<tr>
<td>{{ i.id }}</td>
<td>{{ i.mobile }}</td>
<td>{{ i.price }}</td>
<td>{{ i.level }}</td>
<td>{{ i.status }}</td>
<td>
<a class="btn btn-primary btn-xs" href="/pretty/{{ i.id }}/edit">编辑</a>
<a class="btn btn-danger btn-xs" href="/pretty/{{ i.id }}/del">删除</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
<div>
<nav>
<ul class="pagination">
{{ page_string }}
</ul>
</nav>
</div>
</div>
{% endblock %}
封装的使用
对ulist下手!
views.py
ulist.html
效果就来了
.
整合form
新建myproject/employee_management/utils/form.py
修改myproject/employee_management/views.py.
移动views.py.中所有modelform到form.py
删除三个class的init函数
继承Bootstrapmodelform
form.py
# author : Sun; time : 2023/2/8 20:57;
from bm01 import models
from bm01.utils.bsmf import BootStrapModelForm
from django.core.validators import RegexValidator
from django.core.exceptions import ValidationError
class Umodelform(BootStrapModelForm):
#方法一:插件 # 用户名最少三位 ,设置列的别名username,label会覆盖掉之前的设置
# name = forms.CharField(min_length=3,
# label="username",
# widget=forms.TextInput(attrs={'class': 'form-control'})
# )
#
class Meta: # 关键字Meta model,不一样报错
model = models.Userinfo
# fields = ["name", "age", "time"] #可以选择那一列进行填写
fields = '__all__'
'''
# 手动添加属性到attrs中,密码隐藏...
# 方法二:插件
widgets = {
"password": forms.PasswordInput(attrs={'type': "password"})
}
'''
'''
# 方法三:重写子类方法,父类框架的方法先执行,再执行子类
# 重新定义init方法,批量设置,循环ModelForm所有字段 给所有输入框增加样式class
# 原来的会被覆盖掉
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
for name, field in self.fields.items():
field.widget.attrs = {
"class": "form-control",
"placeholder": field.label
}
'''
class PModelForm(BootStrapModelForm):
# 验证方式1,
# label覆盖掉PrettyNum传过来的verbose_name信息;validators按照正则验证
# mobile = forms.CharField(
# label="手只因号",
# validators=[RegexValidator(r'^[3-9]/d{9}$', '手机号都能输错???')]
# )
class Meta:
fields = '__all__'
# exclude = ['price',]
# fields = ["mobile", "price", "level", "status"]
model = models.PrettyNum
# 校验方法2 :钩子方法验证
# 必须cleam_字段名
def clean_mobile(self):
print(self.instance.pk)
# cleaned_data包含使用用户输入的值取mobile
txtm = self.cleaned_data["mobile"]
# .exists()判断手机号是否存在 true/false
existsm = models.PrettyNum.objects.filter(mobile=txtm).exists()
if existsm:
# 验证不通过返回信息
raise ValidationError("添加的手机号已存在:(")
# 验证通过返回值
return txtm
class PEditModelForm(BootStrapModelForm):
# mobile = forms.CharField(disabled=True, label="不让改号")
class Meta:
fields = ["mobile", "price", "level", "status"]
model = models.PrettyNum
def clean_mobile(self):
# cleaned_data包含使用用户输入的值取mobile
txtm = self.cleaned_data["mobile"]
# .exists()判断手机号是否存在 true/false
existsm = models.PrettyNum.objects.exclude(id=self.instance.pk).filter(mobile=txtm).exists()
if existsm:
# 验证不通过返回信息
raise ValidationError("编辑的手机号已存在:(")
# 验证通过返回值
return txtm
优化views
views.py进行拆分
按照部门进行拆分
新建/root/python/myproject/employee_management/views目录
然后在其下依次新建user.py depart.py pretty.py
user.py
# author : Sun; time : 2023/2/8 21:32;
from django.shortcuts import render, redirect
from bm01 import models
from bm01.utils.pagination import Pagination
from bm01.utils.form import Umodelform
def ulist(request):
# 用户列表
ulist = models.Userinfo.objects.all()
user_object = Pagination(request, ulist)
queryset = user_object.page_queryset
page_string = user_object.html()
return render(request, 'ulist.html', {"ulist": queryset, "page_string": page_string})
def uadd(request):
# 增加用户
if request.method == "GET":
# 生成一个Umodelform()类的对象
form = Umodelform()
return render(request, 'uadd.html', {'form': form})
# request.POST包含用户提交所有数据
form = Umodelform(data=request.POST)
# Umodelform取fields中字段来进行校验
if form.is_valid():
# 拿到输入的字段 {'name': 'django', 'password': 'root', 'age': 29, 'account': Decimal('333'),
# 'time': datetime.datetime(2011, 11, 11, 0, 0, tzinfo=<UTC>),'depart': <Department: 技术部>, 'gender': 1}
# print(form.cleaned_data)
# 自动保存到数据库
form.save()
return redirect("/ulist/")
# 这个地方放的form 有原来用户提交的数据,还有错误信息
# print(form.errors)
return render(request, 'uadd.html', {'form': form})
def uedit(request, edid):
# 编辑用户
u_obj = models.Userinfo.objects.filter(id=edid).first()
if request.method == "GET":
edform = Umodelform(instance=u_obj)
return render(request, 'uedit.html', {"form": edform})
edform = Umodelform(data=request.POST, instance=u_obj)
if edform.is_valid():
'''
#默认保存的用户输入的值
#添加用户输入之外的值可以写
form.instance.字段名字 = 字段值
'''
edform.save()
return redirect("/ulist/")
return render(request, 'uedit.html', {"form": edform})
def udel(request):
# 删除部门
nid = request.GET.get('delid')
print(nid)
models.Userinfo.objects.filter(id=nid).delete()
return redirect("/ulist/")
depart.py
# author : Sun; time : 2023/2/8 21:32;
from django.shortcuts import render, redirect
from bm01 import models
def dlist(request):
# 部门列表
bmlist = models.Department.objects.all()
return render(request, 'dlist.html', {"bmlist": bmlist})
def dadd(request):
# 增加部门
if request.method == "GET":
return render(request, 'dadd.html')
title = request.POST.get("title")
models.Department.objects.create(title=title)
return redirect('/dlist/')
def ddel(request):
# 删除部门,
nid = request.GET.get('nid')
models.Department.objects.filter(id=nid).delete()
return redirect("/dlist/")
def dedit(request, edid):
# 编辑部门
if request.method == "GET":
row_object = models.Department.objects.filter(id=edid).first()
return render(request, 'dedit.html', {"rtitle": row_object.title})
title = request.POST.get("title")
models.Department.objects.filter(id=edid).update(title=title)
return redirect('/dlist/')
pretty.py
# author : Sun; time : 2023/2/8 21:34;
from django.shortcuts import render, redirect
from bm01 import models
from bm01.utils.pagination import Pagination
from bm01.utils.form import PModelForm, PEditModelForm
def plist(request):
"""靓号列表"""
######################## 搜索 ########
data_dict = {}
search_data = request.GET.get('se', "")
if search_data:
data_dict = {"mobile__contains": search_data}
queryset = models.PrettyNum.objects.filter(**data_dict).order_by("-level")
######################## 分页 ########
# 生成对象
# request 函数请求的对象
# queryset 将已经查找出的符合条件的数据
page_object = Pagination(request, queryset)
context = {"search_data": search_data,
"plist": page_object.page_queryset, # 调用方法生成 每一页要展示的行对象,分完页的数据,qs类型
"page_string": page_object.html(), # 调用方法生成 分页的html代码(一堆str
}
return render(request, 'pretty_list.html', context)
def prety_add(request):
if request == "GET":
pform = PModelForm()
return render(request, 'pretty_add.html', {'form': pform})
pform = PModelForm(request.POST)
if pform.is_valid():
pform.save()
return redirect("/plist/")
return render(request, 'pretty_add.html', {'form': pform})
def pretty_edit(request, epid):
p_obj = models.PrettyNum.objects.filter(id=epid).first()
if request.method == "GET":
pform = PEditModelForm(instance=p_obj)
return render(request, 'pretty_edit.html', {'form': pform})
pform = PEditModelForm(data=request.POST, instance=p_obj)
if pform.is_valid():
pform.save()
return redirect("/plist/")
return render(request, 'pretty_edit.html', {'form': pform})
def pretty_delete(request, dpid):
models.PrettyNum.objects.filter(id=dpid).delete()
return redirect("/plist/")