IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> Day 62 django form modelform组件 -> 正文阅读

[Python知识库]Day 62 django form modelform组件

Day 62 django form modelform组件

1、批量操作数据

浏览器访问一个django路由 立刻创建10万条数据并展示到前端页面

create()all()

涉及到大批量数据的创建 直接使用create可能会造成数据库崩溃
批量数据创建>>>:bulk_create()
批量数据修改>>>:bulk_update()

def index(request):;
    for i inrange(100000):
        models.Book.objects.create(title=f'第{i}本书')
    book_list = []
    for i inrange(100000):
        book_obj = models.Book(title=f'第{i}本书')
        book_list.append(book_obj)
    models.Book.objects.bulk_create(book_list)  # 批量创建数据
    book_query = models.Book.objects.all()
    return render(request,'booklist.html',locals())

当数据比较大的时候 数据应该考虑分页
通过divmod() 获取总数居和分页展示的数据得出的总页码

前端模板语法不支持rang 但是后端支持 我们可以在后端创建好html标签 然后传递给html页面使用

2、自定义分页器

def booklist(request):
    from app01.plugins import mypage
    book_query = models.Book.objects.all()
    page_obj = mypage.Pagination(current_page=request.GET.get('page'),
                                 all_count=book_query.count())
    page_query = book_query[page_obj.start:page_obj.end]
    return render(request,'book.html',locals())
<div class="container">
    <div class="row">
    <div class="col-md-8 col-md-offset-2">
        {% for book_obj in page_query %}
    <p class="text-center">{{book_obj.title }}</p>
{% endfor %}
    <p>{{ page_obj.page_html|safe }}</p>
    </div>
    </div>
</div>

3、form组件

前戏:编写用户登录功能并且校验数据返回提示信息(form表单)

def reg(request):
    data_dict={'name':'','pwd':''}
    if request.method=='POST':
        name=request.POST.get('name')
        pwd = request.POST.get('pwd')
        if name =='kk':
            data_dict['name']='kk已存在'
        if pwd =='123':
            data_dict['pwd']='密码太简单了'
    return render(request,'reg.html',locals())

form组件

  1. 数据校验
    支持提前设置各种校验规则 之后自动校验
  2. 渲染页面
    支持直接渲染获取用户数据的各种标签
  3. 展示信息
    支持针对不同的校验失败展示不同的提示

form类型创建

from django import forms

class Myreg(forms.Form):
    name = forms.CharField(max_length=8,min_length=3)
    pwd = forms.CharField(min_length=3)
    age = forms.CharField(max_length=150,min_length=0)
    email = forms.EmailField()  #邮箱必须符合邮箱格式(至少有@符号)
    

3.1、数据校验功能

  1. 传递待校验的数据

    form_obj = views.Myreg({'name':'kk','pwd':'123','age':21,'email':5555})
    
  2. 判断所有数据 是否符合校验

    form_obj.is_valid()
    
  3. 获取符合校验规则的数据

    form_obj.cleaned_data
    {'pwd': '123', 'age': '21'}
    
  4. 查阅不符合校验规则的数据及错误原因

    form_obj.errors
    {'name': ['Ensure this value has at least 3 characters (it has 2).'], 'email': ['Enter a valid email address.']}
    

form类中编写的字段默认都是必填的 少传则肯定通不过校验 is_valid
校验如果多传了一些字段 则不参与校验 全程忽略

3.2、渲染标签功能

django 模板语法注释

<# 注释 #>

方式一:(封装成都高 扩展性差)

{{ form_obj.as_p }}  # 渲染成三个 p标签下
{{ form_obj.as_table }}  # 直接渲染成leable
{{ form_obj.as_ul }}  # 以无序列表形式

方式二:(封装成都低 扩展性好 编写困难)

{{ form_obj.name.lable }}  # 只拿字段名
{{ form_obj.name }}  # 输入框
{{ form_obj.age.lable }}
{{ form_obj.age }}
{{ form_obj.email.lable }}
{{ form_obj.email }}

可以通过改 类中 字段 添加 lable关键字参数值 来修改 字段名

方式三(推荐使用)

# 也可以通过 类中lable添加参数修改字段名 
{% for foo in form_obj %}
        <p>{{ foo.label }}{{ foo }}</p>
{% endfor %}

3.3、展示提示信息

form组件 自带校验规则
创建form类 通过函数将form类 传至前端 前端自动会校验

