Django User 모델 커스텀 및 회원가입 구현

2022. 2. 4. 14:56강의 정리/Django 기초

반응형

출처 : https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard

 

장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생각이 있으신 분은 위 출처의 강의를 적극 추천드립니다!!!

 


 

 

User 모델 커스텀하기

1. 먼저 accounts라는 앱을 생성한다.

python manage.py startapp accounts

1-1 : 앱이 만들어지면 urls.py를 만들어준다.

from django.urls import path

urlpatterns = [
    
]

 

1-2 : settings.py(=common.py)에 등록시켜준다.

INSTALLED_APPS = [
    # Django Apps
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    # Third Apps
    'debug_toolbar',
    'bootstrap4',
    
    # Local Apps
    'accounts',
]

 

1-3 : 프로젝트의 urls.py에 등록시켜준다.

urlpatterns = [
    path('accounts/' , include('accounts.urls')),
]

 

 


 

2. accounts/models.py에서 User Model을 커스텀한다.

 

from django.db import models
from django.contrib.auth.models import AbstractUser
# Create your models here.

class User(AbstractUser):
    website_url = models.URLField(blank=True)
    bio = models.TextField(blank=True)
    



#class Profile(models.Model):
   # pass

 

2-1 : User를 커스텀할 때는 반드시 settings.py(=common.py)에 아래 코드를 등록시켜준다.

# accounts 앱에 있는 User 모델을 기본 User 모델로 쓰겠다.
AUTH_USER_MODEL = "accounts.User"

2-2 : 반드시 makemigrtions 후 migrate를 진행 해야한다.

 

 

 

migrations 오류

오류 해결 : https://www.jgahn.com/archive/post/40/

 

Django에서 migrations error 발생할 때 migration 초기화하기 - 잡동사니 아카이브

Django에서 migrations error 발생할 때 migration 초기화하기 April 7, 2020   /   4 mins read   /   Python Django Error 이 문서는 Stack overflow의 'django.db.migrations.exceptions.InconsistentMigrationHistory'와 Simpleisbetterthancomplex

www.jgahn.com

 

만약 위 방법으로도 해결이 안된다면. 터미널에서

rm -f db.sqlite3

명령어를 통해서 DB를 제거하고 진행하는 방법을 이야기드리지만, 웬만해서는 DB를 삭제하는 일은 없는게 좋다....

 


 

3. accounts/admin.py에서 models의 User 모델을 admin 사이트에 등록시킨다.

from django.contrib import admin
from .models import User
# Register your models here.

@admin.register(User)
class UserAdmin(admin.ModelAdmin):
    list_display = [
        'username', 'email', 'website_url', 'is_active', 'is_staff' ,'is_superuser'
        ]

 

Firtst name, Last name, Email address는 Django에서 기본 제공된다.

 

 

 


 

 

회원가입 기능 구현하기

1. accounts 앱 아래에  forms.py를 만들어준다.

from .models import User
from django import forms
from django.contrib.auth.forms import UserCreationForm

class SignupForm(UserCreationForm):
    # 회원가입시 새로운 필드들을 커스텀 하고 싶을 때 생성자 호출
    def __init__(self, *args, **kwargs): 
        super().__init__(*args, **kwargs) # 부모를 호출함.
        # form에 적용시키고 싶은 필드들을 오버라이딩을 통해 True로 지정
        self.fields['email'].required = True
        self.fields['first_name'].required = True
        self.fields['last_name'].required = True     

    class Meta(UserCreationForm.Meta):
        model = User
        fields = [
            'username', 'email', 'first_name', 'last_name'
        ]
    
    # email 중복 방지 함수
    def clean_email(self):
        email = self.cleaned_data.get('email')

        if email:
            qs = User.objects.filter(email=email)
            if qs.exists():
                raise forms.ValidationError("이미 등록된 이메일 주소입니다.")
            
            return email

#UserCreationForm을 이용하면 회원가입시 비밀번호가 저장될 때 암호화되어서 저장된다. 

#username은 기본적으로 unique가 지정되어있다.

 


 

2. accounts/views.py에 signup 함수 구현

from django.contrib import messages
from django.shortcuts import render, redirect
from .forms import SignupForm
# Create your views here.


def signup(request):
    if request.method == 'POST':
        form = SignupForm(request.POST)
        if form.is_valid():
            next_url = request.GET.get('next', '/') # next 인자를 가져오고, 없으면 / 주소로 이동
            user = form.save()
            messages.success(request, "회원가입이 되었습니다~!")
            return redirect(next_url)
    else:
        form = SignupForm()
    
    return render(request, 'accounts/signup_form.html', {
        'form' : form,
    })

위 코드의 프로세스

 

#message를 화면에 노출시키고 싶을 때

#프로젝트/templates/layout.html

<body>

    {% if messages %}
        {% for message in messages %}
            <div class="alert alert-{{ message.tags }}">
                {{ message }}
            </div>
        {% endfor %}
    {% endif %}
    
</body>

 


 

3. accounts/templates/accounts/에 signup_form 템플릿 구현

 

{% extends "accounts/layout.html" %}
{% load bootstrap4 %}

{% block content %}
    <div class="container">
        <div class="row">
            <div class="col-sm-6 offset-sm-3">
                <form action="" method="POST" enctype="multipart/form-data">
                    {% csrf_token %}
                    {% bootstrap_form form %}
                    {% buttons %}
                        <button type="submit" class="btn btn-primary">
                            {{ submit_label|default:"Submit" }}
                        </button>
                    {% endbuttons %}
                </form>
            </div>
        </div>
    </div>  
{% endblock %}

 

회원가입 화면

 

 


 

4. accounts/urls.py에 views 함수 연결시키기

from django.urls import path
from . import views

urlpatterns = [
    path('signup/', views.signup, name='signup'),
]
반응형