質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Q&A

解決済

1回答

479閲覧

カスタムユーザーでの認証時にユーザー名から登録情報を編集できない(Django)

guegue

総合スコア10

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

0グッド

0クリップ

投稿2022/04/17 00:49

編集2022/04/17 00:53

カスタムユーザーでの認証時にユーザー名から登録情報を編集できません。
Django 4.0.3

次のようなカスタムユーザーモデルを実装しました。

Python:models.py

1from django.db import models 2from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin 3from django.contrib.auth.validators import UnicodeUsernameValidator 4from django.core.mail import send_mail 5from django.utils import timezone 6from django.utils.translation import gettext_lazy as _ 7 8# Create your models here. 9 10 11class DiaryUserManager(BaseUserManager): 12 use_in_migration = True 13 14 def _create_user(self, username, email, password, **extra_fields): 15 if not username: 16 raise ValueError('ユーザーネームを入力してください') 17 if not email: 18 raise ValueError('Emailを入力して下さい') 19 email = self.normalize_email(email) 20 username = self.model.normalize_username(username) 21 user = self.model(username=username, email=email, **extra_fields) 22 user.set_password(password) 23 user.save(using=self.db) 24 return user 25 26 def create_user(self, username, email, password=None, **extra_fields): 27 extra_fields.setdefault('is_active', False) 28 extra_fields.setdefault('is_staff', False) 29 extra_fields.setdefault('is_superuser', False) 30 return self._create_user(email, username, password, **extra_fields) 31 32 def create_superuser(self, username, email, **extra_fields): 33 extra_fields.setdefault('is_staff', True) 34 extra_fields.setdefault('is_superuser', True) 35 extra_fields.setdefault('is_active', True) 36 extra_fields.setdefault('first_name','DEFAULT_FIRST_NAME') 37 extra_fields.setdefault('last_name','DEFAULT_LAST_NAME') 38 if extra_fields.get('is_staff') is not True: 39 raise ValueError('is_staff=Trueである必要があります。') 40 if extra_fields.get('is_superuser') is not True: 41 raise ValueError('is_superuser=Trueである必要があります。') 42 return self._create_user(username, email, **extra_fields) 43 44 45class DiaryUser(AbstractBaseUser, PermissionsMixin): 46 class_id = models.IntegerField(null=True, unique=True) 47 username_validator = UnicodeUsernameValidator() 48 49 username = models.CharField( 50 _("username"), 51 max_length=150, 52 unique=True, 53 help_text=_( 54 "Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only." 55 ), 56 validators=[username_validator], 57 error_messages={ 58 "unique": _("A user with that username already exists."), 59 }, 60 ) 61 first_name = models.CharField( 62 _("first name"), max_length=50, blank=False, null=False) 63 last_name = models.CharField( 64 _("last name"), max_length=50, blank=False, null=False) 65 email = models.EmailField(_("email address"), blank=True) 66 is_staff = models.BooleanField( 67 _("staff status"), 68 default=False, 69 help_text=_( 70 "Designates whether the user can log into this admin site."), 71 ) 72 is_active = models.BooleanField( 73 _("active"), 74 default=False, 75 help_text=_( 76 "Designates whether this user should be treated as active. " 77 "Unselect this instead of deleting accounts." 78 ), 79 ) 80 date_joined = models.DateTimeField(_("date joined"), default=timezone.now) 81 82 objects = DiaryUserManager() 83 84 EMAIL_FIELD = "email" 85 USERNAME_FIELD = "username" 86 REQUIRED_FIELDS = ["email"] 87 88 class Meta: 89 verbose_name = _("user") 90 verbose_name_plural = _("users") 91 92 def clean(self): 93 super().clean() 94 self.email = self.__class__.objects.normalize_email(self.email) 95 96 def get_full_name(self): 97 """ 98 Return the first_name plus the last_name, with a space in between. 99 """ 100 full_name = "%s %s" % (self.first_name, self.last_name) 101 return full_name.strip() 102 103 def get_short_name(self): 104 """Return the short name for the user.""" 105 return self.first_name 106 107 def email_user(self, subject, message, from_email=None, **kwargs): 108 """Send an email to this user.""" 109 send_mail(subject, message, from_email, [self.email], **kwargs) 110

管理画面の実装

Python:admin.py

1from django.contrib import admin 2from django.contrib.auth.admin import UserAdmin 3from .models import DiaryUser 4 5from . import models 6# Register your models here 7 8class DiaryUserAdmin(UserAdmin): 9 10 list_display = ('class_id', 'username', 11 'last_name', 'first_name', 'is_active', 'last_login') 12 search_fields = ('username',) 13 ordering = ('class_id', ) 14 list_filter = ('is_active', ) 15 16 fieldsets = ( 17 ('user info', {'fields': ('class_id', 'username', 18 'password', 'last_name', 'first_name', 'email')}), 19 ('permission', {'fields': ('is_staff', 'is_active', 'is_superuser')}), 20 ) 21 add_fieldsets = ( 22 ('user info', {'fields': ('class_id', 'username', 23 'password', 'last_name', 'first_name', 'email')}), 24 ('permission', {'fields': ('is_staff', 'is_active', 'is_superuser')}), 25 ) 26 27 28admin.site.register(DiaryUser, DiaryUserAdmin) 29

ユーザー一覧の管理画面
イメージ説明

ユーザー名をクリックして変更画面に遷移できるようにしたいのですがどのように修正すればよいか教えてください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

UserAdminを継承したクラスのlist_displayの一番最初の要素が変更リンクの対象となる

投稿2022/04/17 08:37

guegue

総合スコア10

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問