form表单如何取消浏览器自动添加的数据校验功能
novalidate

#前端
<form action="/app01/func/" method="post" novalidate>  # 在form中填写 novalidate

    {% for foo in form_obj %}
        <p>{{ foo.label }}{{ foo }}</p>
    {% endfor %}
    <input type="submit" name="提交">
#后端
def func(request):
    form_obj=Myreg()
    if request.method=='POST':

        form_obj=Myreg(request.POST)
        if form_obj.is_valid():
            print(form_obj.cleaned_data)
        else:print(form_obj.errors)
    return render(request,'form_reg.html',locals())

错误提示底层原理

def func(request):
    form_obj=Myreg()
    if request.method=='POST':

        form_obj=Myreg(request.POST)
        if form_obj.is_valid():
            print(form_obj.cleaned_data)
        else:print(form_obj.errors)  # form_obj.errors 获取到错误信息 传给后端
    return render(request,'form_reg.html',locals())
<form action="/app01/func/" method="post" novalidate>
{#    {{ form_obj.as_p }}#}

    {% for foo in form_obj %}
        <p>{{ foo.label }}{{ foo }}
            <spen style="color: red;">{{ foo.errors.0 }}</spen>  #这里 将 form的每一条对应的错误 取其 错误 文本信息展示
        </p>
    {% endfor %}
    <input type="submit" name="提交">

数据校验正确的话 直接将正确的数据字典 直接传至数据库

def func(request):
    form_obj=Myreg()
    if request.method=='POST':

        form_obj=Myreg(request.POST)
        if form_obj.is_valid():
            data_dict=form_obj.cleaned_data
            models.User.objects.create(**data_dict)  # 直接传至数据库
        else:print(form_obj.errors)
    return render(request,'form_reg.html',locals())

3.4、重要字段参数

参数功能
max_length/min_length字符最大长度值和最小值
max_value/min_value数字 最大长度值 和最小值
label字段注释(修改字段名)
error_messages错误提示
required是否为空
widget标签类型、标签属性
inital默认值
validators正则校验(需要倒模块)

4、钩子函数

提供自定义的校验方式

4.1、局部钩子

校验单个字段

class Myreg(forms.Form):
    name = forms.CharField(max_length=8,min_length=3,label='用户名')
    pwd = forms.CharField(min_length=3,label='密码')
    pwd_again=forms.CharField(min_length=3,label='确认密码')
    age = forms.IntegerField(max_value=150,min_value=0,label='年龄')
    email = forms.EmailField()  #邮箱必须符合邮箱格式(至少有@符号)

    #校验用户名是否一致  局部钩子
    def clean_name(self):
        name = self.cleaned_data.get('name')
        res = models.User.objects.filter(name=name).first()
        if res:
            return self.add_error('name','用户名已存在')
        return name

4.2、全局钩子

校验两次密码是否一致

class Myreg(forms.Form):
    name = forms.CharField(max_length=8,min_length=3,label='用户名')
    pwd = forms.CharField(min_length=3,label='密码')
    pwd_again=forms.CharField(min_length=3,label='确认密码')
    age = forms.IntegerField(max_value=150,min_value=0,label='年龄')
    email = forms.EmailField()  #邮箱必须符合邮箱格式(至少有@符号)
    
    #2 校验两次密码是否一致
    def clean(self):
        pwd =self.cleaned_data.get('name')
        pwd_again=self.cleaned_data.get('pwd_again')
        if not pwd==pwd_again:
            return self.add_error('pwd_again','两次密码不一致')
        return self.cleaned_data

5、modelform组件

modelform是form的优化版本 使用更简单 功能更强大

class MymodelForm(forms.ModelForm):
    class Meta:
        model = models.User
        fields = '__all__'
        labels={   #填写字段被指
            'name': '用户名',
        }


def func1(request):
    md_obj=MymodelForm()
    if request.method == 'POST':
        #如果要修改字段的话 需要将修改的字段 查找出来 然后传给 modelform 对象
       # edit_obj = models.User.objects.filter(name='ming').first()
        md_obj = MymodelForm(request.POST) #修改字段的参数 instance=edit_obj
        if md_obj.is_valid():
            md_obj.save()
    return render(request,'md_reg.html',locals())
  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-09-13 11:10:10  更:2022-09-13 11:13:28 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/26 13:31:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计