140 form自定錯誤和鉤子,django中cookie的使用

Pinkman2k發表於2020-10-21

昨日回顧

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')--->錯誤資訊,多條,列表
        -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 forms渲染錯誤資訊

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 action="" method="post" novalidate>
	{% for foo in form %}
	<div class="form-group">
        <label for="">{{ foo.label }}</label>
            {{ foo }}
            <span class="text-danger pull-right">{{ foo.errors }}</span>
        </div>
	{% endfor %}
	<div class="text-center">
		<input type="submit" value="提交" class="btn btn-danger">
	</div>
</form>

2 form元件引數配置

# 定製模板中的顯示樣式,及配置類
# widget=widgets.PasswordInput(attrs={'class': 'form-control'})
# 錯誤資訊中文顯示
error_messages={'min_length': '太短了小夥子'}


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 區域性鉤子和全域性鉤子

## 區域性鉤子的使用
    # 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')
        if name.startswith('sb'):
            # 不讓校驗通過
            raise ValidationError('不能以sb開頭')
        else:
            # 校驗通過,返回name
            return name
# 全域性鉤子
    def clean(self):
        # name=self.cleaned_data.get('name')
        # print(name)
        password = self.cleaned_data.get('password')
        re_password = self.cleaned_data.get('re_password')
        if password == re_password:
            return self.cleaned_data
            # return {'lqz':"nb"}
        else:
            raise ValidationError('兩次密碼不一致')

4 cookie session token

1 https://www.cnblogs.com/liuqingzheng/articles/8990027.htmlp
    
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的使用

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: name=lqz
    return obj


def get_cookie(request):

    print(request.COOKIES)
    print(request.COOKIES.get('name'))
    return HttpResponse('我拿了你傳過來的cookie')


def delete_cookie(request):

    obj=HttpResponse('我刪掉了你 name 這個cookie ')
    obj.delete_cookie('name')
    return obj

擴充

https://www.cnblogs.com/liuqingzheng/articles/8980355.html

企業級什麼意思

Apache協議

作業

1 form元件的原始碼,找出區域性鉤子和全域性鉤子的位置

欄位自己的校驗完成後才執行區域性鉤子,
為什麼名字一定要叫clean_欄位名,
為什麼校驗失敗丟擲ValidationError,
為什麼成功要把欄位值返回,
為什麼全域性鉤子是在以上所有校驗通過才走,
為什麼全域性鉤子返回一個自己寫的字典,
在檢視函式中拿到的就是返回的

2 通過form元件實現使用者註冊功能(樣式好看,錯誤渲染,widgets,名字內不能帶sb,個人簡介裡不能有 敏感詞)

3 寫3個路由和檢視函式,一個是登入,寫入cookie,訪問order,必須登入以後才能訪問,否則重定向到登入頁面,退出功能,

4 (擴充)寫個登入認證裝飾器,載入order檢視函式上

相關文章