Python Django 學習紀錄:架設個人部落格(八)
自定義用戶模型
有時候需要自訂用戶模型,這時候可以從Django內建的用戶模型繼承或是關聯
兩種方法各有優缺,由於專案已經在架設中,所以這裡採用關聯的方法
最後在導航欄添加後台管理的項目,判斷超級使用者登入的話,即可進入後台管理
一.、拓展方法
創建模型繼承Django的用戶模型
創建新的模型拓展關聯User
1.創建模型繼承Django用戶模型
(1)方法
自定義模型繼承AbstractUser
配置settings 的 AUTH_USER_MODEL
(2)使用
外鍵關聯settings.AUTH_USER_MODEL
用 get_user_model 的方法獲取User模型
(3)優點
自定義強
沒有不必要字段(需要繼承AbstractBaseUser)
(4)缺點
需要刪庫重來或著需要項目一開始就使用
配置 admin 較麻煩
2.創建新的模型拓展關聯User
(1)方法
創建自定義模型
外鍵關聯User
(2)使用
直接使用即可
(3)優點
使用方便
不用刪庫重來引響整體構架
(4)缺點
存在不必要字段
對比繼承的方法,查詢速度稍慢
二.、創建新的模型拓展關聯User
可以參考Django官方文件
1.創建模型
在 user 應用的 <models.py> 創建 Profile 模型
並使用一對一關聯的方式,關聯Django內建的User模型:
from django.db import models from django.contrib.auth.models import User # Create your models here. class Profile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE) #一對一關聯 nickname = models.CharField(max_length=20, verbose_name='暱稱') #介面顯示為中文 def __str__(self): #定義物件名稱 return '<Profile: %s for %s>' % (self.nickname, self.user.username)
2.註冊Admin
將Profile顯示到Django內建的Admin系統
除了註冊Profile模型
也在Django內建的User模型中添加Profile項目:
from django.contrib import admin from .models import Profile from django.contrib.auth.models import User from django.contrib.auth.admin import UserAdmin as BaseUserAdmin #顯示Profile模型 @admin.register(Profile) class ProfileAdmin(admin.ModelAdmin): list_display = ('user','nickname') #將Profile添加至User模型 class ProfileInline(admin.StackedInline): model = Profile can_delete = False # 定義新的Admin class UserAdmin(BaseUserAdmin): inlines = (ProfileInline, ) #插入Profile list_display = ('username','nickname','email','is_staff','is_active','is_superuser') def nickname(self, obj): #定義nickname欄位顯示的內容 return obj.profile.nickname nickname.short_description = '暱稱' #介面顯示為中文 # 重新註冊Admin admin.site.unregister(User) admin.site.register(User, UserAdmin)
三.、導航欄添加後台管理項目
在<base.html>的導航欄判斷是否為超級使用者
並添加後台管理頁面的連結:
<li class="dropdown"> <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">{{ user.username }}<span class="caret"></span></a> <ul class="dropdown-menu"> <li><a href="{% url 'user_info' %}">個人資料</a></li> {% if user.is_staff or user.is_superuser %} <li><a href="{% url 'admin:index' %}">後台管理</a></li> {% endif %} <li><a href="{% url 'logout' %}?from={{ request.get_full_path }}">登出</a></li> </ul> </li>