最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

對Django中內(nèi)置的User模型實(shí)例詳解

 更新時間:2019年08月16日 18:17:47   作者:stu_xujin  
今天小編就為大家分享一篇對Django中內(nèi)置的User模型實(shí)例詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

User模型

User模型是這個框架的核心部分。他的完整的路徑是在django.contrib.auth.models.User。

字段

內(nèi)置的User模型擁有以下的字段:

1、username: 用戶名。150個字符以內(nèi)??梢园瑪?shù)字和英文字符,以及_、@、+、.和-字符。不能為空,且必須唯一!

2、first_name:歪果仁的first_name,在30個字符以內(nèi)??梢詾榭?。

3、last_name:歪果仁的last_name,在150個字符以內(nèi)??梢詾榭?。

4、email:郵箱??梢詾榭铡?/p>

5、password:密碼。經(jīng)過哈希過后的密碼。

6、groups:分組。一個用戶可以屬于多個分組,一個分組可以擁有多個用戶。groups這個字段是跟Group的一個多對多的關(guān)系。

7、user_permissions:權(quán)限。一個用戶可以擁有多個權(quán)限,一個權(quán)限可以被多個用戶所有用。和Permission屬于一種多對多的關(guān)系。

8、is_staff:是否可以進(jìn)入到admin的站點(diǎn)。代表是否是員工。

9、is_active:是否是可用的。對于一些想要刪除賬號的數(shù)據(jù),我們設(shè)置這個值為0就可以了,而不是真正的從數(shù)據(jù)庫中刪除。

10、is_superuser:是否是超級管理員。如果是超級管理員,那么擁有整個網(wǎng)站的所有權(quán)限。

11、last_login:上次登錄的時間。

12、date_joined:賬號創(chuàng)建的時間。

User模型的基本用法:

首先我們先執(zhí)行makegrations和migrate對模型進(jìn)行映射。

創(chuàng)建用戶:

通過create_user方法可以快速的創(chuàng)建用戶。這個方法必須要傳遞username、email、password

from django.http import HttpResponse
from django.contrib.auth.models import User

def index(request):
  user = User.objects.create_user(username='xujin',email='qq@qq.com',password='111111')
  return HttpResponse('success')

然后我們執(zhí)行上面的視圖,然后進(jìn)入數(shù)據(jù)庫,找到auth_user這張表,我們就能查看到我們剛才創(chuàng)建的用戶的信息了

上面的三個參數(shù)是必須傳的參數(shù),其他的參數(shù)是可選參數(shù)。我們可以在數(shù)據(jù)庫中看到我們設(shè)置的密碼仿佛是一竄亂碼,其實(shí)這并不是亂碼,而是因?yàn)槲覀冊O(shè)置的user的密碼時經(jīng)過哈希加密處理的,所以看起來是一竄亂碼。

我們還可以對user對象進(jìn)行更改數(shù)據(jù)。

def index(request):
  # user = User.objects.create_user(username='xujin',email='qq@qq.com',password='111111')
  user = User.objects.get(username='xujin')
  user.last_name = 'aaa'
  user.save() #更改完數(shù)據(jù)之后一定要記得保存
  return HttpResponse('success')

但是對于密碼這個字段,我們不能這樣修改,因?yàn)檫@樣修改的密碼在數(shù)據(jù)庫中是明文顯示的,不會經(jīng)過哈希加密處理的。我們需要使用到user的一個方法來對密碼進(jìn)行更改。

def index(request):
  # user = User.objects.create_user(username='xujin',email='qq@qq.com',password='111111')
  user = User.objects.get(username='xujin')
  # user.last_name = 'aaa'
  # user.save() #更改完數(shù)據(jù)之后一定要記得保存
  # user.password = '222222' # 這樣修改是錯誤的,在數(shù)據(jù)庫中會明文顯示,不會被加密處理
  user.set_password('222222') # 這個方法設(shè)置的密碼才會經(jīng)過加密處理然后存放到數(shù)據(jù)庫中去
  user.save()
  return HttpResponse('success')

