ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

django框架八

2022-09-08 23:32:44  阅读:230  来源: 互联网

标签:obj name form request 校验 django 框架 pwd


  • 批量操作数据
  • 自定义分页器(重在思路)
  • form组件
  • modelform组件
  • cookie与session简介

批量操作数据

浏览器访问一个django路由 立刻创建10万条数据并展示到前端页面
	create()、all()
涉及到大批量数据的创建 直接使用create可能会造成数据库崩溃
	批量数据创建>>>:bulk_create() 
	批量数据修改>>>:bulk_update()

def index(request):
    # book_list = []
    # for i in range(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.filter()  # 查询所有数据
    return render(request, 'book_list.html', locals())

批量数据展示

当数据量比较大的时候 页面展示应该考虑分页
1.QuerySet切片操作
2.分页样式添加
3.页码展示
	如何根据总数据和每页展示的数据得出总页码
   	divmod()
4.如何渲染出所有的页码标签
	前端模板语法不支持range 但是后端支持 我们可以在后端创建好html标签然后传递给html页面使用
5.如何限制住展示的页面标签个数
	页码推荐使用奇数位(对称美)  利用当前页前后固定位数来限制
6.首尾页码展示范围问题
"""
上述是分页器组件的推导流程 我们无需真正编写
	django自带一个分页器组件 但是不太好用 我们自己也写了一个
"""

自定义分页器

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, 'bookList.html', locals())  # 返回一个页面

{% for book_obj in page_query %}
<p class="text-center">{{ book_obj.title }}</p>
{% endfor %}
{{ page_obj.page_html|safe }}

form组件

1.初始阶段
后端:
def form(request):
    data_dict = {'username': '', 'pwd': ''}  # 定义字典传到前端
    if request.method == 'POST':
        name = request.POST.get('username')
        pwd = request.POST.get('password')
        if name == 'jason':
            data_dict['username'] = '你不能使用jason'  # 通过post请求传来的数据进行判断然后修改字典再次传到前端直接使用即可
        if pwd == '123':
            data_dict['pwd'] = '密码不能使用123'
            print(data_dict)
    return render(request, 'form.html', locals())

前端:
form action="" method="post">
    <p>
    username<input type="text" name="username">
        <span style="color: red">{{ data_dict.username }}</span>
</p>
<p>
    password<input type="text" name="password">
    <span style="color: red">{{ data_dict.pwd }}</span>
</p>
    <input type="submit" value="提交">
</form>

2.form组件
	1.数据校验
    	支持提前设置各种校验规则 之后自动校验
 	2.渲染页面
    	支持直接渲染获取用户数据的各种标签
 	3.展示信息
    	支持针对不同的校验失败展示不同的提示
创建form类
from django import forms
class MyForm(forms.Form):
    name = forms.CharField(max_length=7, min_length=3)  # name字段最少3位最多7位
    pwd = forms.CharField(max_length=8, min_length=3)  # pwd最少三位
    email = forms.EmailField()  # 限制邮箱

1.数据校验功能
	1.1.传递待校验的数据
    	form_obj = views.MyForm({'name':'jason','age':18,'email':123})
   	1.2.判断所有的数据是否符合校验
    	form_obj.is_valid()
   	1.3.获取符合校验规则的数据
    	form_obj.cleaned_data
    	{'name': 'jason', 'age': 18}
   	1.4.查阅不符合校验规则的数据及错误原因
    	form_obj.errors
    	{'email': ['Enter a valid email address.']}
 	"""
 	1.form类中编写的字段默认都是必填的 少传则肯定通不过校验 is_valid
 	2.校验如果多传了一些字段 则不参与校验 全程忽略
 	"""
2.渲染标签
2.1产生一个对象
def func(request):
    form_boj = MyForm()
    return render(request,'func.html',locals())
