当前位置: 首页 > news >正文

Django学习记录04——靓号管理整合

1.靓号表

1.1 表结构

在这里插入图片描述

1.2 靓号表的构造

class PrettyNum(models.Model):''' 靓号表 '''mobile = models.CharField(verbose_name="手机号", max_length=11)# default 默认值# null = true,blank = true   允许为空price = models.IntegerField(verbose_name="价格", default=0)# 号码等级采用choicelevel_choices = ((1, "1级"),(2, "2级"),(3, "3级"),(4, "4级"),)# 默认等级为1level = models.SmallIntegerField(verbose_name="级别", choices=level_choices, default=level_choices[0][0])# 号码状态也采用choicestatus_choices = ((1, "已占用"),(2, "未使用"),)# 默认状态为2(未使用)status = models.SmallIntegerField(verbose_name="状态", choices=status_choices, default=status_choices[1][0])
# 号码等级采用choice
level_choices = (
(1, "1级"),
(2, "2级"),
(3, "3级"),
(4, "4级"),
)
# 默认等级为1
level = models.SmallIntegerField(verbose_name="级别", choices=level_choices, default=level_choices[0][0])
  • 特别注意:choice类型的数据的获取,采用get_xxx_display

  • 默认值的设置

  • 元组的获取:

    ( (1, “1级”),(2, “2级”),(3, “3级”),(4, “4级”) )

    level_choices[0] [0] = 1

    level_choices[0] [1] = “1级”

2.靓号列表及查询操作

number.html

