Django 3의 사용자 정의 사용자 모델

19257 단어 djangopythondatabase
이번 포스트에서는 우리만의 User Model을 정의하고 사용하는 방법에 대해 알아보겠습니다. 또한 Custom User Model을 등록하는 동안 변경해야 할 사항은 무엇입니까?

Django 내장 사용자 모델은 일반적인 경우에 적합합니다. 하지만 나이, 성별 등과 같은 추가 필드를 추가하려면 어떻게 해야 합니까?

여기에서 누군가 내장 사용자 모델을 확장하고 사용자를 위한 프로필 모델을 만들 수 없는 이유를 말할 것입니다. 이것도 좋은 선택이지만 Django 자체에서 Custom User Model을 사용해야 한다고 명시되어 있습니다. 정말 큰 프로젝트를 작업할 때 가장 좋은 접근 방식이기 때문입니다.

가상 환경에 Django 설치




#we will use venv module to install Django

#navigate to your working directory and run the below command

python -m venv "vertual_environment_name"

#now activate the virtual environment

/venv/scripts/activate.bat 

# now Install Django

pip install django==3.0.8



장고 프로젝트 만들기




#your virtual env should be activated

django-admin startproject "project_name"


사용자 앱 만들기




#navigate to your project folder

python manage.py startapp "app_name"

python manage.py startapp users

#add users app to installed_apps in your settings.py file