2.2
<form action="">
{#模版语法自带注释#}
{#    第一种 封装贼高扩展性差#}
{#    {{ form_boj.as_p }}#}
{#    第二种封装低很麻烦#}
{#    {{ form_boj.name.label }}{{ form_boj.name }}#}
{#    {{ form_boj.pwd.label }}{{ form_boj.pwd }}#}
    {% for form in form_boj %}
    {{ form.label }}{{ form }}
    {% endfor %}

    <input type="submit" value="提交">
</form>
3.展示提示信息
form 表单取消前端校验加novalidate参数即可
提示信息修改参数
class MyForm(forms.Form):
    name = forms.CharField(max_length=7, min_length=3,
                           error_messages={'max_length': '用户名最多7位',
                                           'min_length':'用户名最少为3位',
                                           'required':'用户名不能为空'})  # name字段最少3位最多7位
    pwd = forms.CharField(max_length=8, min_length=3)  # pwd最少三位
    email = forms.EmailField(error_messages={'invalid':'邮箱格式不正确'})  # 限制邮箱

{% for form in form_boj %}
        <p>{{ form.label }}{{ form }}
            <span style="color: red">{{ form.errors.0 }}</span>  # errors是一个列表
        </p>

{% endfor %}

<input type="submit" value="提交">

组件参数

重要的字段参数
	max_length、min_length
  	max_value、min_value
    label				字段注释
label ='字段名'
	error_messages		  错误提示
	required			  是否为空
   widget				 标签类型、标签属性
widget=forms.widgets.TextInput(attrs={'class':'form-control'})
	initial				  默认值
   validators			  正则校验

image

狗子函数

简介:提供自定义的校验方式类似于将数据拿出校验之后还回去

单个字段:
    def clean_name(self):
        name = self.cleaned_data.get('name')
        res = models.User.objects.filter(name=name)
        if res:
            self.add_error('name', '%s已存在' % name)
        return name  # 返回name字段数据
多个字段
  def clean(self):
        pwd = self.cleaned_data.get('pwd')
        confirm_pwd = self.cleaned_data.get('confirm_pwd')
        if not pwd == confirm_pwd:
            self.add_error('confirm_pwd','密码不一致')
        return self.cleaned_data  # 返回所有的数据




##################################################################################
'''form组件代码校验完整代码'''
from django import forms


class MyForm(forms.Form):
    name = forms.CharField(max_length=7, min_length=3,
                           error_messages={'max_length': '用户名最多7位',
                                           'min_length': '用户名最少为3位',
                                           'required': '用户名不能为空'},
                           initial='jason',
                           widget=forms.widgets.TextInput(attrs={'class': 'form-control'}))  # name字段最少3位最多7位
    pwd = forms.IntegerField()  # pwd最少三位
    confirm_pwd = forms.IntegerField()
    email = forms.EmailField(error_messages={'invalid': '邮箱格式不正确'},
                             )  # 限制邮箱
    # 校验用户名是否存在
    def clean_name(self):
        name = self.cleaned_data.get('name')
        res = models.User.objects.filter(name=name)
        if res:
            self.add_error('name', '%s已存在' % name)
        return name
    # 校验两次用户名是否一致
    def clean(self):
        pwd = self.cleaned_data.get('pwd')
        confirm_pwd = self.cleaned_data.get('confirm_pwd')
        if not pwd == confirm_pwd:
            self.add_error('confirm_pwd','密码不一致')
        return self.cleaned_data


def func(request):
    form_boj = MyForm()
    if request.method == 'POST':
        form_boj = MyForm(request.POST)
        if form_boj.is_valid():  # 判断是否所有数据符合
            res = form_boj.cleaned_data
            print(res)
            models.User.objects.create(**res)  # 所有校验成功后将数据写入数据库将字典打散成k=v写入数据库
        else:
            print(form_boj.errors)  # 错误的数据
    return render(request, 'func.html', locals())

modelform组件



class MyModelForm(forms.ModelForm):
    class Meta:
        model = models.User
        fields = '__all__'

    def clean_name(self):
        name = self.cleaned_data.get('name')
        res = models.User.objects.filter(name=name)
        if res:
            self.add_error('name', '%s已存在' % name)
        return name


def model_form(request):
    model_form_obj = MyModelForm()
    if request.method == 'POST':
        model_form_obj = MyModelForm(request.POST)
        if model_form_obj.is_valid():
            model_form_obj.save()  # 保存

    return render(request, 'model_form.html', locals())
	
修改
def model_form(request):
    model_form_obj = MyModelForm()
    if request.method == 'POST':
        edit_obj = models.User.objects.filter(name='jason').first()  # 先获取修改的对像可以将条件通过其他方法传过来类似get请求或者ajax
        model_form_obj =MyModelForm(request.POST,instance=edit_obj)  # 将对象传到form对象中
        if model_form_obj.is_valid():
            model_form_obj.save()  # 修改

    return render(request, 'model_form.html', locals())

标签:obj,name,form,request,校验,django,框架,pwd
来源: https://www.cnblogs.com/tzmy/p/16671014.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有