django组件

django内置序列化组件

在实际工作中一般前后端都是分离的,后端只需要考虑到给前端返回json格式的数据。 格式应该是:{1:{},2:{},3:{}}
1.自己手撸
from app01 import models
from django.http import JsonResponse
def ab_ser_func(request):
    # 1.查询所有的书籍对象
    book_queryset = models.Book.objects.all()  # queryset [对象、对象]
    # 2.需要手动写封装成大字典返回  
    data_dict = {}
    for book_obj in book_queryset:
        temp_dict = {}
        temp_dict['pk'] = book_obj.pk
        temp_dict['title'] = book_obj.title
        temp_dict['price'] = book_obj.price
        temp_dict['info'] = book_obj.info
        data_dict[book_obj.pk] = temp_dict  # {1:{},2:{},3:{},4:{}}
    return JsonResponse(data_dict)

序列化组件方法

def ab_ser_func(request):
    # 1.查询所有的书籍对象
    book_queryset = models.Book.objects.all()
    from django.core import serializers
    res = serializers.serialize('json',book_queryset)  # 自动帮我们处理
	 return HttpResponse(res)

批量操作数据

我们往一个表里插入大量的数据eg:10w条,那么速度是相当的慢。效率极低. ORM提供了快速插入数据的方法。
    """
    bulk_create 批量插入数据
    bulk_update 批量修改数据
    """
def ab_bk_func(request):
    book_obj_list = []  # 定义一个空列表
    for i in range(1, 100000):  
        book_boj = models.Book(title='第%s本书'% i)   # 产生一个book对象并指定对象title的名字
        book_obj_list.append(book_boj)    # 把对象添加到列表里
    models.Book.objects.bulk_create(book_obj_list)  # 使用bulk_create 批量添加列表内对象
    book_queryset = models.Book.objects.all()   
    return render(request,'bkpage.html',locals())    

自定义分页器的使用

django自带的分页器模块自己编写起来太麻烦,所以有封装好的。

了解详情请点击

https://www.cnblogs.com/Dominic-Ji/articles/12035722.html

form组件

简单校验

获取用户数据并发送给后端校验 input框输入校验,返回错误信息。
form组件
	1.自动校验数据
	2.自动生成标签
	3.自动展示信息
    
from django import forms
class MyForm(forms.Form):
    username = forms.CharField(min_length=3,max_length=8)  # username字段最少3个字符最大8个字符
    password = forms.CharField(min_length=6,max_length=20)
    age = forms.IntegerField(min_value=0,max_value=100)  # 最小年龄为0 最大年龄为100
    email= forms.EmailField()

#1.先产生一个对象
form_obj = MyForm()

# 2. 添加数据
form_obj = views.MyForm({'username':'tank','password':'123456','age':18,'email':'123'})  #故意把 email 输错

# 3.判断数据是否全部符合要求
form_obj.is_valid()   # 因为email 错了返回 False
"返回的是 True False"

# 4.获取符合校验条件的数据
form_obj.cleaned_data 
{'username': 'tank', 'password': '123456', 'age': 18}

# 5.获取不符合条件的数据
form_obj.errors
{'email': ['Enter a valid email address.']}

我们在添加数据的时候会自动拿去跟我们设置的字段的条件做比对,如果符合 放在cleaned_data 内,不符合则放在errors内。
注意:
"""
1.只校验我们编写的类里出现的字段,多传的没有任何操作
2.默认情况下类中定义好的字段都是必填的,不然就是false
"""
代码 功能
is_valid() 判断数据是否全部符合要求
cleaned_data 获取符合校验条件的数据
errors 获取不符合条件的数据

forms组件

渲染标签

我们编写好一个Form类后产生一个form对象,然后把form对象返回到前端此时就可以通过.的方式自动生成标签。标签的数量根据Form类里的字段数量而决定

Form类
class MyForm(forms.Form):
    username = forms.CharField(min_length=3,max_length=8)
    age = forms.IntegerField(min_value=0,max_value=200)
    email = forms.EmailField()
"给字段参数+label 可以修改前端显示的input框的名字"

def ab_forms_func(request):
    # 1.产生一个空对象
    form_obj = MyForm()
    return render(request,'formpage.html',locals())

前端语法:
方式一:
    {{ form_obj.as_p }}
    {{ form_obj.as_ul }}
    {{ form_obj.as_table }}
    好处:一次性渲染标签 
    坏处: 封装程度过高扩展性差
        "一般用户自己测试"
方式二:
	{{ form_obj.username.label }} # 获取到字段username里的label
	{{ form_obj.username }}
    字段多的情况下要写很多太麻烦
    
方式三:(最好用)
	封装程度较高,扩展性高
    {% for form in form_obj %}
       {{ form.label }}	# 字段的label
       {{ form }}   # 字段 
	{% endfor %}
  
"forms组件只帮助我们渲染获取用户数据的标签,别的标签需要我们自己填写"
eg:
    form 标签  提交按钮
form 标签属性  
<form action="" novalidate> 取消前端校验  

展示信息

