zoukankan      html  css  js  c++  java
  • django14

    昨日回顾

    1 分页器组件,django提供给咱么一个类,传入要分页的数据,每页有多少数据
    	-Paginator分页器对象:count,get_page,num_pages,page_range
        -Page对象:has_next,has_previous,next_page_number,previous_page_number,object_list
        
    2 form 组件:可以做数据校验
    	-自己定义一个类,继承Form,在类里写字段
        -name=form.CharField()
        -字段属性:required=False, max_length=32, min_length=3,label='用户名'
        -在视图函数中使用,实例化得到一个Form对象,传入要校验的数据
        -Form对象.is_valid()
        -Form对象.clean_data  :本身都是字典,不管成功与失败,都能拿到clean_data
        -Form对象.errors      :本身都是字典,重写了__str__方法,本质是字典
        	-Form对象.errors.get('name')--->错误信息,可能有多条是放在列表中的,所以name可以拿出多条数据
            -errors对象有些方法,as_data,as_json....
            
    3 form 组件:渲染页面
    	-模板中:自己写标签
        -实例化得到一个空Form对象
        -在模板中:
            {{form.name.label}}
            {{form.name}}  
        -在模板中:
            {% for foo in form %}
               <p>{{ foo.label }} :{{ foo }}</p>
            {% endfor %}
        -在模板中:
        	{{ form.as_p }}
            
       	-生成的标签:<input type="text" name="name" maxlength="32" minlength="3" id="id_name" />
        -生成的id 是id_字段名   
    

    今日内容

    1 froms渲染错误信息

    1 form对象.errors 字典
    2 name对象.errors
    # 想在前端提示错误信息
    ## 视图函数
    def register(request):
        if request.method=='GET':
            form=myforms.MyForm()
            return render(request, 'register.html',{'form':form})
        else:
            form=myforms.MyForm(request.POST)
            if form.is_valid():
                return redirect('http://www.baidu.com') # 成功应该是返回首页
            else:
                return render(request, 'register.html',{'form':form})# 校验不成功应该是再次回到这个页面,重新校验,此时form里面应该是携带了之前的信息,可以打印出错误信息来
    ## 模板
     <form action="" method="post" novalidate>    # novalidate表示前端不校验了
    	{% for foo in form %}
    	<div class="form-group">
            <label for="">{{ foo.label }}</label>
                {{ foo }}         
                <span class="text-danger pull-right">{{ foo.errors }}</span>   # 此对象foo自己也有errors,打印的是对象单独自己的错误信息(英文),form对象的errors是打印出了所有的错误信息,一般不一起打印出所有的错误信息,所以不用form.errors,如果想要去除前面带的·,可以写foo.errors.0
            </div>
    	{% endfor %}
    	<div class="text-center">
    		<input type="submit" value="提交" class="btn btn-danger">
    	</div>
    </form>
    

    2 forms组件参数配置

    # 定制模板中的显示样式,及配置类,首先要导入from django.forms import widgets
    # widget=widgets.PasswordInput(attrs={'class': 'form-control'}),在定制的类中,默认的是TextInput的框,前面标签里面的type类型是由前面字段CharField等决定的,可以换成PasswordInput等其他的框,写了attrs={'class': 'form-control'},那么会将其渲染到框的属性中变成class='form-control',由此解决了给框更改css的样式
    
    # 错误信息中文显示
    	error_messages={'min_length': '太短了小伙子'}  # 此时错误信息对应的是该key值校验不通过是显示的信息,后面可以接着写error_messages={'max_length': '太长了'},如果是必填字段和非必填字段,可以写成error_messages={'required': '必填'}
    
    class MyForm(forms.Form):
        # 校验这个字段,最大长度是32,最小长度是3
        name = forms.CharField(required=False, max_length=32, min_length=3, label='用户名',
                               widget=widgets.TextInput(attrs={'class': 'form-control'}),
                               error_messages={'min_length': '太短了小伙子'})
        password = forms.CharField(required=False, max_length=32, min_length=3, label='密码',
                                   widget=widgets.PasswordInput(attrs={'class': 'form-control'}),
                                   error_messages={'min_length': '太短了小伙子'})
        re_password = forms.CharField(required=False, max_length=32, min_length=3, label='确认密码',
                                      widget=widgets.PasswordInput(attrs={'class': 'form-control'}),
                                      error_messages={'min_length': '太短了小伙子'})
        email = forms.EmailField(label='邮箱', error_messages={'required': '小惠子,这个必填'},
                                 widget=widgets.TextInput(attrs={'class': 'form-control'}))
        age = forms.IntegerField(max_value=200, min_value=0, label='年龄',
                                 widget=widgets.TextInput(attrs={'class': 'form-control'}))
        text = forms.CharField(label='个人简介', widget=widgets.Textarea(attrs={'class': 'form-control'}))
        date = forms.CharField(label='出生日期', widget=widgets.DateInput(attrs={'class': 'form-control'}))
    

    3 局部钩子和全局钩子

    在自定义的类中,在使用form校验完成后
    ## 局部钩子的使用   局部校验该字段内部更复杂的判断
        # 1 要校验哪个在自定义的Form类中写 clean_该字段名
        # 2 取出字段的真正值,name=self.cleaned_data.get('name')
        # 3 判断自己的规则,如果判断失败,抛出ValidationError
        # 4 如果通过,return name
    # 局部钩子    (校验的时候是先校验自己的字段和自己的局部钩子,然后校验下一个的字段和下一个字段的局部钩子,最后校验都校验完成后校验全局钩子---源码)
    一旦能到达下面的方法中,说明前面的校验已经通过了
        def clean_name(self):
            # name对应的值,如何取到?
            name = self.cleaned_data.get('name')  # 取出校验完成的值,self是该类实例化的对象。由self.cleaned_data调出校验完成通过的数据
            if name.startswith('sb'):   # 再次自定义校验
                # 不让校验通过,抛异常(该异常是固定的)需要先导入from django.forms import ValidationError
                raise ValidationError('不能以sb开头')
            else:
                # 校验通过返回该字段,返回name
                return name
            
    # 全局钩子(例如校验密码和确认密码) 只要到达全局钩子,那么前面字段自己的校验和局部钩子都已经校验完成
        def clean(self):
            password = self.cleaned_data.get('password')
            re_password = self.cleaned_data.get('re_password')
            if password == re_password:
                return self.cleaned_data    #如果通过要返回cleaned_data 
                # return {'lqz':"nb"}    如果return NOne,那么默认还是会返回self.cleaned_data,如果返回其他,那么就会返回其他
            else:
                raise ValidationError('两次密码不一致')
    # 如果全局校验要显示错误信息,是在form中的errors中取,只能先在视图函数中取出err的错误信息,然后传给视图模板中渲染
    err = form.errors.get('__all__')
    return render(request,'xx。html',{'err':err})
    
    2 cookie:客户端浏览器上的键值对
    3 session:存在服务端的键值对
    4 token:服务端加密后签发给浏览器的字符串,如果放在客户端浏览器上,它就叫cookie,  服务端签发的加密字符串
    head.{name:lqz,age:18}.eseetsweasdca
    base64加码:
    asdfasfd.asdfasdf.asdfasdfaeraew
    
    后端校验:
    用这个token去查我的账户余额,向银行发请求,银行校验通过,是银行给你的,---》返回你的余额
    head.{name:lqz,age:18}.eseetsweasdca
    
    head.{name:egon,age:18}.eseetsweasdca
    
    

    5 django中cookie的使用

    # 该使用就是将cookie写入浏览器,从浏览器获取cookie或者
    def cookie_test(request):
        # 浏览器向我这个地址发一个请求,就在浏览器写入 name = lqz
        obj=HttpResponse('ok')
        obj.set_cookie('name','egon')  # 写入到浏览器了,在http响应头里:cookie: name=lqz
        obj.set_cookie('age','19')  # 写入到浏览器了,本质是写到http响应头里,浏览器识别到cookie就会把cookie对应的数据name=lqz存到了浏览器中
        return obj
    
    # 获取cookie
    def get_cookie(request):
        print(request.COOKIES)
        print(request.COOKIES.get('name'))
        return HttpResponse('我拿了你传过来的cookie')
    
    # 删除cookie,因为cookie本身是保存在浏览器中,所以删除只能是浏览器自己删除,在后端提交的删除的信息后,浏览器本身进行删除操作
    def delete_cookie(request):
        obj=HttpResponse('我删掉了你 name 这个cookie ')
        obj.delete_cookie('name')
        return obj
    
  • 相关阅读:
    RTThread | 启动下一代RTOS演化
    开发者应该开始学习C++吗?
    用googleperftool分析程序的内存/CPU使用
    看书看累了,可以换看技术视频也是一种学习的方式
    分享:nginx virtuanenv django1.4 应用简单部署
    分享:不同编程语言之间转换的项目矩阵
    【EDUPEPN8508GS黄金版】EDUP EPN8508GS黄金版 迷你USB无线网卡【行情 报价 价格 评测】
    分享:20 本优秀的 Python 电子书
    说说设计模式~工厂方法模式(Factory Method)
    说说设计模式~简单工厂模式(Factory)
  • 原文地址:https://www.cnblogs.com/feiguoguobokeyuan/p/13964791.html
Copyright © 2011-2022 走看看