Dajngo学习笔记(3)

news2024/10/7 8:27:22

电话号码管理

查看功能

class PrettyNum(models.Model):
    mobile=models.CharField(verbose_name="电话号",max_length=11)
    price=models.IntegerField(verbose_name="价格")
    level_choice=(
        (1,"一级"),
        (2,"二级"),
        (3,"三级")
    )
    level=models.SmallIntegerField(verbose_name="级别",choices=level_choice,default=1)
    status_choice=(
        (1,"未占用"),
        (2,"占用")
    )
    status=models.SmallIntegerField(verbose_name="状态",choices=status_choice,default=1)
makemigrations

migrate
def num_list(request):
    queryset=models.PrettyNum.objects.all().order_by("-level")#-表示递减  无表示递增
    for obj in queryset:
        print(obj.id,obj.mobile,obj.price,obj.get_level_display(),obj.get_status_display())
    return render(request,"num_list.html",{"queryset":queryset})
{% extends "layout.html" %}

{% block content %}

<div>
    <div class="container">
        <div style = "margin-bottom: 10px">
            <a class="btn btn-primary" href="/num/add" >
{#              target="_blank"  在新的页面产生#}
                <span class="glyphicon glyphicon-plus-sign" aria-hidden="true"></span>
                新建电话号
            </a>
        </div>
        <div class="panel panel-default">
      <!-- Default panel contents -->
      <div class="panel-heading"><span class="glyphicon glyphicon-th-list" aria-hidden="true"> 电话号管理</span></div>
      <!-- Table -->
      <table class="table table-bordered">
        <thead>
          <tr>
            <th>#</th>
            <th>ID</th>
            <th>电话号</th>
              <th>价格</th>
              <th>等级</th>
              <th>状态</th>
            <th>操作</th>
          </tr>
        </thead>
        <tbody>
        {% for obj in queryset %}
        <tr>
            <th scope="row">{{ obj.id }}</th>
            <td>{{ obj.id }}</td>
            <td>{{ obj.mobile }}</td>
            <td>{{ obj.price }}</td>
            <td>{{ obj.get_level_display }}</td>
            <td>{{ obj.get_status_display }}</td>
            <td>
                <a class = "btn btn-primary btn-xs" href="/num/{{ obj.id }}/edit/">编辑</a>
                <a class = "btn btn-danger btn-xs" href="/num/delete/?nid={{ obj.id }}">删除</a>
            </td>
        </tr>
        {% endfor %}
        </tbody>
      </table>
    </div>
    </div>
</div>

{% endblock %}

在这里插入图片描述

新增功能

其中可以对数据进行验证

class NumModelForm(forms.ModelForm):
    # 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"]#排除level字段
    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 clean_mobile(self):
        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
{% extends "layout.html" %}

{% block content %}
<div>
    <div class="panel panel-default">
  <div class="panel-heading">
    <h3 class="panel-title">新建面板</h3>
  </div>
  <div class="panel-body" >
      <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>

          </div>
          {% endfor %}

      <button type="submit" class="btn btn-primary">保存</button>
    </form>

  </div>
</div>
</div>

{% endblock %}

在这里插入图片描述
如果不符合要求

在这里插入图片描述

编辑

class NumEditModelForm(forms.ModelForm):
    mobile=forms.CharField(disabled=True,label="手机号")

    class Meta:
        model=models.PrettyNum
        #fields=["mobile","price","level","status"]
        fields="__all__"#选择全部字段
        #exclude=["mobile"]#排除level字段
    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 num_edit(request,nid):
    row_object = models.PrettyNum.objects.filter(id=nid).first()
    if request.method == "GET":
        form = NumEditModelForm(instance=row_object)
        return render(request, "num_edit.html", {"form": form})
    form = NumEditModelForm(data=request.POST, instance=row_object)
    if form.is_valid():
        form.save()
        return redirect("/num/list/")
    return render(request, "num_edit.html", {"form": form})
{% extends "layout.html" %}

{% block content %}
<div class="container">
<div>
    <div class="panel panel-default">
  <div class="panel-heading">
    <h3 class="panel-title">新建面板</h3>
  </div>
  <div class="panel-body" >
      <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>

          </div>
          {% endfor %}

      <button type="submit" class="btn btn-primary">保存</button>
    </form>

  </div>
</div>
</div>

</div>
{% endblock %}

编辑时候不允许手机号重复

class NumEditModelForm(forms.ModelForm):
    #mobile=forms.CharField(disabled=True,label="手机号")#不允许编辑手机号

    class Meta:
        model=models.PrettyNum
        #fields=["mobile","price","level","status"]
        fields="__all__"#选择全部字段
        #exclude=["mobile"]#排除level字段
    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 clean_mobile(self):
        txt_mobile=self.cleaned_data["mobile"]
        txt_id = self.instance.pk#当前编辑的id
        exists=models.PrettyNum.objects.exclude(id=txt_id).filter(mobile=txt_mobile).exists()
        if exists:
            raise ValidationError("手机号存在")
        if len(txt_mobile)!=11:
            #验证不通过
            raise ValidationError("格式错误")
        return txt_mobile

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1178324.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RISC-V处理器设计(四)—— Verilog 代码设计

一、前言 从6月底刚开始接触 risc-v 架构&#xff0c;到现在完成了一个 risc-v cpu 的设计&#xff0c;并且成功移植了 rt-thread nano 到本 cpu 上运行&#xff0c;中间经过了 4个多月的时间&#xff0c;遇到了数不清的问题&#xff0c;也想过放弃&#xff0c;但好在最后还是…

美国阿贡国家实验室发布快速自动扫描套件 FAST,助力显微技术「快速阅读」成为可能

「我高兴地在北京市的天安门广场上看红色的国旗升起」 快速阅读一下这个句子&#xff0c;大家可能会发现&#xff0c;只需「我在天安门广场看升旗」几个字&#xff0c;就能概述我们需要的信息&#xff0c;也就是说&#xff0c;无需逐字逐句地阅读&#xff0c;抓住重点即可破译…

【flutter no devices】

1.在环境变量增加 ANDROID_HOME 值为&#xff1a;C:\Users\Administrator\AppData\Local\Android\Sdk &#xff08;Android sdk 位置) 2 环境变量的path里面增加2个值&#xff1a; %ANDROID_HOME%\platform-tools %ANDROID_HOME%\tools 3 打开cmd&#xff0c;或者在Android st…

嵌入式Linux和stm32区别? 之间有什么关系吗?

嵌入式Linux和stm32区别? 之间有什么关系吗&#xff1f; 主要体现在以下几个方面&#xff1a; 1.硬件资源不同 单片机一般是芯片内部集成flash、ram&#xff0c;ARM一般是CPU&#xff0c;配合外部的flash、ram、sd卡存储器使用。最近很多小伙伴找我&#xff0c;说想要一些嵌…

【滑动窗口】篮里到底能装 “几个水果” 呢?

Problem: 904. 水果成篮 文章目录 题目分析算法原理分析暴力枚举 哈希表滑动窗口优化数组再度优化 复杂度Code 题目分析 首先我们来分析一下本题的思路 首先我们通过题目的描述来理解一下其要表达的含义&#xff0c;题目给到我们一个fruit数组&#xff0c;里面存放的是每棵树上…

Linux Vim批量注释和自定义注释

使用 Vim 编辑 Shell 脚本&#xff0c;在进行调试时&#xff0c;需要进行多行的注释&#xff0c;每次都要先切换到输入模式&#xff0c;在行首输入注释符"#"再退回命令模式&#xff0c;非常麻烦。连续行的注释其实可以用替换命令来完成。 换句话说&#xff0c;在指定…

推特被封号怎么办?如何防封?

今年社交媒体巨头Twitter正式更名与标示为“X”&#xff0c;这一举措引发了广泛关注和讨论。马斯克称&#xff0c;此举是为了将推特重塑为一个广泛的通信和金融交易平台&#xff0c;打造一个像“微信”一样的万能应用程序&#xff0c;也就是“X”&#xff0c;并承诺推特将迅速进…

外汇天眼:全员免费,赢奖金!

外汇市场一直以来都是金融投资者的热门领域之一&#xff0c;但对于新手来说&#xff0c;了解和掌握外汇交易可能需要时间和经验。为了帮助新手入门&#xff0c;提高交易技能&#xff0c;外汇模拟交易应运而生。为的是能够零风险无压力地帮助外汇投资者更好地掌握外汇交易的技巧…

SonarQube的使用心得

一、使用背景&#xff1a; SonarQube 是一个用于代码质量管理的开源平台&#xff0c;用于管理源代码的质量。 通过插件形式&#xff0c;可以支持包括 java, C#, C/C, PL/SQL, Cobol, JavaScrip, Groovy 等等二十几种编程语言的代码质量管理与检测。 Sonar可以从以下七个维度…

给定n个点或一个凸边形,求其最小外接矩形,可视化

这里写目录标题 原理代码 原理 求n个点的最小外接矩形问题可以等价为先求这n个点的凸包&#xff0c;再求这个凸包的最小外接矩形。 其中求凸包可以使用Graham-Scan算法 需要注意的是&#xff0c; 因为Graham-Scan算法要求我们从先找到凸包上的一个点&#xff0c;所以我们可以先…

CRM 报告:跟踪销售业绩的强大工具

对于希望保持良好客户关系的企业来说&#xff0c;CRM&#xff08;客户关系管理&#xff09;报告是不可或缺的。它使企业能够跟踪客户互动&#xff0c;并利用这些数据改善客户服务。 需要注意的是&#xff0c;CRM 报告不是一次性的&#xff0c;而是一个持续的过程。这是因为客户…

Webpack介绍大全

Webpack 一 、什么是webpack WebPack是一个现代JS应用程序的静态模块打包器&#xff08;module bundler&#xff09; 模块&#xff08;模块化开发&#xff0c;可以提高开发效率&#xff0c;避免重复造轮子&#xff09; 打包&#xff08;将各个模块&#xff0c;按照一定的规则…

“第六十二天”

新东西 %[^\n] 这个题测试的时候不知道哪里为什么一直错一个。 int main() {char a[81] { 0 };fgets(a, 80, stdin);int i 0;int n strlen(a);for(i0;i<n;i){if ((a[i] > a && a[i] < y) || (a[i] > A && a[i] < Y))a[i] 1;else if (a[i…

中介模式(Mediator)

简介 当各个模块的调用变得错综复杂时&#xff0c;可以使用中介模式&#xff0c;用一个中介对象完成对象交互&#xff0c;各个对象不需要显示的相互引用。 创建一个中介对象完成所有的调用&#xff1a;Mediator->A ,Mediator->B,Mediator->C,Mediator->D&#xf…

设计模式—结构型模式之桥接模式

设计模式—结构型模式之桥接模式 将抽象与实现解耦&#xff0c;使两者都可以独立变化。 在现实生活中&#xff0c;某些类具有两个或多个维度的变化&#xff0c;如图形既可按形状分&#xff0c;又可按颜色分。如何设计类似于 Photoshop 这样的软件&#xff0c;能画不同形状和不…

gcov c++代码覆盖率测试工具(原理篇)

一、gcov简单介绍 Gcov是一个测试C/C代码覆盖率的工具&#xff0c;伴随GCC发布&#xff0c;配合GCC共同实现对C/C文件的语句覆盖、功能函数覆盖和分支覆盖测试。 二、gcov统计生成覆盖率流程 图1 gcov覆盖率生成过程 Gcc在编译阶段指定 –ftest-coverage 等覆盖率测试选项后…

8-2、T型加减速计算简化【51单片机控制步进电机-TB6600系列】

摘要&#xff1a;本节介绍简化T型加减速计算过程&#xff0c;使其适用于单片机数据处理。简化内容包括浮点数转整型数计算、加减速对称处理、预处理计算 一、浮点数转整型数计算 1.1简化∆t_1计算 根据上一节内容已知 K0.676 step1.8/X&#xff08;x为细分值&#xff0c;1.8对…

Oracle(11)Managing Tables

Managing Tables 管理表 目标&#xff1a; 识别存储数据的各种方法概述甲骨文数据类型区分扩展ROWID与限制ROWID勾勒出一行的结构创建常规表和临时表管理表中的存储结构重新组织、截断和删除表删除表中的列 一、基础知识 1、Oracle Built-in Data Types Oracle内置数据类型 2…

泛微OA_lang2sql 任意文件上传漏洞复现

简介 泛微OA E-mobile系统 lang2sql接口存在任意文件上传漏洞&#xff0c;由于后端源码中没有对文件没有校验&#xff0c;导致任意文件上传。攻击者可利用该参数构造恶意数据包进行上传漏洞攻击。 漏洞复现 FOFA语法&#xff1a; title"移动管理平台-企业管理" 页…

jbase编译与部署的优化

上一篇的演示只是涉及自动编译业务脚本。演示时候工程编译是超级慢的。因为把静态资源放在了Web工程下&#xff0c;每次编译都要拷贝&#xff0c;运行起码是1分钟&#xff0c;不能忍受&#xff0c;为此思考工程结构改解决这个问题&#xff0c;顺带方便开发的发布。运行WebLoade…