創(chuàng)建超級用戶:

創(chuàng)建超級用戶有兩種方式。

第一種是使用代碼的方式。用代碼創(chuàng)建超級用戶跟創(chuàng)建普通用戶非常的類似,只不過是使用create_superuser。示例代碼如下:

def index(request):
  user = User.objects.create_superuser(username='xujin1',email='QQ@qq.com',password='111111')
  return HttpResponse('success')

這樣我們就成功的創(chuàng)建了一個超級用戶,我們也可以在數(shù)據(jù)庫中的auth_user表中的is_superuser字段中查看到值為1,即時超級用戶,而剛才我們創(chuàng)建的普通用戶值就為0。

第二種創(chuàng)建超級用戶的方式是使用命令行:

在終端輸入:

python manage.py createsuperuser

這樣,我們也能創(chuàng)建一個超級用戶,但是這樣對輸入的密碼要求比較高,不能設(shè)置很簡單的密碼。

注意: 因?yàn)閐jango內(nèi)置的user模型規(guī)定的是username為唯一字段,所以我們創(chuàng)建用戶的時候username是不能重復(fù)的。

登錄驗(yàn)證

Django的驗(yàn)證系統(tǒng)已經(jīng)幫我們實(shí)現(xiàn)了登錄驗(yàn)證的功能。通過django.contrib.auth.authenticate即可實(shí)現(xiàn)。這個方法只能通過username和password來進(jìn)行驗(yàn)證。示例代碼如下:

from django.contrib.auth import authenticate

def index(request):
  username = 'xujin'
  password = '222222'
  user = authenticate(request,username=username,password=password) # 驗(yàn)證成功之后就會返回這個user對象
  if user:
    print('登錄成功:%s' % user.username)
  else:
    print('用戶名或密碼錯誤!')
  return HttpResponse('success')

擴(kuò)展用戶模型

Django內(nèi)置的User模型雖然已經(jīng)足夠強(qiáng)大了。但是有時候還是不能滿足我們的需求。比如在驗(yàn)證用戶登錄的時候,他用的是用戶名作為驗(yàn)證,而我們有時候需要通過手機(jī)號碼或者郵箱來進(jìn)行驗(yàn)證。還有比如我們想要增加一些新的字段。那么這時候我們就需要擴(kuò)展用戶模型了。擴(kuò)展用戶模型有多種方式。

1. 設(shè)置Proxy(代理)模型:

如果你對Django提供的字段,以及驗(yàn)證的方法都比較滿意,沒有什么需要改的。但是只是需要在他原有的基礎(chǔ)之上增加一些操作的方法。那么建議使用這種方式。示例代碼如下:

在models.py中創(chuàng)建一個代理模型:

from django.contrib.auth.models import User

class Person(User):
  class Meta:
    proxy = True # 表明這是一個代理模型

  @classmethod
  def get_user_number(cls):
    # 獲取user的個數(shù)
    return cls.objects.all().count()

然后在views.py導(dǎo)入并使用:

from .models import Person

def proxyView(request):
  user_number = Person.get_user_number()
  print(user_number)
    
  # 因?yàn)槲覀兪褂昧舜砟P?,那么以下兩種寫法是等價的  # User.objects.all()
  # Person.objects.all() 
  
  return HttpResponse('success')

這就是代理模型的基本使用了,我們可以定義一些自己的方法,而又不需要改變原來的User模型中的方法。

因?yàn)檫@是一個代理的模型,所以我們不能在里面添加新的字段了,例如,我想要在Person模型中添加一個新的字段,那么就會報錯,報錯的大概意思就是代理模型不能添加字段。

class Person(User):
  telephone = models.CharField(max_length=11)

  class Meta:
    proxy = True # 表明這是一個代理模型

  @classmethod
  def get_user_number(cls):
    # 獲取user的個數(shù)
    return cls.objects.all().count()

執(zhí)行makegrations后的報錯信息為:

ERRORS:
?: (models.E017) Proxy model 'Person' contains model fields.

