https://www.cnblogs.com/maple-shaw/articles/9537320.htmljavascript
筆記:html
day78 1. 內容回顧 form組件 1. form組件乾的事: 1. 自動生成input框 2. 對提交的數據進行校驗 3. 有錯誤的信息 2. 定義一個form組件 from django import forms class RegForm(forms.Form): username = forms.CharField() pwd = forms.CharField() 3. 使用 後端使用: form_obj = RegForm() return render(request,'reg.html',{'form_obj':form_obj}) form_obj = RegForm(request.POST) form_obj.is_vaild() form_obj.cleaned_data ——》 字典 存放全部已經經過校驗的字段和值 前端使用: {{ form_obj.as_p }} ——》生成全部的input框 {{ form_obj.username }} ——》username的input框 {{ form_obj.username.label }} ——》username的標籤顯示文字 {{ form_obj.username.id_for_label }} ——》input框的ID {{ form_obj.username.errors }} ——》當前字段的全部錯誤 {{ form_obj.username.errors.0 }} ——》當前字段的第一個錯誤 {{ form_obj.errors}} ——》form表單的全部錯誤 4. 字段類型和參數 1. CharField() ChoiceField() 2. 參數 label 顯示的文本 initail 初識化的值 min_length 最小長度 max_length 最大長度 required 是否必須 error_messages = {"min_length":"過短了",'required': ""} widget = forms.widgets.PasswordInput( attrs:{"class":"form_control"} ) validators = [驗證器1,驗證器2] 3. 驗證 1. 內置的驗證 min_length max_length required 2. 自定義驗證器 validators = [驗證器1,驗證器2] from django.core.validators import RegexValidator RegexValidator(r'1[3-9]\d{9}', '手機號不正經') 定義函數 def check(value): if "alex" in value: raise ValidationError('含有非法字符') 3. 鉤子函數 1. 局部鉤子 clean_字段名(self): 經過校驗:返回當前校驗的值 不經過: raise ValidationError('不經過') 2. 全局鉤子 clean(self): 經過校驗:self.cleaned_data 不經過: self.add_error('re_pwd', '兩次密碼不一致!!!!') raise ValidationError('不經過') 2. 今日內容 1. auth認證 from django.contrib import auth 1. 註冊超級用戶 python manage.py createsuperuser 2. 認證用戶 user = authenticate(request, username=username, password=pwd) 3. 保存登陸狀態 寫入到session中 login(request,user) 4. 註銷 刪除用戶的session logout(request) 5. 登陸狀態 request.user.is_authenticated() 6. login_required 登陸以後才能訪問視圖 7. create_user() 8. create_superuser() 9. check_password(password) 10. set_password(password) 11. 擴展表 from django.contrib.auth.models import AbstractUser class UserInfo(AbstractUser): """ 用戶信息表 """ nid = models.AutoField(primary_key=True) phone = models.CharField(max_length=11, null=True, unique=True) # 引用Django自帶的User表,繼承使用時須要設置 AUTH_USER_MODEL = "app名.UserInfo"
/前端
/java
/python
User對象屬性:username, passwordsql
is_active : 是否容許用戶登陸, 設置爲 False,能夠在不刪除用戶的前提下禁止用戶登陸。數據庫
is_staff : 若是是1,就是可使用賬號密碼登陸admin,可是登陸後界面以下,若是是0,壓根就不能登陸admin,django
新建項目,直接,migrate
而後把sqlit3拖過去,拖到數據庫的位置,
命令:python manager.py createsuperuser後端
django自帶管理後臺 在app文件夾下,admin.py文件裏面,瀏覽器
建立用戶
登陸後臺地址:
http://127.0.0.1:8000/admin
取消自動填充,
<form action='' method='post' autocomplete='off' novalidate>
novalidate:取消瀏覽器給作校驗,實際上應該作校驗,減少服務器壓力,
認證,須要導入模塊,
from django.contrib.auth import authenticate
顯示輸出的obj,
from django.contrib.auth import authenticate def login(request): if request.method=='POST': username=request.POST.get('username') pwd=request.POST.get('pwd') #對提交的數據進行認證,會返回一個對象,沒有的話會返回一個none obj=authenticate(request,username=username,password=pwd) # 此處obj輸出的是註冊的用戶名, print(obj) return redirect('/admin/') return render(request,'login.html')
引入的區別
# from django.contrib.auth import authenticate from django.contrib import auth
寫session數據
if obj: # 往數據庫的session表裏寫數據, 認證須要依賴session的中間件, auth.login(request,obj) return HttpResponse('ok') else: error_msg='用戶名或密碼錯誤,'
session的設置
同一個瀏覽器登陸多個賬號,只能保留最後一個的session,而不一樣瀏覽器的賬號登陸,則能夠保存多個session,他是認瀏覽器 的,
兩個瀏覽器登陸同一個賬號,session_key是不一樣的,可是session_data是相同的,
用來判斷當前請求是否經過了認證。
進行登陸驗證,相似於加裝飾器的功能,須要先引入,
from django.contrib.auth.decorators import login_required
顯示加了驗證的
@login_required def index(request): print(request.user.is_authenticated()) return render(request,'index.html')
經過加了裝飾器以後,再請求,沒有登陸的話,會顯示,須要跳轉的地址,手動修改url地址,修改成:
url(r'^accounts/login/', views.login),可是這樣很差,須要修改settings文件, 如今修改settings文件,仍是用原來的url路徑, sttings文件的修改 STATIC_URL = '/static/' LOGIN_URL='/login/' #這裏配置成項目登陸頁面的路由,
在app01文件夾下新建一個formspy文件,來使用forms組件,
from django import forms
class RegForm(forms.Form):
username=forms.CharField(
label='用戶名'
)
password=forms.CharField(
label='密碼',
widget=forms.widgets.PasswordInput() #確保密碼是密文的形式,
)
re_password=forms.CharField(
label='確認密碼',
widget=forms.widgets.PasswordInput()
)
views代碼,
def reg(request):
# 進行實例化一個對象,傳給前端,
form_obj=RegForm()
if request.method=='POST':
form_obj=RegForm(request.POST)
# 須要引入模塊,from django.contrib.auth.models import User
if form_obj.is_valid(): #進行校驗,
# 進行取值,中括號裏的內容就是forms文件裏定義的,至關於鍵值對的key
username=form_obj.cleaned_data['username']
password=form_obj.cleaned_data['password']
# 進行建立用戶,username是數據庫裏的字段,
# User.objects.create(username=username,password=password)
# 以上create是建立的密碼是明文形式,且不能用於登陸,
# create_user建立的用戶密碼是密文形式,
User.objects.create(username=username,password=password)
return render(request,'ret.html',{'form_obj':form_obj})
進行改進後的版本,將cleaned_data數據進行了修改,
# 改進後,在進行cleaned_data處進行改進, def reg(request): # 進行實例化一個對象,傳給前端, form_obj=RegForm() if request.method=='POST': form_obj=RegForm(request.POST) # 須要引入模塊,from django.contrib.auth.models import User if form_obj.is_valid(): #進行校驗, form_obj.cleaned_data.pop('re_password') # 建立普通用戶, # User.objects.create_user(**form_obj.cleaned_data) # 建立超級用戶,建立超級用戶時,email是空,因此下面須要寫爲空,或者給定一個郵箱地址, User.objects.create_superuser(**form_obj.cleaned_data,email='') return render(request,'ret.html',{'form_obj':form_obj})
註冊後,直接跳到指定頁面,
def reg(request): # 進行實例化一個對象,傳給前端, form_obj=RegForm() if request.method=='POST': form_obj=RegForm(request.POST) # 須要引入模塊,from django.contrib.auth.models import User if form_obj.is_valid(): #進行校驗, form_obj.cleaned_data.pop('re_password') # 建立普通用戶, User.objects.create_user(**form_obj.cleaned_data) # 建立超級用戶,建立超級用戶時,email是空,因此下面須要寫爲空,或者給定一個郵箱地址, # User.objects.create_superuser(**form_obj.cleaned_data,email='') # 建立用戶後跳到登陸界面 # return redirect('/login/') # 或者進行登陸驗證後跳到index界面 obj=auth.authenticate(request,**form_obj.cleaned_data) auth.login(request,obj) return redirect('/index/') return render(request,'ret.html',{'form_obj':form_obj})
這內置的認證系統這麼好用,可是auth_user表字段都是固定的那幾個,我在項目中無法拿來直接使用啊!
好比,我想要加一個存儲用戶手機號的字段,怎麼辦?
聰明的你可能會想到新建另一張表而後經過一對一和內置的auth_user表關聯,這樣雖然能知足要求可是有沒有更好的實現方式呢?
答案是固然有了。
咱們能夠經過繼承內置的 AbstractUser 類,來定義一個本身的Model類。
這樣既能根據項目需求靈活的設計用戶表,又能使用Django強大的認證系統了。
from django.contrib.auth.models import AbstractUser class UserInfo(AbstractUser): """ 用戶信息表 """ nid = models.AutoField(primary_key=True) phone = models.CharField(max_length=11, null=True, unique=True) def __str__(self): return self.username
注意:
按上面的方式擴展了內置的auth_user表以後,必定要在settings.py中告訴Django,我如今使用我新定義的UserInfo表來作用戶認證。寫法以下:
# 引用Django自帶的User表,繼承使用時須要設置 AUTH_USER_MODEL = "app名.UserInfo"
再次注意:
一旦咱們指定了新的認證系統所使用的表,咱們就須要從新在數據庫中建立該表,而不能繼續使用原來默認的auth_user表了。
在admin.py文件裏面添加內容,以後纔會在後臺管理裏面看到對應內容
而後在管理後臺會進行對應顯示,