{% extends 'layout.html' %}{% block content %}<div style="margin-bottom: 10px"><a type="button" class="btn btn-success" href="/number/add"><span class="glyphicon glyphicon-plus-sign" aria-hidden="true"></span> 添加靓号</a><div style="width: 300px; float: right"><form method="get" action="/number/list"><div class="input-group"><input type="text" class="form-control" name="mobile" placeholder="Search for..."><span class="input-group-btn"><button class="btn btn-default" type="submit"><span class="glyphicon glyphicon-search"aria-hidden="true"></span></button></span></div></form></div></div><div class="panel panel-default"><div class="panel-heading">靓号列表</div><div class="bs-example" data-example-id="hoverable-table"><table class="table table-hover"><thead><tr><th>ID</th><th>号码</th><th>价格</th><th>级别</th><th>状态</th></tr></thead><tbody>{% for number in NumList %}<tr><td>{{ number.id }}</td><td>{{ number.mobile }}</td><td>{{ number.price }}</td>{# choice 类型采用get_xxx_display  方式获取 #}<td>{{ number.get_level_display }}</td><td>{{ number.get_status_display }}</td><td><a class="btn btn-warning btn-sm" href="/number/{{ number.id }}/update">编辑</a><a class="btn btn-danger btn-sm" href="/number/del?nid={{ number.id }}">删除</a></td></tr>{% endfor %}</tbody></table></div></div>
{% endblock %}

views.py

def number_list(request):""" 靓号列表 """# 利用get获取搜索条件data_dict = {}mobile = request.GET.get('mobile')print(mobile)if mobile:# {关键字: 范围, }data_dict['mobile__contains'] = mobile# date_dict为空时,全部查找   不为空按条件查找NumList = models.PrettyNum.objects.filter(**data_dict).order_by("-level")return render(request, "number_list.html", {"NumList": NumList})

2.1Django中的条件查询

  • 数据排序
order_by("level")  按照level正向排序   由低到高
order_by("-level")  按照level逆向排序   由高到低
  • 条件查询列表

    • 方式1 直接传
    models.PrettyNum.objects.filter(mobile='15588886666', id=2)
    
    • 方式2 传字典 { 关键字:范围, }
    data_dict = {'mobile': '15588886666', 'id': 2}
    models.PrettyNum.objects.filter(**data_dict)
    
  • django中常见的条件

models.PrettyNum.objects.filter(id=2, mobile="15666662222")             # id等于2且 mobile="15666662222"
models.PrettyNum.objects.filter(id__gt=2, mobile__startswith="198")     # id大于2 且 mobile以198开头
models.PrettyNum.objects.filter(id__gte=2, mobile__endswith="999")      # id大于等于2且 mobile以999结尾
models.PrettyNum.objects.filter(id__lt=2, mobile__contains="888")       # id小于2且 mobile包含888
models.PrettyNum.objects.filter(id__lte=2)                              # id小于等于2

2.2条件查询的思路

data_dict = {}
mobile = request.GET.get('mobile')
print(mobile)
if mobile:
# {关键字: 范围, }
data_dict['mobile__contains'] = mobile
# date_dict为空时,全部查找   不为空按条件查找
NumList = models.PrettyNum.objects.filter(**data_dict).order_by("-level")
return render(request, "number_list.html", {"NumList": NumList})
<div style="width: 300px; float: right"><form method="get" action="/number/list"><div class="input-group"><input type="text" class="form-control" name="mobile" placeholder="Search for..."><span class="input-group-btn"><button class="btn btn-default" type="submit"><span class="glyphicon glyphicon-search" aria-hidden="true"></span></button></span></div></form>
</div>

基本思路:采用get方式进行传递查询条件

  • 无条件时

http://localhost:8000/number/list?mobile=

  • 有查询条件时

http://localhost:8000/number/list?mobile=888

基本逻辑:

  1. 前端输入框,将输入的数据以get请求传到后端,后端mobile = request.GET.get('mobile',"")获取到前端传来的数据作为查询条件

  2. 使用字典来接收所有条件

    • 若前端传来的mobile为空,即无查询条件,则条件字典为空,默认查询所有数据
  • 若前端传来的mobile非空,则讲条件添加到条件字典中。本案例使用模糊查询,date_dict={‘‘mobile__contains’’:mobile}mobile字段只要含有获得数据mobile即可

2.3 分页查询操作

2.3.1 原始逻辑

思路:

  • 构建html标签进行页面跳转 可以在python操作查询的数据集,构建标签字符串,传回前端渲染
  • page_list存储每一个
  • 标签
  • page_str 整个页码的标签内容
  • mark_safe使其page_str变得安全,以至于能渲染到html中
  <li><a href="/number/list?page=1">1</a></li> <li><a href="/number/list?page=2">2</a></li><li><a href="/number/list?page=3">3</a></li><li><a href="/number/list?page=4">4</a></li><li><a href="/number/list?page=5">5</a></li>

不加前面路径默认补充当前路径
< a href="/number/list?page=1"> = < a href="?page=1">

  <li><a href="?page=1">1</a></li> <li><a href="?page=2">2</a></li><li><a href="?page=3">3</a></li><li><a href="?page=4">4</a></li><li><a href="?page=5">5</a></li>
# i 表示页码
for i in range(page_start, page_end + 1):#  当前页面选中效果if i == page:li = '<li class="active"><a href="?page= {}">{}</a></li>'.format(i, i)else:li = '<li><a href="?page= {}">{}</a></li>'.format(i, i)page_list.append(li)page_str = mark_safe(''.join(page_list))  # 分页功能的标签(html渲染)return render(request, "number_list.html", {"NumList": NumList, "mobile": mobile, "page_str": page_str})
  • 数据库查询数据的截取

  • NumList = models.PrettyNum.objects.filter(**data_dict).order_by("-level")[data_start:data_end] 截取数据固定部分进行显示,是分页显示的核心

  • 利用get请求(在url中获取page的内容进行页面切换)

<li><a href="/number/list?page=1">1</a></li>
page = int(request.GET.get('page', 1))url:/number/list?page=1   则获取page = 1

页码范围大小、页面大小、首页、尾页、上一页、下一页、跳转页的逻辑判断

  • 变量
page = int(request.GET.get('page', 1))  # 当前页码
page_size = 10  # 每页存放数据大小
data_start = (page - 1) * page_size  # 页面显示数据的起始位置
data_end = page * page_size  # 页面显示数据的末位置# 数据库查询数据
NumList = models.PrettyNum.objects.filter(**data_dict).order_by("-level")[data_start:data_end]  # 数据列表
data_count = models.PrettyNum.objects.filter(**data_dict).count()  # 数据个数
page_count = int(data_count / page_size) + 1  # 页面个数
page_list = []  # 存放每一个<li>标签
  • 首页与尾页
	# 首页first= '<li><a href="?page= {}">首页</a></li>'.format(1)page_list.append(first)# 尾页last = '<li><a href="?page= {}">尾页</a></li>'.format(page_count)page_list.append(last)
  • 上一页与下一页
  first= '<li><a href="?page= {}">首页</a></li>'.format(1)page_list.append(first)# 上一页if page > 1:prev = '<li><a href="?page= {}">上一页</a></li>'.format(page - 1)page_list.append(prev)else:prev = '<li><a href="?page= {}">上一页</a></li>'.format(page)page_list.append(prev)# 下一页if page < page_count:next = '<li><a href="?page= {}">下一页</a></li>'.format(page + 1)page_list.append(next)else:next = '<li><a href="?page= {}">下一页</a></li>'.format(page)page_list.append(next)
  • 页码范围区域+选中页面效果
# 可显示的页面区间
# i 表示页码
for i in range(page_start, page_end + 1):
#  当前页面选中效果
if i == page:li = '<li class="active"><a href="?page= {}">{}</a></li>'.format(i, i)
else:li = '<li><a href="?page= {}">{}</a></li>'.format(i, i)
page_list.append(li)
  • 跳转
      <ul class="pagination">{{ page_str }}<form method="get" style="display: inline-block"><input type="text" name="page" style="width: 50px;height: 32px;margin-left: 2px"><input type="submit" value="跳转"></form></ul>

number_list.html

{% extends 'layout.html' %}{% block content %}<div style="margin-bottom: 10px"><a type="button" class="btn btn-success" href="/number/add"><span class="glyphicon glyphicon-plus-sign" aria-hidden="true"></span> 添加靓号</a><div style="width: 300px; float: right"><form method="get" action="/number/list"><div class="input-group"><input type="text" class="form-control" name="mobile" placeholder="Search for..."value="{{ mobile }}"><span class="input-group-btn"><button class="btn btn-default" type="submit"><span class="glyphicon glyphicon-search" aria-hidden="true"></span></button></span></div></form></div></div><div class="panel panel-default"><div class="panel-heading">靓号列表</div><div class="bs-example" data-example-id="hoverable-table"><table class="table table-hover"><thead><tr><th>ID</th><th>号码</th><th>价格</th><th>级别</th><th>状态</th></tr></thead><tbody>{% for number in NumList %}<tr><td>{{ number.id }}</td><td>{{ number.mobile }}</td><td>{{ number.price }}</td>{# choice 类型采用get_xxx_display  方式获取 #}<td>{{ number.get_level_display }}</td><td>{{ number.get_status_display }}</td><td><a class="btn btn-warning btn-sm" href="/number/{{ number.id }}/update">编辑</a><a class="btn btn-danger btn-sm" href="/number/del?nid={{ number.id }}">删除</a></td></tr>{% endfor %}</tbody></table></div><ul class="pagination">{{ page_str }}<form method="get" style="display: inline-block"><input type="text" name="page" style="width: 50px;height: 32px;margin-left: 2px"><input type="submit" value="跳转"></form></ul></div>
{% endblock %}

views.py

def number_list(request):""" 靓号列表 """# 利用get获取搜索条件data_dict = {}mobile = request.GET.get('mobile', "")if mobile:# {关键字: 范围, }data_dict['mobile__contains'] = mobile# date_dict为空时,全部查找   不为空按条件查找"""分页功能"""# 根据前端get请求获取page    /number/list?page=xxpage = int(request.GET.get('page', 1))  # 当前页码page_size = 10  # 每页存放数据大小data_start = (page - 1) * page_size  # 页面显示数据的起始位置data_end = page * page_size  # 页面显示数据的末位置# 数据库查询数据NumList = models.PrettyNum.objects.filter(**data_dict).order_by("-level")[data_start:data_end]  # 数据列表data_count = models.PrettyNum.objects.filter(**data_dict).count()  # 数据个数page_count = int(data_count / page_size) + 1  # 页面个数page_list = []  # 存放每一个<li>标签"""   页码优化页码的显示    最多显示当前页码的加减五个极值  判断前五页和后五页"""page_num_size = 5  # 最多显示页码的个数# 数据较少,总页面没有达到11页if page_count<=2*page_num_size+1:page_start = 1page_end = page_countelse:if page <= page_num_size:page_start = 1page_end = page_num_size * 2 + 1else:if page + page_num_size >= page_count:page_start = page_count - page_num_size * 2page_end = page_countelse:page_start = page - page_num_sizepage_end = page + page_num_size# 首页first= '<li><a href="?page= {}">首页</a></li>'.format(1)page_list.append(first)# 上一页if page > 1:prev = '<li><a href="?page= {}">上一页</a></li>'.format(page - 1)page_list.append(prev)else:prev = '<li><a href="?page= {}">上一页</a></li>'.format(page)page_list.append(prev)# 可显示的页面区间# i 表示页码for i in range(page_start, page_end + 1):#  当前页面选中效果if i == page:li = '<li class="active"><a href="?page= {}">{}</a></li>'.format(i, i)else:li = '<li><a href="?page= {}">{}</a></li>'.format(i, i)page_list.append(li)# 下一页if page < page_count:next = '<li><a href="?page= {}">下一页</a></li>'.format(page + 1)page_list.append(next)else:next = '<li><a href="?page= {}">下一页</a></li>'.format(page)page_list.append(next)# 尾页last = '<li><a href="?page= {}">尾页</a></li>'.format(page_count)page_list.append(last)page_str = mark_safe(''.join(page_list))  # 分页功能的标签(html渲染)return render(request, "number_list.html", {"NumList": NumList, "mobile": mobile, "page_str": page_str})

2.3.2 小bug

由于页面的条件查询也会在url中拼接一个mobile=xxx,分页查询时拼接的为page=xxx 但是上述代码url中无法同时存在mobile和page两个变量,因此无法实现查询时的分页功能

  • 获取get请求中的所有url

  • http://localhost:8000/number/list?mobile=8888&page=1

  • query_dict = copy.deepcopy(request.GET) copy.deepcopy(request.GET)返回url中所有拼接的变量,以字典的形式返回所有的url value以列表的形式 <QueryDict: {'mobile': ['8888'], 'page': ['1']}>

  • query_dict.urlencode() 将所有的url拼接成字符串 mobile=8888&page=1

  • query_dict._mutable = True 保证含有url的字典能够增加新的关键字,更新url

  • url的更新与拼接

  • 更新url中的变量:query_dict.setlist('page',[xx]) 在原有的url中新增page= xx,value为列表值

  • 拼接url:< li>< a href="/number/list?{}">< /a>< /li>'.format(query_dict.urlencode())

此时query_dict.urlencode()=mobile=8888&page=xx 则代码拼接为/number/list?mobile=8888&page=xx

def number_list(request):............page = int(request.GET.get('page', '1'))  # 当前页码# copy.deepcopy(request.GET)返回url中所有拼接的变量query_dict = copy.deepcopy(request.GET)# 以字典的形式返回所有的url   value以列表的形式print(query_dict)  # <QueryDict: {'page': ['10'], 'age': ['1']}># query_dict.urlencode() 将所有的url拼接成字符串print(query_dict.urlencode())  # page=10&age=1query_dict._mutable = True............# 首页#  往url中加入page变量query_dict.setlist('page',[1])first= '<li><a href="?{}">首页</a></li>'.format(query_dict.urlencode())page_list.append(first)# 上一页if page > 1:query_dict.setlist('page', [page-1])prev = '<li><a href="?{}">上一页</a></li>'.format(query_dict.urlencode())page_list.append(prev)else:query_dict.setlist('page', [page])prev = '<li><a href="?{}">上一页</a></li>'.format(query_dict.urlencode())page_list.append(prev)# 可显示的页面区间# i 表示页码for i in range(page_start, page_end + 1):#  当前页面选中效果if i == page:query_dict.setlist('page', [i])li = '<li class="active"><a href="?{}">{}</a></li>'.format(query_dict.urlencode(), i)else:query_dict.setlist('page', [i])li = '<li><a href="?{}">{}</a></li>'.format(query_dict.urlencode(), i)page_list.append(li)# 下一页if page < page_count:query_dict.setlist('page', [page+1])next = '<li><a href="?{}">下一页</a></li>'.format(query_dict.urlencode())page_list.append(next)else:query_dict.setlist('page', [page])next = '<li><a href="?{}">下一页</a></li>'.format(query_dict.urlencode())page_list.append(next)# 尾页query_dict.setlist('page', [page_count])last = '<li><a href="?{}">尾页</a></li>'.format(query_dict.urlencode())page_list.append(last)# 跳转至search_string = """<li><form style="float: left;margin-left: -1px" method="get"><input name="page"style="position: relative;float:left;display: inline-block;width: 80px;border-radius: 0;"type="text" class="form-control" placeholder="页码"><button style="border-radius: 0" class="btn btn-default" type="submit">跳转</button></form></li>"""page_list.append(search_string)page_str = mark_safe(''.join(page_list))  # 分页功能的标签(html渲染)return render(request, "number_list.html", {"NumList": NumList, "mobile": mobile, "page_str": page_str})

2.3.3 将分页功能包装成分页类组件

  • 分页类组件的创建

项目-app-utils-pagination.py

  • 分页功能类的变量初始化

request: 请求的对象
queryset: 从数据库查出的符合条件的数据(要分页的数据)
page_size: 每页显示多少条数据
page_param: get请求从url中获取分页的参数
page_num_size:显示当前页的前后几页 (page_num_size*2+1为能显示的页码范围)

    def __init__(self, request, queryset, page_size=10, page_param='page', page_num_size=5):# copy.deepcopy(request.GET)返回url中所有拼接的变量# 以字典的形式返回所有的url   value以列表的形式# <QueryDict: {'page': ['10'], 'age': ['1']}>query_dict = copy.deepcopy(request.GET)# query_dict.urlencode() 将所有的url拼接成字符串   page=10&age=1query_dict._mutable = Trueself.query_dict = query_dict# 根据前端get请求获取page    /number/list?page=xx   page不存在时默认返回1self.page_param = page_parampage = request.GET.get(page_param, '1')  # 当前页码# 判断前端get请求传来的page,确保为正整数# 若为10进制数,则转化为int型,否则默认返回首页if page.isdecimal():page = int(page)else:page = 1data_start = (page - 1) * page_size  # 页面显示数据的起始位置data_end = page * page_size  # 页面显示数据的末位置self.page = pageself.page_size = page_sizeself.page_num_size = page_num_sizeself.data_start = data_startself.data_end = data_endself.query_set = queryset[self.data_start:self.data_end]  # 数据进行分页(每页的数据)data_count = queryset.count()  # 从数据库查出的符合条件的数据(要分页的数据)个数page_count = int(data_count / page_size) + 1  # 页面个数self.page_count = page_countself.page_num_size = page_num_size  # 显示当前页的前后几页
  • 创建分页功能页面标签
    def createHtml(self):"""分页功能"""'''在此生成分页标签page_str<li><a href="?page=1">1</a></li><li><a href="?page=2">2</a></li><li><a href="?page=3">3</a></li><li><a href="?page=4">4</a></li><li><a href="?page=5">5</a></li>'''# 数据较少,总页面没有达到11页if self.page_count <= 2 * self.page_num_size + 1:page_start = 1page_end = self.page_countelse:if self.page <= self.page_num_size:page_start = 1page_end = self.page_num_size * 2 + 1else:if self.page + self.page_num_size >= self.page_count:page_start = self.page_count - self.page_num_size * 2page_end = self.page_countelse:page_start = self.page - self.page_num_sizepage_end = self.page + self.page_num_sizepage_list = []# 首页#  往url中加入page变量self.query_dict.setlist('page', [1])first = '<li><a href="?{}">首页</a></li>'.format(self.query_dict.urlencode())page_list.append(first)# 上一页if self.page > 1:self.query_dict.setlist('page', [self.page - 1])prev = '<li><a href="?{}">上一页</a></li>'.format(self.query_dict.urlencode())page_list.append(prev)else:self.query_dict.setlist('page', [self.page])prev = '<li><a href="?{}">上一页</a></li>'.format(self.query_dict.urlencode())page_list.append(prev)# 可显示的页面区间# i 表示页码for i in range(page_start, page_end + 1):#  当前页面选中效果if i == self.page:self.query_dict.setlist('page', [i])li = '<li class="active"><a href="list?{}">{}</a></li>'.format(self.query_dict.urlencode(), i)else:self.query_dict.setlist('page', [i])li = '<li><a href="?{}">{}</a></li>'.format(self.query_dict.urlencode(), i)page_list.append(li)# 下一页if self.page < self.page_count:self.query_dict.setlist('page', [self.page + 1])next = '<li><a href="?{}">下一页</a></li>'.format(self.query_dict.urlencode())page_list.append(next)else:self.query_dict.setlist('page', [self.page])next = '<li><a href="?{}">下一页</a></li>'.format(self.query_dict.urlencode())page_list.append(next)# 尾页self.query_dict.setlist('page', [self.page_count])last = '<li><a href="?{}">尾页</a></li>'.format(self.query_dict.urlencode())page_list.append(last)# 跳转至search_string = """<li><form style="float: left;margin-left: -1px" method="get"><input name="page"style="position: relative;float:left;display: inline-block;width: 80px;border-radius: 0;"type="text" class="form-control" placeholder="页码"><button style="border-radius: 0" class="btn btn-default" type="submit">跳转</button></form></li>"""page_list.append(search_string)page_str = mark_safe(''.join(page_list))  # 分页功能的标签(html渲染)return page_str

2.3.4 组件的使用

自定义的分页组件,以后如果想要使用这个分页组件,你需要做如下几件事:

在视图函数中:

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()       # 生成页码的html标签字符        #
}																		 #
##############################################################################
return render(request, 'pretty_list.html', context)

在HTML页面中

  • 展示数据
{% for obj in queryset %}
{{obj.xx}}
{% endfor %}
  • 分页功能的html标签
<ul class="pagination">{{ page_string }}
</ul>

实例应用

  • 展示视图函数
def number_list(request):# 利用get获取搜索条件data_dict = {}mobile = request.GET.get('mobile', "")if mobile:# {关键字: 范围, }data_dict['mobile__contains'] = mobile# date_dict为空时,全部查找   不为空按条件查找# 数据库查询数据NumList = models.PrettyNum.objects.filter(**data_dict).order_by("-level")  # 带分页的数据列表# 调用分页组件  创建分页的对象page_object = Pagination(request,NumList)context = {"NumList": page_object.query_set,   # 每页的待展示的数据"mobile": mobile,"page_str": page_object.createHtml()  # 分页功能的标签(html渲染)按钮}return render(request, "number_list.html", context)
  • html页面
{% extends 'layout.html' %}{% block content %}<div style="margin-bottom: 10px"><a type="button" class="btn btn-success" href="/number/add"><span class="glyphicon glyphicon-plus-sign"aria-hidden="true"></span> 添加靓号</a><div style="width: 300px; float: right"><form method="get" action="/number/list"><div class="input-group"><input type="text" class="form-control" name="mobile" placeholder="Search for..."value="{{ mobile }}"><span class="input-group-btn"><button class="btn btn-default" type="submit"><span class="glyphicon glyphicon-search"aria-hidden="true"></span></button></span></div></form></div></div><div class="panel panel-default"><div class="panel-heading">靓号列表</div><div class="bs-example" data-example-id="hoverable-table"><table class="table table-hover"><thead><tr><th>ID</th><th>号码</th><th>价格</th><th>级别</th><th>状态</th></tr></thead><tbody>{% for number in NumList %}<tr><td>{{ number.id }}</td><td>{{ number.mobile }}</td><td>{{ number.price }}</td>{# choice 类型采用get_xxx_display  方式获取 #}<td>{{ number.get_level_display }}</td><td>{{ number.get_status_display }}</td><td><a class="btn btn-warning btn-sm" href="/number/{{ number.id }}/update">编辑</a><a class="btn btn-danger btn-sm" href="/number/del?nid={{ number.id }}">删除</a></td></tr>{% endfor %}</tbody></table></div><ul class="pagination">{{ page_str }}</ul></div>
{% endblock %}

3.靓号的添加操作

number_add.html

{% extends 'layout.html' %}{% block content %}<div class="panel panel-default"><div class="panel-heading">靓号添加</div><div class="panel-body"><div class="bs-example" data-example-id="simple-form-inline"><form class="form" method="post" action="/number/add" novalidate>{% csrf_token %}{#创建表单,form为userinfo各字段的表单#}{#每一个field都是一个字段的输入框#}{% for field in form %}<div class="form-group"><label>{{ field.label }}</label>{{ field }}<span style="color: red">{{ field.errors.0 }}</span>{#field.errors.0显示第一条错误即可#}</div>{% endfor %}<input type="submit" class="btn btn-success" value="提交"></form></div></div></div>
{% endblock %}

views.py

class number_ModelForm(forms.ModelForm):class Meta:model = models.PrettyNumfields = ['mobile', 'price', 'level', 'status']def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)for key, value in self.fields.items():value.widget.attrs = {'class': 'form-control', "placeholder": value.label}# 校验方式2:钩子方法def clean_mobile(self):# txt_mobile 表示用户输入的数据,即待校验数据txt_mobile = self.cleaned_data['mobile']# 判断是否满足校验规则# ① 手机号格式 re.search(r'^\d{11}$', txt_mobile)# ② 手机号不能重复 flag = models.PrettyNum.objects.filter(mobile=txt_mobile).exists()flag = models.PrettyNum.objects.filter(mobile=txt_mobile).exists()# 以下 判断出自己以外的mobile是否存在# form = number_editModelForm(instance=row_date) 调用该类是传入instance(待操作的数据行);self.instance.pk(待操作的数据行的id)# flag = models.PrettyNum.objects.exclude(id=self.instance.pk).filter(mobile=txt_mobile).exists()if (re.match(r'^\d{11}$', txt_mobile)) and not flag:# 校验通过,返回输入数据return txt_mobileelif not re.match(r'^\d{11}$', txt_mobile):raise ValidationError("格式错误")else:raise ValidationError("手机号已存在")def number_add(request):"""靓号添加"""if request.method == "GET":# 创建number_ModelForm的表单对象,返回值为一个表单form = number_ModelForm()print(form)return render(request, "number_add.html", {'form': form})form = number_ModelForm(request.POST)if form.is_valid():form.save()return redirect('/number/list')return render(request, 'number_add.html', {'form': form})

3.1 校验的两种方法

3.1.1 正则表达式方法

# 校验方式1:利用正则表达式增加手机号有效规则
mobile = forms.CharField(
label='手机号',
validators=[RegexValidator(r'^\d{11}$', '手机格式错误'), ]
)

方法一:利用正则表达式重新定义mobile字段

validators验证器
r'^\d{11}$'   11位数字
r 表示原生字符串(rawstring),该字符串声明了引号中的内容表示该内容的原始含义,避免了多次转义造成的反斜杠困扰。

3.1.2钩子函数

# 校验方式2:钩子方法def clean_mobile(self):# txt_mobile 表示用户输入的数据,即待校验数据txt_mobile = self.cleaned_data['mobile']# 判断是否满足校验规则# ① 手机号格式 re.search(r'^\d{11}$', txt_mobile)# ② 手机号不能重复 flag = models.PrettyNum.objects.filter(mobile=txt_mobile).exists()flag = models.PrettyNum.objects.filter(mobile=txt_mobile).exists()# 以下 判断出自己以外的mobile是否存在# form = number_editModelForm(instance=row_date) 调用该类是传入instance(待操作的数据行);self.instance.pk(待操作的数据行的id)# flag = models.PrettyNum.objects.exclude(id=self.instance.pk).filter(mobile=txt_mobile).exists()if (re.match(r'^\d{11}$', txt_mobile)) and not flag:# 校验通过,返回输入数据return txt_mobileelif not re.match(r'^\d{11}$', txt_mobile):raise ValidationError("格式错误")else:raise ValidationError("手机号已存在")

方法二:钩子函数

  • txt_mobile 表示用户输入的数据,即待校验数据

txt_mobile = self.cleaned_data['mobile']

  • 判断是否满足校验规则

① 手机号格式 re.search(r'^\d{11}$', txt_mobile)

re.match(r'^\d{11}$', txt_mobile)

② 手机号不能重复 flag = models.PrettyNum.objects.filter(mobile=txt_mobile).exists()

  • 判断除自己以外的mobile是否存在(除去自己的mobile是否还有和自己一样的mobile)

flag = models.PrettyNum.objects.exclude(id=self.instance.pk).filter(mobile=txt_mobile).exists()

self.instance.pk 能获取待操作的数据行的id

3.2 时间插件

<link rel="stylesheet" href="static/plugins/bootstrap-3.4.1/css/bootstrap.css">
<link rel="stylesheet" href="static/plugins/bootstrap-datepicker/css/bootstrap-datepicker.css"><input type="text" id="dt" class="form-control" placeholder="入职日期"><script src="static/js/jquery-3.6.0.min.js"></script>
<script src="static/plugins/bootstrap-3.4.1/js/bootstrap.js"></script>
<script src="static/plugins/bootstrap-datepicker/js/bootstrap-datepicker.js"></script>
<script src="static/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.zh-CN.min.js"></script><script>$(function () {$('#dt').datepicker({   //#id  日期选择器应用输入框的idformat: 'yyyy-mm-dd',  // 显示格式//startDate: '0',       /日期选择的起始时间为目前时间,若想选择以前的时间注释掉  language: "zh-CN",autoclose: true   //选择完日期,时间框自动消失});})
</script>

4.靓号的更新操作

number_update.html

{% extends 'layout.html' %}{% block content %}<div class="panel panel-default"><div class="panel-heading">号码编辑</div><div class="panel-body"><div class="bs-example" data-example-id="simple-form-inline"><form class="form" method="post" action="/number/{{ nid }}/update" novalidate>{% csrf_token %}{% for field in form %}<div class="form-group"><label>{{ field.label }}</label>{{ field }}<span style="color: red">{{ field.errors.0 }}</span>{# field.errors.0显示第一条错误即可 #}</div>{% endfor %}<input type="submit" class="btn btn-success" value="提交"></form></div></div></div>
{% endblock %}

views.py

class number_editModelForm(forms.ModelForm):# 校验方式1:利用正则表达式增加手机号有效规则mobile = forms.CharField(disabled=True,  # 更新时,新增手机号无法修改规则label='手机号',# validators验证器# r'^\d{11}$' 11位数字# r 表示原生字符串(rawstring),该字符串声明了引号中的内容表示该内容的原始含义,避免了多次转义造成的反斜杠困扰。validators=[RegexValidator(r'^\d{11}$', '手机格式错误'), ])class Meta:model = models.PrettyNumfields = ['mobile', 'price', 'level', 'status']def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)for key, value in self.fields.items():value.widget.attrs = {'class': 'form-control', "placeholder": value.label}def number_update(request, nid):row_date = models.PrettyNum.objects.filter(id=nid).first()if request.method == "GET":form = number_editModelForm(instance=row_date)return render(request, 'number_update.html', {'form': form, 'nid': nid})form = number_editModelForm(data=request.POST, instance=row_date)if form.is_valid():form.save()return redirect('/number/list')return render(request, 'number_update.html', {'form': form, 'nid': nid})
  • 利用正则表达式增加手机号有效规则
```
mobile = forms.CharField(disabled=True,  # 更新时,新增手机号无法修改规则label='手机号',validators验证器r'^\d{11}$' 11位数字r 表示原生字符串(rawstring),该字符串声明了引号中的内容表示该内容的原始含义,避免了多次转义造成的反斜杠困扰。validators=[RegexValidator(r'^\d{11}$', '手机格式错误'), ]
)
```**新增规则:** disabled=True,  # 更新时,新增一个手机号无法修改的规则**更新获取id的url格式:**`http://localhost:8000/number/nid/update`

5.靓号的删除操作

views.py

def number_del(request):# http://localhost:8000/number/del?nid=xx# get形式获取idnid = request.GET.get('nid')models.PrettyNum.objects.filter(id=nid).delete()return redirect('/number/list')

6.项目文件的整合

同类文件提取,然后合并一个新文件中

切勿忘记引入

6.1 对ModelForm增加样式的BootStrap整合

以自定义初始函数的方式为例

项目-app-utils-bootstrap.py

  1. 提取ModelForm类中自定义初始函数
  2. 自定义ModelForm类时对BootStrapModelForm类进行继承

bootstrap.py

class BootStrapModelForm_user(forms.ModelForm):def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)# 循环找到所有的插件,添加了class="form-control"for key, value in self.fields.items():#  加样式if key == "creat_time":# python中当前时间并且格式化形式datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")# django模板语言当前时间并且格式形式 {% now 'Y-m-d' %}  或  {{ user.creat_time|date:"Y-m-d" }}value.widget.attrs = {"class": "form-control", "placeholder": value.label,"value": datetime.datetime.now().strftime("%Y-%m-%d"),"id": "dt_creat_time"}else:value.widget.attrs = {"class": "form-control", "placeholder": value.label}class BootStrapModelForm_number(forms.ModelForm):def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)for key, value in self.fields.items():value.widget.attrs = {'class': 'form-control', "placeholder": value.label}

6.2定义ModelForm类的整合

项目-app-utils-form.py

form.py

class user_ModelForm(BootStrapModelForm_user):password = forms.CharField(min_length=6, label="密码")class Meta:model = models.UserInffields = ['name', 'password', 'age', 'account', 'creat_time', 'gender', 'depart']class number_ModelForm(BootStrapModelForm_number):class Meta:model = models.PrettyNumfields = ['mobile', 'price', 'level', 'status']def clean_mobile(self):txt_mobile = self.cleaned_data['mobile']flag = models.PrettyNum.objects.filter(mobile=txt_mobile).exists()if (re.match(r'^\d{11}$', txt_mobile)) and not flag:return txt_mobileelif not re.match(r'^\d{11}$', txt_mobile):raise ValidationError("格式错误")else:raise ValidationError("手机号已存在")class number_editModelForm(BootStrapModelForm_number):mobile = forms.CharField(disabled=True,label='手机号',validators=[RegexValidator(r'^\d{11}$', '手机格式错误'), ])class Meta:model = models.PrettyNumfields = ['mobile', 'price', 'level', 'status']

6.3对views视图函数的整合

  1. 各视图函数进行归类划分将对应函数转移到对应的文件中,文件位置在项目-app-views-xxx.py
  • 部门管理

将对应函数转移到对应的文件中

depart.py

from django.shortcuts import render, redirectfrom app01 import models
def depart_list(request):""" 部门列表 """'''获取数据部门信息'''depart_list = models.Department.objects.all()return render(request, "depart_list.html", {"depart_list": depart_list})
def depart_add(request):""" 部门添加 """if request.method == 'GET':return render(request, "depart_add.html")title = request.POST.get("title")models.Department.objects.create(title=title)return redirect('/depart/list')
def depart_del(request):"""部门删除"""# http://localhost:8000/depart/del?nid=idnid = request.GET.get("nid")models.Department.objects.filter(id=nid).delete()return redirect('/depart/list')
def depart_update(request, nid):# http://localhost:8000/depart/nid/update"""部门编辑"""if request.method == 'GET':dept = models.Department.objects.filter(id=nid).get()return render(request, "depart_update.html", {"dept": dept})title = request.POST.get("title")models.Department.objects.filter(id=nid).update(title=title)return redirect('/depart/list')
  • 员工管理

将对应函数转移到对应的文件中

user.py

from django.shortcuts import render, redirect
from app01.utils.form import user_ModelForm
from app01 import modelsdef user_list(request):'''获取用户信息'''user_list = models.UserInfo.objects.all()# print(user_list)return render(request, "user_list.html", {"user_list": user_list})def user_add(request):'''新增员工'''if request.method == 'GET':context = {"depart_list": models.Department.objects.all(),"gender_list": models.UserInfo.gender_choice,}return render(request, "user_add.html", context)# 缺少数据校验和错误提示# 前端的每一个字段都得写一遍# 关联的数据,需要手动获取并循环展示name = request.POST.get("name")password = request.POST.get("pwd")age = request.POST.get("age")account = request.POST.get("account")creat_time = request.POST.get("creat_time")gender = request.POST.get("gender")depart_id = request.POST.get("depart")models.UserInfo.objects.create(name=name, password=password, age=age, account=account, creat_time=creat_time,gender=gender, depart_id=depart_id)return redirect('/user/list')###################################################################def user_ModelForm_add(request):if request.method == 'GET':# form为userinfo各字段的表单form = user_ModelForm()# print(form)return render(request, "user_ModelForm_add.html", {"form": form})# 将前端表单的post请求,直接传入form对象中form = user_ModelForm(request.POST)# 判断数据是否合法有效(校验规则————models中建表表项规则 + class user_ModelForm(forms.ModelForm)重新定义表项规则)if form.is_valid():# 将表单保存到数据库中  1111form.save()return redirect('/user/list')# 校验失败(在页面显示错误信息) form.error()含有错误return render(request, "user_ModelForm_add.html", {"form": form})def user_del(request):""" 员工删除"""nid = request.GET.get("nid")models.UserInfo.objects.filter(id=nid).delete()return redirect("/user/list")def user_update(request, nid):"""员工更新"""if request.method == "GET":context = {"depart_list": models.Department.objects.all(),"gender_list": models.UserInfo.gender_choice,"user": models.UserInfo.objects.get(id=nid),}return render(request, "user_update.html", context)name = request.POST.get("name")password = request.POST.get("pwd")age = request.POST.get("age")account = request.POST.get("account")creat_time = request.POST.get("creat_time")gender = request.POST.get("gender")depart_id = request.POST.get("depart")models.UserInfo.objects.filter(id=nid).update(name=name, password=password, age=age, account=account,creat_time=creat_time, gender=gender, depart_id=depart_id)return redirect("/user/list")def user_ModelForm_update(request, nid):""" 编辑用户 """# 根据nid取数据库获取要编辑的哪一行数据(行对象)row_user = models.UserInfo.objects.filter(id=nid).first()if request.method == "GET":# form为userinfo各字段的表单# instance=row_user并将row_user中各字段的数据赋值给form中各字段的值form = user_ModelForm(instance=row_user)return render(request, "user_ModelForm_update.html", {"form": form, "nid": nid})# 将前端表单的post请求,直接传入form对象中# 接收从前端传来的数据,并且在row_user的基础上保存在数据库    instance=row_user替换待修改的那一行数据,而不是新增form = user_ModelForm(data=request.POST, instance=row_user)print(form)# 判断数据是否合法有效(校验规则————models中建表表项规则 + class user_ModelForm(forms.ModelForm)重新定义表项规则)if form.is_valid():# 将表单保存到数据库中form.save()return redirect('/user/list')# 校验失败(在页面显示错误信息) form.error()含有错误return render(request, "user_ModelForm_update.html", {"form": form, "nid": nid})
  • 靓号管理

将对应函数转移到对应的文件中

number.py

from django.shortcuts import render, redirect
from app01.utils.form import number_ModelForm,number_editModelForm
from app01.utils.pagination import Pagination
from app01 import modelsdef number_list(request):""" 靓号列表 """# 良好等级高低展示"""order_by("level")  按照level正向排序   由低到高order_by("-level")  按照level逆向排序   由高到低"""""" 条件显示列表# 方式1 直接传models.PrettyNum.objects.filter(mobile='15588886666', id=2)# 方式2 传字典{关键字:范围,}data_dict = {'mobile': '15588886666', 'id': 2}models.PrettyNum.objects.filter(**data_dict)""""""django中常见的条件models.PrettyNum.objects.filter(id=2, mobile="15666662222")             # id等于2且 mobile="15666662222"models.PrettyNum.objects.filter(id__gt=2, mobile__startswith="198")     # id大于2 且 mobile以198开头models.PrettyNum.objects.filter(id__gte=2, mobile__endswith="999")      # id大于等于2且 mobile以999结尾models.PrettyNum.objects.filter(id__lt=2, mobile__contains="888")       # id小于2且 mobile包含888models.PrettyNum.objects.filter(id__lte=2)                              # id小于等于2"""# 利用get获取搜索条件data_dict = {}mobile = request.GET.get('mobile', "")if mobile:# {关键字: 范围, }data_dict['mobile__contains'] = mobile# date_dict为空时,全部查找   不为空按条件查找# 数据库查询数据NumList = models.PrettyNum.objects.filter(**data_dict).order_by("-level")  # 带分页的数据列表# 调用分页组件  创建分页的对象page_object = Pagination(request, NumList)context = {"NumList": page_object.query_set,  # 每页的待展示的数据"mobile": mobile,"page_str": page_object.createHtml()  # 分页功能的标签(html渲染)按钮}return render(request, "number_list.html", context)def number_add(request):"""靓号添加"""if request.method == "GET":# 创建number_ModelForm的表单对象,返回值为一个表单form = number_ModelForm()print(form)return render(request, "number_add.html", {'form': form})form = number_ModelForm(request.POST)if form.is_valid():form.save()return redirect('/number/list')return render(request, 'number_add.html', {'form': form})def number_update(request, nid):row_date = models.PrettyNum.objects.filter(id=nid).first()if request.method == "GET":form = number_editModelForm(instance=row_date)return render(request, 'number_update.html', {'form': form, 'nid': nid})form = number_editModelForm(data=request.POST, instance=row_date)if form.is_valid():form.save()return redirect('/number/list')return render(request, 'number_update.html', {'form': form, 'nid': nid})def number_del(request):# http://localhost:8000/number/del?nid=xx# get形式获取idnid = request.GET.get('nid')models.PrettyNum.objects.filter(id=nid).delete()return redirect('/number/list')
  1. 删除views.py
  2. 修改对应urls.py
from django.urls import pathfrom app01.views import depart,user,numberurlpatterns = [#path('admin/', admin.site.urls),# 部门管理path('depart/list', depart.depart_list),path('depart/add', depart.depart_add),path('depart/del', depart.depart_del),path('depart/<int:nid>/update', depart.depart_update),# 用户管理path('user/list', user.user_list),path('user/add', user.user_add),path('user/ModelForm/add', user.user_ModelForm_add),path('user/del', user.user_del),path('user/<int:nid>/update', user.user_update),path('user/ModelForm/<int:nid>/update', user.user_ModelForm_update),# 靓号管理path('number/list',number.number_list),path('number/add',number.number_add),path('number/<int:nid>/update',number.number_update),path('number/del',number.number_del),
]

6.4项目结构

在这里插入图片描述

相关文章:

Django学习记录04——靓号管理整合

1.靓号表 1.1 表结构 1.2 靓号表的构造 class PrettyNum(models.Model): 靓号表 mobile models.CharField(verbose_name"手机号", max_length11)# default 默认值# null true&#xff0c;blank true 允许为空price models.IntegerField(verbose_name"价…...

AD9226 65M采样 模数转换

目录 AD9220_ReadTEST AD9220_ReadModule AD9226_TEST_tb 自己再写个 260M的时钟&#xff0c;四分频来提供65M的时钟。 用 vivado 写的 AD9226_ReadTEST module AD9226_ReadTEST( input clk, input rstn,output clk_driver, //模块时钟管脚 input [12:0]IO_data, //模块数…...

远程控制桌面,让电脑办公更简单

随着科技的不断发展&#xff0c;远程办公已经成为了越来得越多企业和个人的选择。远程控制电脑办公&#xff0c;仅需1款软件即可轻松get&#xff01; 1.绿虫电脑管理软件 是一款功能强大的办公电脑管理软件&#xff0c;仅需安装在被控端电脑&#xff0c;主控端通过网页登录后…...

猫头虎分享已解决Bug || 网络连接问题:NetworkError: Failed to fetch

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …...

Layer1 明星项目 Partisia Blockchain 何以打造互操作、可创新的数字经济网络

我们的目标是创建一个以用户为中心的全新数字经济网络&#xff1a;在去信任化和公平透明的环境下&#xff0c;所有的隐私数据都能够得到天然保障&#xff0c;企业、用户等各角色的协作与共享将会更顺利地进行。 —— Partisia Blockchain 团队 作为一个以 Web3 安全为技术方向的…...

用CSS制作弧形卡片的三种创意方法!

在平时开发中&#xff0c;有时候会碰到下面这种“弧形”样式&#xff0c;主要分为“内凹”和“外凸”两种类型&#xff0c;如下 该如何实现呢&#xff1f;或者想一下&#xff0c;有哪些 CSS 属性和“弧形”有关&#xff1f;下面介绍 3 种方式&#xff0c;一起看看吧 一、borde…...

守护健康之光 —— 小脑萎缩患者的生活指南

生活中&#xff0c;我们或许会遇到一些特殊的挑战&#xff0c;而面对这些挑战时&#xff0c;了解和掌握正确的应对策略至关重要。今天&#xff0c;我们要聊一聊一个较为少见却不容忽视的话题——小脑萎缩。这不仅是患者的战役&#xff0c;也是家人和社会共同的关怀课题。下面&a…...

CSS选择器:让样式精确命中目标

CSS选择器&#xff1a;让样式精确命中目标 在网页开发中&#xff0c;CSS选择器是一种强大的工具&#xff0c;它可以帮助我们精确地定位HTML元素&#xff0c;以便为它们应用样式。在这篇博客中&#xff0c;我们将探讨一些常见的CSS选择器&#xff0c;了解它们的功能和使用方法。…...

前端不传被删记录的id怎么删除记录,或子表如何删除记录

1.删除主表相关子表所有记录 2.再保存一次前端传来的记录 3.如果子表是通过先生成空记录&#xff0c;再put修改模式&#xff0c;可以在执行1和2两步后再拿模板集合和当前现有子表集合套两个for循环对比判断&#xff0c;count记录模板记录和子表记录每次循环重合次数&#xff…...

axios的基本特性用法

1. axios的基本特性 axios 是一个基于Promise用于浏览器和node.js的HTTP客户端。 它具有以下特征&#xff1a; 支持浏览器和node.js支持promiseAPI自动转换JSON数据能拦截请求和响应请求转换请求数据和响应数据&#xff08;请求是可以加密&#xff0c;在返回时也可进行解密&…...

打印水仙花数---c语言刷题

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 题述 求出0&#xff5e;100000之间的所有“水仙花数”并输出。 “水仙花数”是指一个n位数&#xff0c;其各位数字的n次方之和确好等于该数本身&#xff0c;如:153&#…...

springboot基础(82):分布式定时任务解决方案shedlock

文章目录 前言简介shedlock dbSchedulerLock注解说明 shedlock redis遇到的问题1.配置shedlock不生效2.报错net/javacrumbs/shedlock/core/LockProvider shedlock升级高版本同名定时任务 前言 多节点或者多服务器拥有相同的定时任务&#xff0c;这种情况下&#xff0c;不同节…...

【Golang】Gorm乐观锁optimisticlock的使用

在数据库操作中&#xff0c;为了保证数据的一致性和完整性&#xff0c;常常需要采取一些措施来防止并发操作导致的数据冲突。悲观锁和乐观锁是两种常见的并发控制机制。 悲观锁&#xff08;Pessimistic Lock&#xff09; 悲观锁的基本假设是&#xff0c;数据在并发访问时很可能…...

Apache Doris 发展历程、技术特性及云原生时代的未来规划

本文节选自《基础软件之路&#xff1a;企业级实践及开源之路》一书&#xff0c;该书集结了中国几乎所有主流基础软件企业的实践案例&#xff0c;由 28 位知名专家共同编写&#xff0c;系统剖析了基础软件发展趋势、四大基础软件&#xff08;数据库、操作系统、编程语言与中间件…...

2024-02-26(Spark,kafka)

1.Spark SQL是Spark的一个模块&#xff0c;用于处理海量结构化数据 限定&#xff1a;结构化数据处理 RDD的数据开发中&#xff0c;结构化&#xff0c;非结构化&#xff0c;半结构化数据都能处理。 2.为什么要学习SparkSQL SparkSQL是非常成熟的海量结构化数据处理框架。 学…...

RubyMine 2023:让Ruby编程变得更简单 mac/win版

JetBrains RubyMine 2023是一款专为Ruby开发者打造的强大集成开发环境&#xff08;IDE&#xff09;。这款工具集成了许多先进的功能&#xff0c;旨在提高Ruby编程的效率和生产力。 RubyMine 2023软件获取 RubyMine 2023的智能代码编辑器提供了丰富的代码补全和提示功能&#…...

低功耗设计——门控时钟

1. 前言 芯片功耗组成中&#xff0c;有高达40%甚至更多是由时钟树消耗掉的。这个结果的原因也很直观&#xff0c;因为这些时钟树在系统中具有最高的切换频率&#xff0c;而且有很多时钟buffer&#xff0c;而且为了最小化时钟延时&#xff0c;它们通常具有很高的驱动强度。此外&…...

《凤凰架构》-本地事务章节 读书笔记

1、写锁又名排它锁&#xff0c;写锁禁止其他事务施加读锁和写锁&#xff0c;而不禁止其他事务读取数据&#xff08;如果遇到了个不加任何锁的另一个事务2&#xff0c;写锁是无法阻止事务2读取数据的&#xff09;&#xff0c;这就是读未提交隔离级别中的脏读问题产生的根因。 2…...

ruby对比python,30分钟教程

会python还需要搞会ruby吗&#xff1f; web方面&#xff1a;ruby有rails&#xff0c;python有flask,django&#xff0c;rails远超django Ruby&#xff0c;一种简单快捷的面向对象&#xff08;面向对象程序设计&#xff09;脚本语言&#xff0c;在20世纪90年代由日本人松本行弘…...

C语言——oj刷题——判断闰年

当我们谈到判断闰年时&#xff0c;我们通常会遵循以下规则&#xff1a;闰年是指能被4整除但不能被100整除的年份&#xff0c;或者能被400整除的年份。在C语言中&#xff0c;我们可以通过编写一个简单的程序来实现这一功能。下面是一个示例代码&#xff0c;用于判断一个给定年份…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中&#xff0c;理解API&#xff08;应用程序接口&#xff09;和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能&#xff0c;使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

LabVIEW双光子成像系统技术

双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制&#xff0c;展现出显著的技术优势&#xff1a; 深层组织穿透能力&#xff1a;适用于活体组织深度成像 高分辨率观测性能&#xff1a;满足微观结构的精细研究需求 低光毒性特点&#xff1a;减少对样本的损伤…...

Caliper 配置文件解析:fisco-bcos.json

config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...

Spring Boot + MyBatis 集成支付宝支付流程

Spring Boot MyBatis 集成支付宝支付流程 核心流程 商户系统生成订单调用支付宝创建预支付订单用户跳转支付宝完成支付支付宝异步通知支付结果商户处理支付结果更新订单状态支付宝同步跳转回商户页面 代码实现示例&#xff08;电脑网站支付&#xff09; 1. 添加依赖 <!…...