其他分享
首页 > 其他分享> > django框架八

django框架八

作者:互联网

批量操作数据

浏览器访问一个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