Django微讲解(八)

Django微讲解(八)

Django自带的序列化组件

	之所以要把数据序列化就是为了以后项目前后端分离之后,用于前后端数据交互的,因为Django ORM产生的Queryset前端无法直
接识别,需要json格式的数据,前后端都可以直接识别,我们之前讲了Django返回json格式数据的关键字'JsonResponse',但是这不是最
简便的方式,Django有自带的序列化组件'serializers',操作简单,不会造成代码的冗余。
# 代码演示
from app01 import models
from django.http import JsonResponse
from django.core import serializers
def test_json(request):
    # json_list = []
    # user_info = models.Users.objects.filter().all()
    # for user_obj in user_info:
    #     json_list.append({
    #         'name':user_obj.name,
    #         'age':user_obj.age,
    #         'gender':user_obj.gender,
    #         'gender_real':user_obj.get_gender_display(),
    #         'addr':user_obj.addr
    #     })
    # return JsonResponse(json_list,safe=False)
    user_info = models.Users.objects.filter().all()
    res = serializers.serialize('json',user_info)
    return HttpResponse(res)

批量数据操作

# 循环插入数据
	循环插入多条数据,会频繁的走数据库,每循环一次就会走一次数据库,数据库在频繁的使用同一步操作,效率会越来越低。
    代码演示:
        def many_data(request):
            for i in range(100000):
                models.Book.objects.create(title=f'第{i}本书')
            data_obj = models.Book.objects.filter().all()
            return render(request,'many_data.html',locals())
# 批量插入数据
	批量插入会降低数据库的压力,插入数据的效率也会大大提高,批量插入数据使用的关键字是'bulk_create'
    代码演示:
        def many_data(request):
            # 定义一个空列表
            book_list = []
            for i in range(1000,2000):
                # 先实例化一个对象
                book_obj = models.Book(title=f'第{i}本书')
                # 将对象追加到列表当中
                book_list.append(book_obj)
            # 批量插入数据
            models.Book.objects.bulk_create(book_list)

            data_obj = models.Book.objects.filter().all()
            return render(request,'many_data.html',locals())

分页器推导及自定义分页器使用

# 1.分页器推导流程
	我们刚刚在展示数据的时候就发现,一个页面有太多的数据,不便于查看,也不美观,所以我们就可以加一个分页器,限制数据的
展示条数,便于查看。
    1.我们用'all()'方法可以拿到所有的数据结果集,拿到的数据结果集支持正数的索引切片,所以就可以限制数据的只能是条数
    2.关于分页数据的起始,结束参数,要计算参数的数学关系
    3.用后端代码渲染前端分页代码
    4.用后端代码限制分页展示的数量
    5.限制分页器数字的范围
# 2.自定义分页器使用
	因为分页器的使用范围很广泛,所以我们就可以自定义一个分页器,封装成模块,虽然Django给我们提供了分页器,但是不太好
用。当我们自定义模块文件的时候,我们可以先在Django的应用文件下或者Django项目文件下建立一个'utils'文件夹,在里面封装我们
自己的模块,便于使用。
    代码演示:
        # views层代码
        from utils import mypage
        def many_data(request):
            book_queryset = models.Book.objects.all()
            # 产生分页器对象
            page_obj = mypage.Pagination(current_page=request.GET.get('page'),all_count=book_queryset.count())
            # 产生分页数据对象
            page_queryset = book_queryset[page_obj.start:page_obj.end]

            return render(request,'many_data.html',locals())
        # html层代码,提前导入好bootstrap文件
        {% for book_obj in page_queryset %}
            <p>{{ book_obj.title }}</p>
        {% endfor %}
        {{ page_obj.page_html|safe }}

Forms组件

1.基本使用

	当我们想要编写一个校验用户名和密码是否合法的功能,是需要做很多事情的,前端需要自己编写获取用户数据的各种标签,
还需要展示错误的提示信息,后端需要编写校验代码等等。以上的操作我们都可以使用forms组件来完成,先来看看基本使用。
# 代码演示
from django import forms

class MyForm(forms.Form):
    username = forms.CharField(min_length=3,max_length=8)  # 用户名最少三个字符,最多八个字符
    age = forms.IntegerField(min_value=0,max_value=110)  # 年龄最小0岁,最大110岁
    email = forms.EmailField()  # 邮箱输入必须遵循邮箱格式,必须带有@关键符

2.检验数据

from app01 import views
# 1.将数据传入实例化对象
form_obj = views.MyForm({'username':'oscar','age':21,'email':'111qq'})
# 2.查看数据是否合法
print(form_obj.is_valid())  # False,只有全部正确才会返回True
# 3.查看不符合条件的数据及原因
print(form_obj.errors)
# 4.查看符合条件的数据
print(form_obj.cleaned_data)
# 5.forms类中的字段
	forms类中的所有字段数据默认都是必填的,不填就会报错,如果想要忽略某些字段,我们可以在创建forms类的时候给该字段
加上'required=False'属性即可
# 6.多传的数据
	forms类中额外多传的数据不会做任何的校验,会直接忽略

3.渲染标签

# 1.渲染方式一
	封装程度高,但是扩展性很差,主要用于快速生成页面测试功能
	{{ my_forms.as_p }}  # 渲染出来的效果是成列的
    {{ my_forms.as_table }}  # 渲染出来的效果是成行的
    {{ my_forms.as_ul }}  # 渲染出来的效果是无需列表形式的
# 2.渲染方式二
	封装程度低,扩展性较好,但是字段多的话就会比较繁琐
    {{ my_forms.字段名.label }}  # 文本提示
    {{ my_forms.字段名 }}  # 获取用户数据的标签
# 3.渲染方式三(推荐使用)
	{% for form in my_forms %}
        <p>
            {{ form.label }}
            {{ form }}
        </p>
    {% endfor %}
'''
1.forms组件只负责渲染获取用户数据的标签,form表单的标签和提交按钮需要自己写
2.如果想要自定义标签的提示,可以给字段加上label属性,参数就是自定义的提示,不写默认是字段名,并且首字母是大写
'''

4.展示信息

# 1.form表单取消浏览器自动校验
	<form action="" method="post" novalidate></form>
# 2.错误展示信息
	由于前端的校验是可有可无的,所以我们就在添加校验功能
    # 后端代码
    def myforms(request):
        my_forms = MyForm()
        if request.method == 'POST':
            # 获取用户数据,request.POST可以看成是一个数据字典
            my_forms = MyForm(request.POST)
            # 校验用户数据
            if my_forms.is_valid():
                # models.Book.objects.create(**my_forms.is_valid())  # 打散批量插入数据
                return HttpResponse('数据正确')
        return render(request,'myforms.html',locals())
    # 前端代码
    {% for form in my_forms %}
        <p>
            {{ form.label }}
            {{ form }}
            <span style="color: red">{{ form.errors.0 }}</span>
        </p>
    {% endfor %}
# 3.自定义错误提示信息
	关于错误提示信息我们还可以自定义,只需要给字段添加'error_messages'属性,参数只一个字典格式,字典的key值就是
关键字,value值就是提示信息
    代码演示:
        username = forms.CharField(min_length=3,max_length=8,
                               error_messages={
                                   'min_length':'最短3位',
                                   'max_length':'最长8位',
                                   'required':'用户名必填'
                               }
                               )
posted @ 2022-05-22 17:52  陆禄绯  阅读(37)  评论(0编辑  收藏  举报