雖然代理模型不能擁有新的字段,但是可以擁有自己的屬性的。

那么如果我們想給user模型增加新的字段,那么我們可以采用另外一種方式擴(kuò)展:一對一外鍵

一對一外鍵

如果你對用戶驗(yàn)證方法authenticate沒有其他要求,就是使用username和password即可完成。但是想要在原來模型的基礎(chǔ)之上添加新的字段,那么可以使用一對一外鍵的方式。

首先在models.py中新建一個模型,然后使用一對一外鍵和User連接起來:

class UserExtension(models.Model):
  # 定義一個一對一的外鍵
  user = models.OneToOneField(User,on_delete=models.CASCADE,related_name='extension')
  telephone = models.CharField(max_length=11)
  school = models.CharField(max_length=100)

from django.dispatch import receiver
from django.db.models.signals import post_save
# 這是一個信號函數(shù),即每創(chuàng)建一個User對象時,就會新建一個userextionsion進(jìn)行綁定,使用了receiver這個裝飾器
@receiver(post_save,sender=User)
def handler_user_extension(sender,instance,created,**kwargs):
  if created: # 如果是第一次創(chuàng)建user對象,就創(chuàng)建一個userextension對象進(jìn)行綁定
    UserExtension.objects.create(user=instance)
  else: # 如果是修改user對象,那么也要將extension進(jìn)行保存
    instance.extension.save()

然后我們需要將我們添加的字段映射到數(shù)據(jù)庫中去,執(zhí)行makegrations和migrate。

然后在views.py中寫入視圖:

def oneView(request):
  user = User.objects.create_user(username='aaaaaa',email='QQ@qq.com',password='111111')
  return HttpResponse('一對一擴(kuò)展User')

添加映射,執(zhí)行代碼,然后就能在數(shù)據(jù)庫中看到我么添加的信息了。

因?yàn)槲颐炊x一個extention的擴(kuò)展模型,那么我們就不能使用自帶的authenticate來驗(yàn)證登錄了,那么我們就可以自定義一個我們自己的authenticate來驗(yàn)證登錄。

def my_authenticate(telephone,password):
  user = User.objects.filter(extension__telephone=telephone).first()
  if user:
    is_correct = user.check_password(password)
    if is_correct:
      return user
    else:
      print('密碼錯誤!')
      return None
  else:
    print('沒有找到此用戶')
    return None

def oneView(request):
  # 創(chuàng)建一條測試數(shù)據(jù)
  user = User.objects.create_user(username='bbb',email='QQ@qq.com',password='111111')
  user.extension.telephone = '18888888888'
  user.save()
  return HttpResponse('一對一擴(kuò)展User')

上面的代碼中我們定義好了一個我么自己的authenticate方法my_authenticate來驗(yàn)證登錄,然后我么 在視圖oneView中新建了一個測試數(shù)據(jù),這個時候我們還沒有使用到我們自己定義的方位,因?yàn)槲覀兪紫鹊男陆y試數(shù)據(jù)才能使用。

運(yùn)行了上面的代碼之后,我們就可以使用我們自己定義的方法來驗(yàn)證登錄了。

修改視圖:

def oneView(request):
  # 創(chuàng)建一條測試數(shù)據(jù)
  # user = User.objects.create_user(username='bbb',email='QQ@qq.com',password='111111')
  # user.extension.telephone = '18888888888'
  # user.save()
  telephone = '18888888888'
  password = '111111'
  user = my_authenticate(telephone,password)
  if user:
    print('登錄成功')
  else:
    print('登錄失敗')
  return HttpResponse('一對一擴(kuò)展User')

上面就是使用一對一的方式來擴(kuò)展User模型。

繼承自AbstractUser

對于authenticate不滿意,并且不想要修改原來User對象上的一些字段,但是想要增加一些字段,那么這時候可以直接繼承自django.contrib.auth.models.AbstractUser,其實(shí)這個類也是django.contrib.auth.models.User的父類。比如我們想要在原來User模型的基礎(chǔ)之上添加一個telephone和school字段,那么示例代碼如下。

