靓号管理
- 靓号列表显示
-
- 表结构
- 根据表结构的需求,在models.py中创建类
- URL.py编写
- [views.py中 函数编写](#views.py中 函数编写)
- 列表显示HTML
- 页面效果
- 新建靓号编写(添加)
- 编辑靓号
- 编辑靓号和添加靓号时,数据校验的要求不相同
- 删除靓号
靓号列表显示
表结构
列名有哪些
- id
- mobile
- level(choice)------类似于性别
- status------1表示未占用,2表示已占用
根据表结构的需求,在models.py中创建类
代码如下:
python
class PrettyNum(models.Model):
# 靓号表
mobile=models.CharField(verbose_name='手机号',max_length=32)
# 想要参数为空添加null=True,blank=True
price=models.IntegerField(verbose_name='价格')
level_choices=(
(1,'1级'),
(2,'2级'),
(3,'3级'),
(4,'4级'),
)
#默认等级为default=1
level=models.SmallIntegerField(verbose_name='级别',choices=level_choices,default=1)
status_choices=(
(1,'已占用'),
(2,'未占用')
)
status=models.SmallIntegerField(verbose_name='状态',choices=status_choices,default=2)
URL.py编写
python
urlpatterns = [
#靓号列表
path('pretty/list/', views.pretty_list),
]
views.py中 函数编写
代码如下:
python
#靓号列表
def pretty_list(request):
#搜索时没有条件就传入空字典,也就相当于.all()
data_dict={}
#构件搜索
#获取q值------名字为q的input框的值
#get中参数------有值拿值,没有值传空
search_data=request.GET.get('q',"")
if search_data:
# 为列表赋值
data_dict["mobile__contains"] = search_data
#将筛选的值通过filter(**data_dict)传递过去
queryset=models.PrettyNum.objects.filter(**data_dict).order_by("-level")
#可以进行排序
# models.PrettyNum.objects.all().order_by("-id")
#按照等级来显示
# queryset=models.PrettyNum.objects.all().order_by("-level")
return render(request,'pretty_list.html',{"queryset":queryset,"search_data":search_data})
列表显示HTML
html
{% extends 'layout.html'%}
{% block content %}
<div class="container">
<div style="margin-bottom: 10px" class="clearfix">
<!-- 新建用户按钮-->
<a class="btn btn-success" href="/pretty/add/" >
<span class="glyphicon glyphicon-plus-sign" aria-hidden="true"></span>
新建靓号
</a>
<!-- 添加搜索框-添加搜索框-添加搜索框-->
<div style="float:right ;width:300px;">
<form method="get">
<div class="input-group">
<!-- 使得name="q",传递值-->
<!-- 给input框设置一个默认的值------value="{{search_data}}"------将用户输入的值保留在框内,不会因为跳转而消失-->
<input type="text" name="q" class="form-control" placeholder="Search for..." value="{{search_data}}">
<span class="input-group-btn">
<button class="btn btn-default" type="submit">
<span class="glyphicon glyphicon-search" aria-hidden="true"></span>
</button>
</span>
</div><!-- /input-group -->
</form>
</div>
</div>
<div class="panel panel-default">
<!-- Default panel contents -->
<div class="panel-heading">
<span class="glyphicon glyphicon-list" aria-hidden="true"></span>
靓号列表
</div>
<div class="panel-body">
<p>欢迎进入到靓号管理页面,请安全操作!</p>
</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 obj in queryset %}
<tr>
<td>{{obj.id}}</td>
<td>{{obj.mobile}}</td>
<td>{{obj.price}}</td>
<!-- 显示choices-->
<td>{{obj.get_level_display}}</td>
<td>{{obj.get_status_display}}</td>
<td>
<!-- Django框架中传递参数的正则表达式-->
<a class="btn btn-primary btn-xs" href="/pretty/{{obj.id}}/edit/">编辑</a>
<!-- 通过get请求传递参数跳转页面-->
<a class="btn btn-danger btn-xs" href="/pretty/{{obj.id}}/delete/" >删除</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
{% endblock %}
页面效果
新建靓号编写(添加)
URL.py编写
代码如下:
python
urlpatterns = [
#靓号添加
path('pretty/add/', views.pretty_add),
]
views.py中 函数编写
- ModelForm类------记得导入
- 实例化对象
- 通过render将对象传入到HTML中
- 通过模板的循环展示所有的字段
代码如下:
python
#导入
from django.core.validators import RegexValidator
#异常错误
from django.core.exceptions import ValidationError
#继承modelForm类
class PrettyModelForm(forms.ModelForm):
#################额外交验,浏览器自带以外的校验-额外交验,浏览器自带以外的校验-额外交验,浏览器自带以外的校验###################
#方式一额外验证------额外验证------额外验证
# mobile=forms.CharField(
# label="手机号",
#
# #可以添加一个或者多个校验-可以添加一个或者多个校验-可以添加一个或者多个校验
# #1开头[3-9]+9个数
# validators=[RegexValidator(r'^1[3-9]\d{9}$','手机号格式错误'),]
# )
class Meta:
#靓号实例化
model=models.PrettyNum
#靓号属性
fields=["mobile","price","level","status"]
# fields="__all__"
# exclude=['level']
#添加样式------添加样式-添加样式-添加样式-添加样式
def __init__(self,*args,**kwargs):
super().__init__(*args ,**kwargs)
#循环找到所有插件,添加了class="form-control"样式
for name ,field in self.fields.items():
# print(id,field)
#某一项去除样式
# if name=="password":
# continue
field.widget.attrs = {"class":"form-control","placeholder":field.label}
#验证方式二
#导入from django.core.exceptions import ValidationError
def clean_mobile(self):
#获取用户传入的mobile数据
txt_mobile=self.cleaned_data["mobile"]
#额外校验
#校验不通过
#查验数据库中手机号是否已经存在------查验数据库中手机号是否已经存在-查验数据库中手机号是否已经存在
exists=models.PrettyNum.objects.filter(mobile=txt_mobile).exists()
if exists:
raise ValidationError("手机号已经存在!!!")
# if len(txt_mobile)!=11:
# raise ValidationError("格式错误!")
#校验通过_返回当前的值
return txt_mobile
#添加靓号
def pretty_add(request):
if request.method == 'GET':
#实例化PrettyModelForm
form=PrettyModelForm()
return render(request,'pretty_add.html',{'form':form})
else:
form=PrettyModelForm(data=request.POST)
#校验成功
if form.is_valid():
form.save()
return redirect('/pretty/list/')
#校验失败
return render(request,'pretty_add.html',{"form":form})
新建靓号HTML
html
{% extends 'layout.html' %}
{% block content %}
<div class="container">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title"> 新建靓号 </h3>
</div>
<div class="panel-body">
<!-- novalidate关掉页面校验 -->
<form method="post" novalidate>
<!-- 隐含参数-->
{% csrf_token %}
{% for field in form %}
<div class="form-group">
<label >{{ field.label }}</label>
{{ field }}
<span style="color:red;">{{field.errors.0}}</span>
<!-- <input type="text" class="form-control" placeholder="标题" name="user">-->
</div>
{% endfor %}
<button type="submit" class="btn btn-primary">提 交</button>
</form>
</div>
</div>
</div>
{% endblock %}
数据校验
方式一:(正则表达式)
python
class PrettyModelForm(forms.ModelForm):
#################额外交验,浏览器自带以外的校验-额外交验,浏览器自带以外的校验-额外交验,浏览器自带以外的校验###################
#方式一额外验证------额外验证------额外验证
mobile=forms.CharField(
label="手机号",
#可以添加一个或者多个校验-可以添加一个或者多个校验-可以添加一个或者多个校验
#1开头[3-9]+9个数
validators=[RegexValidator(r'^1[3-9]\d{9}$','手机号格式错误'),]
)
方式二:(方法)
python
class PrettyModelForm(forms.ModelForm):
#验证方式二
#导入from django.core.exceptions import ValidationError
def clean_mobile(self):
#获取用户传入的mobile数据
txt_mobile=self.cleaned_data["mobile"]
#额外校验
#校验不通过
if len(txt_mobile)!=11:
raise ValidationError("格式错误!")
#校验通过_返回当前的值
return txt_mobile
-
保存到数据库
-
跳转回靓号列表
编辑靓号
列表页面加上编辑------/pretty/数字/edit/
urls.py编写
代码如下:
python
urlpatterns = [
#靓号编辑
path('pretty/<int:nid>/edit/', views.pretty_edit),
]
views.py编写
(1)根据ID获取当前编辑的对象
(2)ModelForm配合,默认显示数据。
(3)提交修改
代码如下:
python
#继承modelForm类
#添加和编辑使用不同的类
class PrettyEditModelForm(forms.ModelForm):
#将手机号码显示出来但是不可更改_将手机号码显示出来但是不可更改_将手机号码显示出来但是不可更改###############33
# mobile=forms.CharField(disabled=True,label="手机号")
class Meta:
#靓号实例化
model=models.PrettyNum
#靓号属性
#不能修改手机号码,
fields=["mobile","price","level","status"]
# fields="__all__"
# exclude=['level']
#添加样式------添加样式-添加样式-添加样式-添加样式
def __init__(self,*args,**kwargs):
super().__init__(*args ,**kwargs)
#循环找到所有插件,添加了class="form-control"样式
for name ,field in self.fields.items():
# print(id,field)
#某一项去除样式
# if name=="password":
# continue
field.widget.attrs = {"class":"form-control","placeholder":field.label}
# 验证方式二
# 导入from django.core.exceptions import ValidationError
def clean_mobile(self):
#当前编辑哪一行的ID
# 获取用户传入的mobile数据
txt_mobile = self.cleaned_data["mobile"]
# 额外校验
# 校验不通过
# 查验数据库中手机号是否已经存在,除去自身以外的------查验数据库中手机号是否已经存在,除去自身以外的-查验数据库中手机号是否已经存在,除去自身以外的
#id=self.instance.pk获取id------------instance就是传过来的对象
exists = models.PrettyNum.objects.exclude(id=self.instance.pk).filter(mobile=txt_mobile).exists()
if exists:
raise ValidationError("手机号已经存在!!!")
# 校验通过,返回当前的值
return txt_mobile
#靓号编辑
def pretty_edit(request,nid):
#拿到对象
row_object=models.PrettyNum.objects.filter(id=nid).first()
#get请求响应
if request.method=="GET":
#拿到数据库的字段并且显示出来
form=PrettyEditModelForm(instance=row_object)
return render(request,'pretty_edit.html',{'form':form})
else:
#提交方式为POST
form=PrettyEditModelForm(data=request.POST,instance=row_object)
if form.is_valid():
form.save()
return redirect('/pretty/list/')
return render(request,'pretty_edit.html',{'form':form})
页面效果
编辑靓号和添加靓号时,数据校验的要求不相同
编辑中手机号码的要求是:
代码如下:
python
def clean_mobile(self):
#当前编辑哪一行的ID
# 获取用户传入的mobile数据
txt_mobile = self.cleaned_data["mobile"]
# 额外校验
# 校验不通过
# 查验数据库中手机号是否已经存在,除去自身以外的------查验数据库中手机号是否已经存在,除去自身以外的-查验数据库中手机号是否已经存在,除去自身以外的
#id=self.instance.pk获取id------------instance就是传过来的对象
exists = models.PrettyNum.objects.exclude(id=self.instance.pk).filter(mobile=txt_mobile).exists()
if exists:
raise ValidationError("手机号已经存在!!!")
# 校验通过,返回当前的值
return txt_mobile
添加时手机号码的要求是:
代码如下:
python
#验证方式二
#导入from django.core.exceptions import ValidationError
def clean_mobile(self):
#获取用户传入的mobile数据
txt_mobile=self.cleaned_data["mobile"]
#额外校验
#校验不通过
#查验数据库中手机号是否已经存在------查验数据库中手机号是否已经存在-查验数据库中手机号是否已经存在
exists=models.PrettyNum.objects.filter(mobile=txt_mobile).exists()
if exists:
raise ValidationError("手机号已经存在!!!")
# if len(txt_mobile)!=11:
# raise ValidationError("格式错误!")
#校验通过_返回当前的值
return txt_mobile
删除靓号
urls.py编写
代码如下:
python
urlpatterns = [
path('pretty/<int:nid>/delete/', views.pretty_delete)
]
views.py编写
代码如下:
python
#靓号删除
def pretty_delete(request,nid):
models.PrettyNum.objects.filter(id=nid).delete()
return redirect('/pretty/list/')