Python Web 框架-Django day07
目錄
day06回顧
1.自定義查詢物件 1.宣告類 繼承自 models.Manager 定義自定義函式 2.為實體類覆蓋 objects class Entry(models.Model): objects = EntryManager() 2.HttpRequest 1.判斷請求方式 request.method 2.獲取請求提交的資料 1.get request.GET['name'] 2.post request.POST['name'] 3.獲取請求訊息頭 request.META request.META.HTTP_REFERER 4.提交post請求 Django對post請求需要進行一個 csrf 驗證 解決方案: 1.增加 {% csrf_token %} 標籤 2.刪除 csrf 相關的中介軟體 3.將 @csrf_protect 新增到檢視處理函式上 3.使用 forms 模組 1.使用 forms 模組 1.建立 forms.py 2.匯入 forms 模組 from django import forms 3.建立 class,一個class對應著一個表單 class ClassName(forms.Form): 屬性 :每一個屬性會生成一個表單控制元件 forms.CharField() forms.EmailField() forms.IntegerField() ... ... 2.在模板中 解析 form 物件 0.注意 1.建立表單 - <form></form> 2.自定義按鈕 1.手動解析 form = XXXForm() return render(request,'xxx.html',locals())
xxx.html : {% for field in form %} {{field}} : 表示的是一個控制元件 {{field.label}} : 表示的是label引數值 {% endfor %} 2.自動解析 {{form.as_p}} {{form.as_ul}} {{form.as_table}} 3.檢視中通過 forms.Form 接收表單資料 1.通過 forms.Form的構造器接收資料 form = XXXForm(request.POST) 2.需要讓 form 通過驗證後 ,再取值 form.is_valid() True:通過所有驗證 False:未通過驗證 3.獲取表單資料 form.cleaned_data
1.forms模組
- forms模組的高階處理
將Models 和 Forms 結合到一起使用
- 在 forms.py 中建立class,繼承自 forms.ModelForm
- 建立內部類 Meta,去關聯 Model
- model:指定要關聯的實體類
- fields:指定從Model中取哪些欄位生成控制元件
- 取值 '__all__',表示全部屬性都要生成控制元件
- 取值 列表,宣告允許生成控制元件的屬性名
- labels:指定每個屬性所關聯的label,取值為字典
labels = {
‘屬性名’:'label文字',
'屬性名':'label文字',
}
解析:
forms.py關聯,建立控制元件from django.db import models # Create your models here. class User(models.Model): uphone=models.CharField(max_length=30) upwd=models.CharField(max_length=30) uname=models.CharField(max_length=50) uemail = models.EmailField()
交給檢視函式views.pyfrom django import forms from .models import * class RegisterForm(forms.ModelForm): #通過內部類Meta表示關聯的資訊 class Meta: #1.指定關聯的Model model = User #2.指定要生成控制元件的欄位們 fields = "__all__" #3.指定每個控制元件對應的label labels = { 'uphone':'電話號碼', 'upwd':'登入密碼', 'uname':'使用者名稱稱', 'uemail':'電子郵件', } class LoginForm(forms.ModelForm): class Meta: model = User fields = ['uphone','upwd'] labels = { 'uphone':'註冊電話', 'upwd':'登入密碼', } #指定小部件 widgets = { 'upwd':forms.PasswordInput(attrs={ 'placeholder':'請輸入您的密碼' }) }
from django.http import HttpResponse from django.shortcuts import render from .forms import * def register_views(request): if request.method == 'GET': form = RegisterForm() return render(request,'05-register.html',locals()) else: form = RegisterForm(request.POST) if form.is_valid(): user = User(**form.cleaned_data) # 資料庫配置成功並且實體類對映成表之後,該操作可以實現 user.save() return HttpResponse('OK') def login_views(request): if request.method == 'GET': form = LoginForm() #宣告一個帶有小部件的form - WidgetLoginForm # form = WidgetLoginForm() return render(request,'06-login.html',locals())
- 內建小部件
- 什麼是小部件 小部件(widget),表示的是生成到頁面上的控制元件的型別以及其他的html屬性
- 常用小部件型別
- TextInput:type='text'
- PasswordInput:type='password'
- NumberInput:type='number'
- EmailInput:type='email'
- URLInput:type='url'
- HiddenInput:type='hidden'
- CheckboxInput:type='checkbox'
- Textarea:<textarea></textarea>
- Select:<select></select>
- 小部件的使用
- 繼承自 forms.Form
- 基本版
只指定控制元件的型別
class RemarkForm(forms.Form):
屬性 = forms.CharField(
label='文字',
widget=forms.小部件型別
)
class WidgetLoginForm(forms.Form): uphone = forms.CharField(label='電話號碼') #為pwd指定小部件,顯示為 密碼框 upwd = forms.CharField(label='登入密碼',widget=forms.PasswordInput)
- 高階版
指定控制元件型別的基礎上還允許設定html的一些相關屬性
屬性 = forms.CharField(
label=‘文字’,
widget=forms.小部件型別(
attrs = {
'html屬性名':'屬性值',
'html屬性名':'屬性值',
}
)
)
class WidgetLoginForm(forms.Form): uphone = forms.CharField(label='電話號碼') upwd = forms.CharField( label='登入密碼', widget=forms.PasswordInput( attrs = { 'placeholder':'請輸入密碼', 'class':'form-control', } ) )
- 基本版
只指定控制元件的型別
class RemarkForm(forms.Form):
屬性 = forms.CharField(
label='文字',
widget=forms.小部件型別
)
- 繼承自 forms.ModelForm
class XXXForm(forms.ModelForm):
class Meta:
model = User
fields = "__all__"
labels = {
'屬性1':'Label1',
}
widgets = {
'屬性1':forms.小部件型別(attrs={}),
}
class LoginForm(forms.ModelForm): class Meta: model = User fields = ['uphone','upwd'] labels = { 'uphone':'註冊電話', 'upwd':'登入密碼', } #指定小部件 widgets = { 'upwd':forms.PasswordInput(attrs={ 'placeholder':'請輸入您的密碼' }) }
- 繼承自 forms.Form
2.cookies 在 Django 中的實現
- django 中使用 cookies
- 設定cookies的值
語法:
相應物件.set_cookie(key,value,expires)
key:cookies的名字
value:cookie的值
expires:保持時間,以s為單位
ex:
響應物件.set_cookie('uname','tom',60*60*24*365)
響應物件:
- HttpResponse resp = HttpResponse('給客戶端的一句話') resp.set_cookie('key','value',expires) return resp
- render() resp = render(request,'xxx.html',locals()) resp.set_cookie('key','value',expires) return resp
- HttpResponseRedirect / redirect resp = redirect('/地址/') resp.set_cookie('key','value',expires) return resp
- 獲取cookies的值 通過 request.COOKIES 獲取當前站點下所有的cookies的資訊
- 設定cookies的值
語法:
相應物件.set_cookie(key,value,expires)
key:cookies的名字
value:cookie的值
expires:保持時間,以s為單位
ex:
響應物件.set_cookie('uname','tom',60*60*24*365)
響應物件:
3.session 在 Django 中的實現
- 設定session 的值 request.session['key'] = value
- 獲取 session 的值 value = request.session[key] value = request.session.get('key')
- 刪除 session 的值 del request.session['key']
4.在 settings.py中,設定session的相關設定
- SESSION_COOKIE_AGE 作用:設定 sessionID 在 cookie 中的儲存時間 ex: SESSION_COOKIE_AGE = 60*60*24
- SESSION_EXPIRE_AT_BROWSER_CLOSE 作用:設定關閉瀏覽器時則清空伺服器上對應的session空間 ex: SESSION_EXPIRE_AT_BROWSER_CLOSE = True
練習:用session和cookie判斷是否登陸成功, 簡單程式碼: views.py中的部分程式碼
def login_views(request):
# 判斷 get 請求還是 post 請求
if request.method == 'GET':
#get請求 - 判斷session,判斷cookie,登入頁
#先判斷session中是否有登入資訊
if 'uid' in request.session and 'uphone' in request.session:
#有登入資訊儲存在 session
return HttpResponse('您已經登入成功了')
else:
#沒有登入資訊儲存在 session,繼續判斷cookies中是否有登入資訊
if 'uid' in request.COOKIES and 'uphone' in request.COOKIES:
#cookies中有登入資訊 - 曾經記住過密碼
#將cookies中的資訊取出來儲存進session,再返回到首頁
uid = request.COOKIES['uid']
uphone = request.COOKIES['uphone']
request.session['uid']=uid
request.session['uphone']=uphone
return HttpResponse('您已經登入成功')
else:
#cookies中沒有登入資訊 - 去往登入頁
form = LoginForm() #這是forms.py中的類名
return render(request,'login.html',locals())
else:
#post請求 - 實現登入操作
#獲取手機號和密碼
uphone = request.POST['uphone']
upwd = request.POST['upwd']
#判斷手機號和密碼是否存在(登入是否成功)
users=User.objects.filter(uphone=uphone,upwd=upwd)
if users:
#登入成功:先存進session
request.session['uid']=users[0].id
request.session['uphone']=uphone
#宣告響應物件:響應一句話"登入成功"
resp = HttpResponse("登入成功")
#判斷是否要存進cookies
if 'isSaved' in request.POST:
expire = 60*60*24*90
resp.set_cookie('uid',users[0].id,expire)
resp.set_cookie('uphone',uphone,expire)
return resp
else:
#登入失敗
form = LoginForm()
return render(request,'login.html',locals())
今日示例:點選
b5nn