首先我們先將以前所有的代碼注釋掉,然后在models.py中寫入代碼:

from django.contrib.auth.models import AbstractUser,BaseUserManager

# 自定義管理工具
class UserManage(BaseUserManager):
  # _表示是受保護(hù)的,只能在這個類中可以調(diào)用
  def _create_user(self,telephone,username,password,**kwargs):
    if not telephone:
      raise ValueError('必須要傳遞手機(jī)號')
    if not password:
      raise ValueError('必須要輸入密碼')
    user = self.model(telephone=telephone,username=username,**kwargs)
    user.set_password(password)
    user.save()
    return user

 # 創(chuàng)建普通用戶
  def create_user(self,telephone,username,password,**kwargs):
    kwargs['is_superuser'] = False
    return self._create_user(telephone=telephone,username=username,password=password,**kwargs)

  # 創(chuàng)建超級用戶
  def create_superuser(self,telephone,username,password,**kwargs):
    kwargs['is_superuser'] = True
    return self._create_user(telephone=telephone, username=username, password=password, **kwargs)


class User(AbstractUser):
  telephone = models.CharField(max_length=11,unique=True)
  school = models.CharField(max_length=100)

  # 我們在使用authenticate的時候,默認(rèn)傳入的就好似username和password字段
  # 現(xiàn)在我們設(shè)置了這個屬性的值,那么再使用authenticate的時候,就會使用我們設(shè)定的字段
  USERNAME_FIELD = 'telephone'
  objects = UserManage()

然后我們需要去settings中添加一個變量,來告訴Django我們修改了內(nèi)置的User模型,使用的是我們自己的User模型:

AUTH_USER_MODEL = 'front.User'

上面的變量的名字不是隨便取的,是必須為這個名字。

里面的值是我們定義的User模型的位置:app名.模型名。

要使用我們定義的模型,我們首先得映射到數(shù)據(jù)庫中去,但是因?yàn)槲覀兏淖兞藘?nèi)置的User的結(jié)構(gòu),并且數(shù)據(jù)庫中已經(jīng)移植了以前沒有改變的User模型,我們現(xiàn)在再直接移植肯定是會報錯的,那么我們就需要將所有的表進(jìn)行刪除,然后將遷移文件也進(jìn)行刪除了,才可以進(jìn)行移植。才能執(zhí)行makegrations和migrate命令不會報錯。

然后我們在views.py中添加視圖:

from .models import User

def inherit_view(request):
  telephone = '18888888888'
  password = '111111'
  username = 'xujin'
  user = User.objects.create_user(telephone=telephone,password=password,username=username)
  print(user.username)
  return HttpResponse('success')

然后執(zhí)行上面的代碼,就能夠成功的創(chuàng)建用戶了,并且使用的使我們自定義的User模型。

那么如果我們現(xiàn)在需要使用authenticate來驗(yàn)證輸入信息,我們應(yīng)該驗(yàn)證哪一個字段呢?

def inherit_view(request):
  telephone = '18888888888'
  password = '111111'
  username = 'xujin'
  # user = User.objects.create_user(telephone=telephone,password=password,username=username)
  # print(user.username)

  user = authenticate(request,username=telephone,password=password)
  if user:
    print('登錄成功')
    print(user.username)
  else:
    print('驗(yàn)證失敗')
  return HttpResponse('success')

為什么在authenticate中,username參數(shù)我們傳入的是telephone字段呢。是因?yàn)樵赨ser模型中,我們重寫了USERNAME_FIELD屬性,而這個屬性接收的值就是authenticate中username對應(yīng)的字段,因?yàn)槲覀冊赨ser中將USERNAME_FIELD的值改為了telephone字段,所以我們使用的時候也需要使用telephone字段,相當(dāng)于username并不是表示username字段,而是我們USERNAME_FIELD屬性定義的字段。

注意: USERNAME_FIELD屬性值對應(yīng)的字段必須設(shè)置唯一,即需要設(shè)置unique=True這個參數(shù)。