사용자 지정 사용자 모델 만들기


  • 사용자 모델에 대한 사용자 정의 관리자 생성
  • 사용자 모델 생성

  • from django.db import models
    from django.utils import timezone
    from django.utils.translation import gettext_lazy as _
    from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, BaseUserManager
    
    # 1. creating Custome Manager for User Model
    class CustomAccountManager(BaseUserManager):
        def create_user(self, email, user_name, first_name, password, **other_fields):
            if not email:
                raise ValueError(_('You must provide an email address'))
            # convert all in lowercase
            email = self.normalize_email(email)
            user = self.model(email=email, user_name=user_name,
                              first_name=first_name, **other_fields)
            user.set_password(password)
            user.save()
            return user
    
        def create_superuser(self, email, user_name, first_name, password, **other_fields):
            other_fields.setdefault('is_staff', True)
            other_fields.setdefault('is_superuser', True)
            other_fields.setdefault('is_active', True)
    
            if other_fields.get('is_staff') is not True:
                raise ValueError('Superuser must be assigned to is_staff=True.')
            if other_fields.get('is_superuser') is not True:
                raise ValueError(
                    'Superuser must be assigned to is_superuser=True.')
            return self.create_user(email, user_name, first_name, password, **other_fields)
    
    # 2. Creating Custom User Model
    class NewUser(AbstractBaseUser, PermissionsMixin):
        email = models.EmailField(_('email address'), unique=True)
        user_name = models.CharField(max_length=150, unique=True)
        first_name = models.CharField(max_length=150)
        start_date = models.DateTimeField(default=timezone.now)
        about = models.TextField(_('about'), max_length=500, blank=True)
        is_staff = models.BooleanField(default=False)
        is_active = models.BooleanField(default=True)
    
        objects = CustomAccountManager()
    
        USERNAME_FIELD = 'email'
    
        # required for superuser
        REQUIRED_FIELDS = ['user_name', 'first_name']
    
        def __str__(self):
            return self.user_name
    
    


    먼저 사용자 모델을 위한 사용자 지정 관리자를 만들었습니다. (관리자는 모델을 쿼리하는 데 사용되며 기본값은 '개체'입니다)

    Django는 BaseUserManager를 제공하고 이를 사용하여 두 가지 방법을 정의한 자체 관리자를 만들었습니다.
  • 사용자 생성
  • create_superuser

  • 유일한 주요 차이점은 create_superuser() 메서드에서 is_superuser 및 is_staff 속성을 True로 설정한다는 것입니다.

    다른 코드는 설명이 필요하지 않습니다. 일부 예외 검사일 뿐입니다.

    둘째, Django에서 제공하는 AbstractBaseUser를 확장하여 NewUser 모델을 만들었습니다. 우리는 또한 일부 권한 확인을 위해 PermissionsMixin을 사용했습니다.

    email, user_name, first_name, start_date, about 등과 같은 일부 필드를 정의했습니다.

    또한 두 개의 부울 속성 is_staff 및 is_active를 정의했습니다.

    is_staff는 모든 사용자가 스태프 상태를 얻지 않도록 False로 설정됩니다.

    is_active는 모든 사용자가 기본적으로 활성화되도록 True로 설정됩니다.

    objects = CustomAccountManager()가 가장 중요한 라인입니다. 여기서는 이전에 정의한 사용자 지정 관리자를 설정합니다.

    USERNAME_FIELD='email' 이 행은 이제 사용자가 user_name 대신 이메일을 사용하여 로그인할 것임을 알려줍니다.

    REQUIRED_FIELDS = ['user_name', 'first_name'] 이것은 우리가 super_user를 생성할 때 user_name과 first_name을 가져와야 한다는 것을 지정합니다. 그렇지 않으면 예외가 발생합니다.

    다음으로 str() 메서드를 정의하여 Django 관리자 패널에 사용자에게 친숙한 이름을 표시합니다.

    settings.py 파일에 AUTH_USER_MODEL 속성 추가




    # you must have added the users app into the installed_apps
    # add this attribute
    
    AUTH_USER_MODEL = 'users.NewUser'
    
    # it will tell Django to use this as a User Authentication model.
    


    Custom User Model을 Admin에 등록합니다.




    from django.contrib import admin
    from .models import NewUser
    from django.contrib.auth.admin import UserAdmin
    from django.forms import Textarea
    
    
    class UserAdminConfig(UserAdmin):
        model = NewUser
        search_fields = ('email', 'user_name', 'first_name',)
        list_filter = ('email', 'user_name', 'first_name',
                       'is_active', 'is_staff')
        ordering = ('-start_date',)
        list_display = ('email', 'user_name', 'first_name',
                        'is_active', 'is_staff')
        fieldsets = (
            (None, {'fields': ('email', 'user_name', 'first_name')}
             ), ('Permissions', {'fields': ('is_staff', 'is_active')}),
            ('Personal', {'fields': ('about',)}),
        )
        formfield_overrides = {
            NewUser.about: {'widget': Textarea(attrs={'rows': 10, 'cols': 40})},
        }
        add_fieldsets = (
            (None, {
                'classes': ('wide',),
                'fields': ('email', 'user_name', 'first_name', 'password1', 'password2', 'is_active', 'is_staff')
            }),
        )
    
    
    admin.site.register(NewUser, UserAdminConfig)
    
    


    model = NewUser는 Django에게 NewUser를 모델로 사용하라고 지시합니다.

    search_fields는 지정된 필드가 있는 관리자 패널에 검색 필드를 추가하는 데 사용됩니다.

    ordering은 주문 필드를 정의하는 데 사용됩니다.

    list_display는 관리자 패널에서 지정된 필드를 표시하는 데 사용됩니다.

    fieldset은 관리자 패널에 표시하려는 fieldset을 정의하는 데 사용됩니다.

    formfield_overrides는 기본 필드를 지정된 필드로 재정의하는 데 사용됩니다.

    add_fieldsets는 필드셋을 관리자 패널에 추가하는 데 사용됩니다.

    마지막에 admin.site.register(NewUser, UserAdminConfig) NewUser 모델을 등록합니다.

    이제 Click Here을(를) 방문하면 사용자 이름 필드 대신 이메일 주소 필드가 표시됩니다.



    로그인하면 새 사용자 모델이 표시됩니다.



    이제 NewUser Model 관리 인터페이스를 살펴보십시오.

    문의사항은 댓글로 남겨주시면 최대한 해결해드리도록 노력하겠습니다.

    고맙습니다.

    좋은 웹페이지 즐겨찾기