探索[Django]项目结构的最佳实践 – 5. 对用户模型进行最简化的定制

关于这篇文章

以下是我根据《十二要素》等参考资料整理的备忘录,介绍了在进行Django的实际部署和团队开发时,应该如何对项目进行初始配置。

请参考

    • Django公式 ユーザーカスタマイズ方法

 

    • Django ユーザー カスタマイズ方法(自作記事)

 

    • Two Scoops of Django 1.11

現場で使える 基礎 Django(技術書典4バージョン)

修改现有用户模型的意义

Django的项目中已经预先定义了用户模型,但如果直接使用该用户模型,后续由于数据库定义的限制,很难对用户进行扩展。因此,一般来说,最好是首先创建一个定制化类来实现。

参考:在Django中,应始终使用自定义用户。

另外,由于默认的用户模型存在一些问题,我们一起从头开始进行修正。

默认用户模型的修改要点

添加全名

對於非英語區的人來說,使用名字和姓氏的方式可能會讓他們感到困惑。我們可以新增一個名為”full_name(姓名)”的項目,在使用者註冊的畫面上將名字和姓氏設為不可見。這是根據《Django兩球》的建議。

隐藏[任意]的访问权限项目。

如果使用管理者权限(超级用户权限),您可以在管理界面上实现以下访问控制。

    • 管理者

ユーザー情報の編集を含む全機能が使える

一般スタッフ

アプリの利用と管理画面から自分のパスワード変更ができる

如果没有需要进行层级权限设置的话,可以在用户注册界面上隐藏”组”和”用户权限”选项。

将「一般员工权限」的默认值设为True。

在类似于本文所介绍的那种需要所有用户具有员工权限的应用程序中,将员工权限默认设置为True,并在用户注册界面上隐藏它会更加友好。

下面的示例代码是根据上述设置进行反映的。

示例代码

★ 首先,新增一个名为”users”的应用程序。


INSTALLED_APPS = [
    ...
    'users.apps.UsersConfig',
]

AUTH_USER_MODEL = 'users.User'

from django.db import models
from django.contrib.auth.models import AbstractUser
from django.utils.translation import gettext_lazy as _

class User(AbstractUser):

    # 名前の追加
    full_name = models.CharField(
        verbose_name='名前',
        max_length=100,
        blank=True
    )

    # 既存メソッドの変更
    def get_full_name(self):
        return self.full_name

    # スタッフ権限のデフォルトをTrueに変更
    is_staff = models.BooleanField(
        _('staff status'),
        default=True,
        help_text=_('Designates whether the user can log into this admin site.'),
    )

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.utils.translation import gettext_lazy as _
from .models import User

@admin.register(User)
class AdminUserAdmin(UserAdmin):

    # 変更前コードは django.contrib.auth.admin.py 参照

    fieldsets = (
        (None, {'fields': ('username', 'password')}),
        (_('Personal info'), {'fields': ('full_name', 'email')}),
        (_('Permissions'), {'fields': ('is_active', 'is_superuser')}),
        (_('Important dates'), {'fields': ('last_login', 'date_joined')}),
    )
    list_display = ('username', 'email', 'full_name')
    search_fields = ('username', 'full_name', 'email')

from django.apps import AppConfig


class UsersConfig(AppConfig):
    name = 'users'
    verbose_name = "ユーザー管理"
广告
将在 10 秒后关闭
bannerAds