以上這篇對Django中內(nèi)置的User模型實(shí)例詳解就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python編程中flask的簡介與簡單使用

    Python編程中flask的簡介與簡單使用

    今天小編就為大家分享一篇關(guān)于Python編程中flask的簡介與簡單使用,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • django 使用內(nèi)置messages的操作

    django 使用內(nèi)置messages的操作

    這篇文章主要介紹了django 使用內(nèi)置messages的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • python實(shí)現(xiàn)時間序列自相關(guān)圖(acf)、偏自相關(guān)圖(pacf)教程

    python實(shí)現(xiàn)時間序列自相關(guān)圖(acf)、偏自相關(guān)圖(pacf)教程

    這篇文章主要介紹了python實(shí)現(xiàn)時間序列自相關(guān)圖(acf)、偏自相關(guān)圖(pacf)教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • python實(shí)現(xiàn)不同電腦之間視頻傳輸功能

    python實(shí)現(xiàn)不同電腦之間視頻傳輸功能

    這篇文章主要介紹了python實(shí)現(xiàn)不同電腦之間視頻傳輸,本文視頻傳輸實(shí)現(xiàn)的前提是確保發(fā)送端和接收端接在同一個局域網(wǎng)下,分為發(fā)送端和接收端,通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2021-06-06
  • Python可視化分析全球火山分布

    Python可視化分析全球火山分布

    也就在前幾天,南太平洋島國湯加發(fā)生火山噴發(fā)。所以今天小編將為大家介紹如何用Python當(dāng)中的folium模塊以及其他的可視化庫來對全球的火山情況做一個分析。需要的可以參考一下
    2022-01-01
  • python 用struct模塊解決黏包問題

    python 用struct模塊解決黏包問題

    這篇文章主要介紹了python 用struct模塊解決黏包問題,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-11-11
  • 將python運(yùn)行結(jié)果保存至本地文件中的示例講解

    將python運(yùn)行結(jié)果保存至本地文件中的示例講解

    今天小編就為大家分享一篇將python運(yùn)行結(jié)果保存至本地文件中的示例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • Python中SyntaxError: invalid syntax報錯解決

    Python中SyntaxError: invalid syntax報錯解決

    在編寫Python代碼時,常見的SyntaxError錯誤通常由括號不匹配、關(guān)鍵字拼寫錯誤或不正確的縮進(jìn)引起,本文詳細(xì)介紹了錯誤原因及多種解決方案,包括檢查括號、關(guān)鍵字,以及使用IDE的語法檢查功能等,感興趣的可以了解一下
    2024-09-09
  • Python反爬蟲技術(shù)之防止IP地址被封殺的講解

    Python反爬蟲技術(shù)之防止IP地址被封殺的講解

    今天小編就為大家分享一篇關(guān)于Python反爬蟲技術(shù)之防止IP地址被封殺的講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • Python中的http.server庫用法詳細(xì)介紹

    Python中的http.server庫用法詳細(xì)介紹

    這篇文章主要給大家介紹了關(guān)于Python中http.server庫用法的相關(guān)資料,http.server是Python標(biāo)準(zhǔn)庫中的一個模塊,用于創(chuàng)建基本的HTTP服務(wù)器,它提供了處理HTTP請求的基本框架和核心類,需要的朋友可以參考下
    2024-11-11

最新評論

桂阳县| 营口市| 毕节市| 读书| 葫芦岛市| 湾仔区| 云和县| 巴彦县| 鹤山市| 赤水市| 右玉县| 民乐县| 南平市| 库车县| 天峻县| 利津县| 郧西县| 淮南市| 忻城县| 福海县| 大连市| 桃源县| 永登县| 鹰潭市| 开远市| 广元市| 盐山县| 通州市| 扬州市| 珠海市| 隆安县| 吉隆县| 澜沧| 永兴县| 三门峡市| 綦江县| 阳东县| 台东市| 盐城市| 四子王旗| 息烽县|