Django User 模塊之 AbstractUser 擴展詳解
最近在寫博客,剛好寫到用戶注冊注銷模塊,覺得這一方面還是挺有趣的。當嘗試掀開 Django 的源代碼時一切 API 就不會變得那么摸不著。順著讀Django 的各模塊源碼,我們可以更靈活地更改代碼以實現(xiàn)自己想要的功能。
現(xiàn)在,思考一個問題,主需求是實現(xiàn)博客中用戶的注冊登錄登出功能。如果只滿足于用戶注冊時只登記其郵箱或是用戶名,Django 自帶的 User 模塊既可以實現(xiàn)。但實際上,一個普遍的要求是注冊用戶應該能夠修改自己的頭像信息,郵箱信息,昵稱信息等其他更靈活的需求。
可以先看一下 Django User 模塊的源碼
class User(AbstractUser): ''' Users within the Django authentication system are represented by this model. Username, password and email are required. Other fields are optional. ''' class Meta(AbstractUser.Meta): swappable = ’AUTH_USER_MODEL’
注意:如果你的是 Anaconda 管理,可以在路徑 C:UsersUserAnaconda3Libsite-packagesdjangocontribauthmodels.py 查看
Django 中的 User 模塊實際上繼承了 AbstractUser 模塊,AbstractUser 模塊下有 :
usernamefirst_namelast_nameemaildate_joined …
你可以看出,User 模塊繼承了 AbstractUser 抽象基類,而僅僅只是繼承了,并沒有對 AbstractUser 進行任何擴展。所以,對于一個需要更多需求的 User 模塊信息來說,我們可以繼承 AbstractUser 并根據(jù)自己的需求進行擴展。
現(xiàn)在,我們對用戶屬性添加一些需求,比如支持用戶修改頭像、支持用戶昵稱、qq、wechat 以及網站鏈接等。
class User(AbstractUser): nickname = models.CharField(max_length=30, blank=True, null=True, verbose_name=’昵稱’) qq = models.CharField(max_length=20, blank=True, null=True, verbose_name=’QQ號碼’) url = models.URLField(max_length=100, blank=True, null=True, verbose_name=’個人網頁地址’) avatar = ProcessedImageField(upload_to=’avatar’,default=’avatar/default.png’, verbose_name=’頭像’) class Meta: verbose_name = ’用戶’ verbose_name_plural = verbose_name ordering = [’-id’] def __str__(self): return self.username
我們給自定義的用戶模塊增加 nickname(昵稱), qq, url(網站鏈接),avatar(頭像)屬性。
注意:為了讓 Django 能夠識別使用自定義的用戶模型,必須要在 settings.py 中設置自定義模塊位置,如在 settings.py 上添加
AUTH_USER_MODEL = ’blog.user’
其中,blog 為你對應的應用 app 信息,user 為 blog 應用下的 user 模塊,在這里 blog 和 user 大小寫無關。
如果在你現(xiàn)在執(zhí)行數(shù)據(jù)庫遷移命令,可能會出現(xiàn) blog 不存在 user 模塊 的提示,而無法重新進行數(shù)據(jù)遷移。
ValueError: The field account.EmailAddress.user was declared with a lazy reference to ’blog.user’, but app ’blog’ doesn’t provide model ’user’.The field admin.LogEntry.user was declared with a lazy reference to ’blog.user’, but app ’blog’ doesn’t provide model ’user’.The field blog.Article.author was declared with a lazy reference to ’blog.user’, but app ’blog’ doesn’t provide model ’user’.The field easy_comment.Comment.user was declared with a lazy reference to ’blog.user’, but app ’blog’ doesn’t provide model ’user’.The field easy_comment.Like.user was declared with a lazy reference to ’blog.user’, but app ’blog’ doesn’t provide model ’user’.The field notifications.Notification.recipient was declared with a lazy reference to ’blog.user’, but app ’blog’ doesn’t provide model ’user’.The field online_status.OnlineStatus.user was declared with a lazy reference to ’blog.user’, but app ’blog’ doesn’t provide model ’user’.The field socialaccount.SocialAccount.user was declared with a lazy reference to ’blog.user’, but app ’blog’ doesn’t provide model ’user’.
所以,如果之前是使用例如 AUTH_USER_MODEL = auth.user 的用戶模型,并重新將其自定義為 AUTH_USER_MODEL = blog.user 請刪掉 migrations 目錄下的所有文件 以及數(shù)據(jù)庫文件。
刪除之后,重新進行數(shù)據(jù)庫的遷移
$ python manage.py makemigrations myapp$ python manage.py migrate
這個時候,所使用的用戶即為自定義后的用戶了。
File 'C:UsersMickyAnaconda3libsite-packagesdjangodbbackendsutils.py', line 85, in _execute return self.cursor.execute(sql, params) File 'C:UsersMickyAnaconda3libsite-packagesdjangodbbackendssqlite3base.py', line 303, in execute return Database.Cursor.execute(self, query, params)django.db.utils.OperationalError: no such table: blog_user
這里可以在模板中指定數(shù)據(jù)庫 db_table = ’user’
補充知識:Django學習筆記——內置用戶類AbstractUser與內置認證校驗系統(tǒng)
內置用戶類AbstractUser
我們在之前講過了model模型的作用和父類的作用,這次介紹的內置用戶類AbstractUser就是Django內置的一個關于用戶操作的類,它極大地方便了我們對model模型中對User用戶類的設計。而所謂內置用戶類的本質也就是一個封裝好的父類,所以使用起來是相當?shù)姆奖恪?/p>
#導入AbstractUser類from django.contrib.auth.models import AbstractUser#直接繼承就可以了,如果有需要就向尋常model一樣寫字段就可以class User(AbstractUser): pass
我們通過查看AbstractUser的源碼可以知道它設有幾個字段
#用戶名username = models.CharField( _(’username’), max_length=150, unique=True, help_text=_(’Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.’), validators=[username_validator], error_messages={ ’unique’: _('A user with that username already exists.'), }, ) #名 first_name = models.CharField(_(’first name’), max_length=30, blank=True) #姓 last_name = models.CharField(_(’last name’), max_length=150, blank=True) #郵箱 email = models.EmailField(_(’email address’), blank=True) #權限 is_staff = models.BooleanField( _(’staff status’), default=False, help_text=_(’Designates whether the user can log into this admin site.’), ) #激活 is_active = models.BooleanField( _(’active’), default=True, help_text=_( ’Designates whether this user should be treated as active. ’ ’Unselect this instead of deleting accounts.’ ), ) #日期 date_joined = models.DateTimeField(_(’date joined’), default=timezone.now)
內置認證校驗系統(tǒng)
django自帶的用戶認證校驗系統(tǒng)較為簡單,主要就是認證用戶名密碼的正確與否
首先要在settings里面配置
#使用自帶的認證系統(tǒng)AUTH_USER_MODEL = 'user.User'
這是配合自帶的用戶類AbstractUser一起使用的
通常使用在類視圖中的post方法校驗用戶登錄等操作
在view中的具體代碼如下
class LoginView(View): def get(self,request): #邏輯代碼 return render(request,’login.html’) def post(self,request): # 獲取前端傳遞過來的用戶名和密碼 username = request.POST.get(’username’) pwd = request.POST.get(’pwd’) record = request.POST.get(’record’) # 進行數(shù)據(jù)校驗 if not all([username,pwd]): return HttpResponse(’數(shù)據(jù)輸入不完整’) # 驗證用戶名和密碼是否正確 user = authenticate(username=username,password=pwd) return render(request,’’index.html’)
主要就是其中的user = authenticate(username=username,password=pwd)
兩個參數(shù)都是拿到前端用戶輸入的信息
以上這篇Django User 模塊之 AbstractUser 擴展詳解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。
相關文章:
1. python共軛梯度法特征值迭代次數(shù)討論2. 利用FastReport傳遞圖片參數(shù)在報表上展示簽名信息的實現(xiàn)方法3. H5頁面使用audio標簽播放音頻4. ASP.NET MVC視圖頁使用jQuery傳遞異步數(shù)據(jù)的幾種方式詳解5. CSS3使用過度動畫和緩動效果案例講解6. ASP.NET MVC通過勾選checkbox更改select的內容7. react axios 跨域訪問一個或多個域名問題8. 詳解php如何合并身份證正反面圖片為一張圖片9. AJAX實現(xiàn)省市縣三級聯(lián)動效果10. XHTML 1.0:標記新的開端
