【银角大王——Django课程——靓号页面的基本操作(列表,新建,删除)】

靓号管理

靓号列表显示

表结构

列名有哪些

  1. id
  2. mobile
  3. level(choice)------类似于性别
  4. 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/')
相关推荐
云和数据.ChenGuang1 小时前
Django 应用安装脚本 – 如何将应用添加到 INSTALLED_APPS 设置中 原创
数据库·django·sqlite
梧桐树04294 小时前
python常用内建模块:collections
python
Dream_Snowar4 小时前
速通Python 第三节
开发语言·python
蓝天星空5 小时前
Python调用open ai接口
人工智能·python
jasmine s5 小时前
Pandas
开发语言·python
郭wes代码5 小时前
Cmd命令大全(万字详细版)
python·算法·小程序
leaf_leaves_leaf6 小时前
win11用一条命令给anaconda环境安装GPU版本pytorch,并检查是否为GPU版本
人工智能·pytorch·python
夜雨飘零16 小时前
基于Pytorch实现的说话人日志(说话人分离)
人工智能·pytorch·python·声纹识别·说话人分离·说话人日志
404NooFound6 小时前
Python轻量级NoSQL数据库TinyDB
开发语言·python·nosql
天天要nx6 小时前
D102【python 接口自动化学习】- pytest进阶之fixture用法
python·pytest