ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Django] Django 연습장 - 2. User만들기
    프로그래밍/Django 2022. 4. 14. 19:55
    반응형

    대부분의 서비스는 사용자 기반으로 서비스를 진행합니다.

    물론 아닌 경우도 있지만 기본적으로 회원 가입 프로세스가 있습니다.

    추후에 celery+redis를 사용하여 회원가입 후 인증메일을 비동기로 보내는 것을 테스트할 것이기 때문에 미리 회원가입 기능을 만들어볼까 합니다.

     

    [작업 리스트]

    - app생성

    - User모델 만들기

    - 회원가입 기능 만들기.

     

    1. 앱 만들기

    하나의 기능들을 논리적으로 분리시켜 놓기 위해서 앱이라는 폴더를 생성하게 됩니다.

    명령어는 다음과 같습니다.

     

    django-admin startapp app_accounts

    django-admin startapp app_auth

     

    일단 app_accounts에서만 작업할 예정이지만 미리 만들어 놓습니다.

     

    그리고 앱을 만들고 나면 settings에 app을 추가해줘야 합니다.

    config > settings.py

    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'app_accounts',
        'app_auth'
    ]

     

    2. User모델 만들기

    User 모델 만든다는 것은 결국 User db table을 하나 만든다는 것입니다.

    물론 Django의 기본 User를 사용해도 괜찮으나, 속성 값도 너무 많고.. 커스텀해서 사용하겠습니다.

    app_accounts.models.py

    from django.contrib.auth.models import (
        BaseUserManager, AbstractBaseUser, PermissionsMixin
    )
    from django.db import models
    from django.utils import timezone
    from django.utils.translation import ugettext_lazy as _
    
    
    class UserManager(BaseUserManager):
        def create_user(self, email, nickname, password=None):
    
            if not email:
                raise ValueError(_('Users must have an email address'))
    
            user = self.model(
                email=self.normalize_email(email),
                nickname=nickname,
            )
    
            user.set_password(password)
            user.save(using=self._db)
            return user
    
        def create_superuser(self, email, nickname, last_name, first_name, password):
    
            user = self.create_user(
                email=email,
                password=password,
                nickname=nickname,
            )
    
            user.is_superuser = True
            user.save(using=self._db)
            return user
    
    
    class User(AbstractBaseUser, PermissionsMixin):
        email = models.EmailField(
            verbose_name=_('이메일'),
            max_length=255,
            unique=True,
        )
        nickname = models.CharField(
            verbose_name=_('닉네임'),
            max_length=30,
            unique=True
        )
        is_active = models.BooleanField(
            verbose_name=_('활성화'),
            default=True
        )
        date_joined = models.DateTimeField(
            verbose_name=_('가입일'),
            default=timezone.now
        )
    
        objects = UserManager()
    
        USERNAME_FIELD = 'email'
        REQUIRED_FIELDS = ['nickname', ]
    
        class Meta:
            verbose_name = _('user')
            verbose_name_plural = _('users')
            ordering = ('-date_joined',)
    
        def __str__(self):
            return self.nickname
    
        def get_full_name(self):
            return self.nickname
    
        def get_short_name(self):
            return self.nickname
    
        @property
        def is_staff(self):
            "Is the user a member of staff?"
            return self.is_superuser
    
        get_full_name.short_description = _('Full name')

    AbstractBaseUser라는 것을 사용하면 django의 기본 모델에서 사용하는 속성들을 사용하지 않을 수 있습니다.

    UserManager 클래스는 나중에 이해하시고 User 클래스에서 어떤 것들을 명시하고 있는지만 알면 됩니다.

    기본적으로 password는 알아서 추가가 됩니다. 일단 따라 하신다면 그대로 사용하시는 게 편하긴 합니다!

     

    이러고 나서 settings.py에서 해당 user모델을 사용하겠다.라고 할 것이기 때문에

    마지막 줄에 

    AUTH_USER_MODEL = 'app_accounts.User'

    이것을 추가해주시고 migrations을 하면 됩니다.

     

    다음 명령어를 실행합니다.

    python manage.py makemigrations

    python manage.py migrate

     

    보통 models.py에 내용을 적용하려면 위의 두 가지 명령어를 사용합니다.

    첫 번째 명령어를 통해서 django에서 db에 적용할 내용들을 migration파일로 만들어냅니다.

    그 후 두 번째 명령어를 통해서 실제 db에 table을 만들거나 수정, 삭제하는 기능을 실행합니다.

     

    설명할 내용은 많지만 일단 구현이 목적이므로 기회가 된다면 설명하겠습니다.!

     

    3. 회원가입 기능 만들기.

    model 마이그레이션까지 완료했으면 

    다음과 같은 테이블들이 실제로 생성되었을 겁니다.

    회원가입 기능을 만들기 위해서 다음 작업들을 진행하겠습니다.

    1. app_accounts에서 forms.py -> views.py ->html 만들기 -> urls.py 만들기

    2. config.urls.py에 app_accounts include 하기

     

    1. app_accounts에 forms.py 파일을 생성하고 다음 내용을 넣습니다.

    from django import forms
    from app_accounts.models import User
    
    class UserForm(forms.ModelForm):
        class Meta:
            model = User
            fields = ['email', 'nickname', 'password']

    app_accounts -> views.py에 다음 내용을 추가합니다.

    from django.shortcuts import render, redirect, HttpResponse, get_object_or_404
    from django.http import JsonResponse
    from django.views.generic.edit import FormView
    from django.views.generic import CreateView
    
    from app_accounts.forms import UserForm
    
    
    # Create your views here.
    def index(request):
        return HttpResponse('test')
    
    # 회원가입
    class CreateAccounts(CreateView):
        template_name = 'signup.html'
        form_class = UserForm
        success_url = '/accounts'

    app_accounts에 templates 폴더를 만들고 안에 signup.html을 만듭니다.

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        {% if form.errors %}
        <p style="color:red;">양식에 맞게 작성해주세요.</p>
        {% endif %}
    
        <!-- #2 -->
        <form method="post" action="{% url 'signup' %}">
        <!-- #3 -->
        {% csrf_token %}
    
        <!-- #4 -->
        {{form.as_p}}
    
        <button type="submit"> 가입하기 </button>
        </form>
    </body>
    </html>

    app_accounts urls.py에 다음 내용들을 넣습니다.

    from django.urls import path
    from app_accounts.views import index, CreateAccounts
    
    urlpatterns = [
        path('', index),
        path('signup', CreateAccounts.as_view(), name='signup')
    ]

     

    2. config urls.py에 내용을 추가합니다.

    url에서 accounts/ ~로 시작하면 app_accounts.urls.py에서 해당 기능을 받는다는 것을 처리한 내용입니다.

    from django.contrib import admin
    from django.urls import path, include
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('accounts/',include('app_accounts.urls'))
    ]

     

    이제 런서버를 해서 

    http://127.0.0.1:8000/accounts/signup에 들어가면 

    다음과 같이 별거는 없지만 기능은 동작하는 화면이 나옵니다.'

    안에 내용을 작성하여 가입하기를  누르면 실제로 db에 데이터가 생성됩니다.

     

    기능이 정상적으로 작동하는 것을 확인했습니다.

     

    하지만 문제가 있습니다.

    단순히 저장하는 기능만 만들었기 때문에 비밀번호를 암호화해서 저장하지 않습니다.

    또한 회원가입 시 비밀번호 확인 기능이 없습니다!

     

    다음 게시글에 해당 내용을 적용하는 것들을 추가해보겠습니다.

     

    회원가입 창이 이쁘지 않은 것은 걱정 마십시오! 나중에 수정해서 완성도를 높이면 됩니다!

    반응형
Designed by Tistory.