可以帮我们反馈一些信息给前端显示给用户看

def ab_forms_func(request):
    # 1.产生一个空对象
    form_obj = MyForm()
    if request.method =='POST':
        form_obj = MyForm(request.POST)  # request.POST可以看出是一个字典 传给froms类校验
        if form_obj.is_valid():  #  检验数据是否合法
            print(form_obj.cleaned_data)
        else:
            print(form_obj.errors)
    return render(request,'formpage.html',locals())

前端
<form action="" method="post"novalidate >
    {% for form in form_obj %}
       <p>
       {{ form.label }}
       {{ form }}
       <span>{{ form.errors.0 }}</span>  # .0只拿标签里的文本
       </p>
{% endfor %}
<input type="submit" value="提交">
</form>
错误信息的提示也可以变成中文
方式1:自定义内容
	给字段对象添加errors_messages参数
	username = forms.CharField(min_length=3, max_length=8, label='用户名',
                               error_messages={
                                   'min_length': '用户名最少三个字符',
                                   'max_length': '用户名最多八个字符',
                                   'required': '用户名不能为空'
                               }
                               )
方式2:修改系统语言环境
	from django.conf import global_settings  
    进入global_settings 内可以查看到各国语言对应的代码
    LANGUAGE_CODE = 'en-us' # 修改settings内的

校验补充

1.直接字段内填写参数    max_length
2. 使用正则表达式 
from django.core.validators import RegexValidator
class MyForm(forms.Form):
    tel = forms.CharField(
        validators=[
            RegexValidator(r"[0-9]", "电话号码必须是数字"),  # 第一个参数正则,第二个参数是提示信息
            RegexValidator(r"^[0-9]{3}-[0-9]{4}|[0-9]{8}-[0-9]{7}", "不是国内号码")  # 可以写多个正则判别
        ]
钩子函数

在字段所有的校验参数之后触发。

编写代码自定义校验规则  "钩子函数需要写在Forms类中"
局部钩子  "每次只校验一个字段数据"
  def clean_username(self):
        username = self.cleaned_data.get('username')  # 基于前两次校验后 符合规则的数据会存放与cleaned_data中
        if username == 'tank':
            self.add_error('username','用户tank已存在')
        return username  # 钩出来用之后 要还回去

 全局钩子 "一次性校验多个字段数据"
    def clean(self):  # 钩取全局数据 一次性可以校验多个数据
        password = self.cleaned_data.get('password')
        pwd = self.cleaned_data.get('pwd')
        if not password == pwd:
            self.add_error('pwd','两次密码不一致')
        return self.cleaned_data # 返回所有数据

form参数补充

min_length 字符最小长度
max_length 字符最大长度
min_value 数字最小值
max_value 数字最大值
label 字段标签名称 模板语法 {{ 表单字段对象.label }}
error_messages 错误提示 可以自定义限制条件的报错信息
validators 正则校验
initial 默认值 给字段添加默认值就是input框的默认值
required 必填项 给字段添加是否必填 默认为True
widget 属性设置 需要确定标签类型,在forms.widgets有封装

error_messages

username = forms.CharField(max_length=8, min_length=2,
                               error_messages={
                                   'max_length': "啊 长了",   # 针对某些限制条件,来自定义错误信息
                                   'min_length': "啊 短了",
                               }
                          )

initial

字段没有传值则标签value属性等于这个值,即输入框中的默认值

class LoginForm(forms.Form):
    username = forms.CharField(
        min_length=8,
        label="用户名",
        initial="张三"  # 设置默认值
    )
    pwd = forms.CharField(min_length=6, label="密码")

widget

from django.forms import widgets
username = forms.CharField(max_length=8, min_length=2,
                      widget=forms.widgets.TextInput(attrs={'class': 'form-control', 'username': '自定义属性'})
                          )  
class 如果有多个空格隔开。
password = forms.CharField(min_length=3,max_length=8,label='密码',
                      widget = forms.widgets.PasswordInput())
									# type =‘password’ 密文

modelforms组件

在models表写入数据之前进行数据校验

from django import forms
from app01 import models
class MyModelForm(forms.ModelForm):
    class Meta:
        model = models.UserInfo  # 指定表
        fields = '__all__' # 对表中所有字段进行校验
        labels = {
            "title": "书名",
            "price": "价格"
        }  # 设置input框的名字
        widgets = {
            "password": forms.widgets.PasswordInput(attrs={"class": "c1"}),
        }


def ab_mf_func(request):
    modelform_obj = MyModelForm()
    if request.method == 'POST':
        modelform_obj = MyModelForm(request.POST)
        if modelform_obj.is_valid():
            modelform_obj.save()   # 新建数据
        else:
            print(modelform_obj.errors)
    return render(request,'formpage.html',locals())

form_obj = MyModelForm(request.POST, instance=edit_obj)  # 可以通过instance传一个对象
form_obj.save()  # 此时save 就会变成update
posted @ 2022-12-20 20:23  李阿鸡  阅读(57)  评论(0编辑  收藏  举报
Title