close

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>
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 ivankao 的頭像
    ivankao

    IvanKao的部落格

    ivankao 發表在 痞客邦 留言(0) 人氣()