-
[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에 데이터가 생성됩니다.
기능이 정상적으로 작동하는 것을 확인했습니다.
하지만 문제가 있습니다.
단순히 저장하는 기능만 만들었기 때문에 비밀번호를 암호화해서 저장하지 않습니다.
또한 회원가입 시 비밀번호 확인 기능이 없습니다!
다음 게시글에 해당 내용을 적용하는 것들을 추가해보겠습니다.
회원가입 창이 이쁘지 않은 것은 걱정 마십시오! 나중에 수정해서 완성도를 높이면 됩니다!
반응형'프로그래밍 > Django' 카테고리의 다른 글
[Django] Django 연습장 - 6. 회원가입 프로세스 개선 (이메일 보내기 & 인증) (0) 2022.04.16 [Django] Django 연습장 - 5. html씌우기 (0) 2022.04.15 [Django] Django 연습장 - 4. 로그인 기능 만들기 (0) 2022.04.15 [Django] Django 연습장 - 3. User form 수정해서 회원 가입 조건 변경 (0) 2022.04.14 [Django] Django 연습장 - 1.환경세팅 (1) 2022.04.14