Django/INSTA

[Django] 장고 Signup(회원가입) - 인스타 클론코딩

씨주 2024. 3. 19. 18:57

📍 Signup(회원가입)

CRUD 기능을 마무리하고 오늘부터는 user와 관련된 기능을 추가해보려 한다.

 

 

[Django] 장고 User모델링 - 인스타 클론코딩

 

[Django] 장고 User모델링 - 인스타 클론코딩

📍 User 모델링 회원가입, 로그인, 로그아웃 기능을 추가하기 전 User모델링을 해주자! [Django] 장고 모델링 - 인스타 클론코딩 [Django] 장고 모델링 - 인스타 클론코딩 📍 모델링 ✅ 모델 정의 ImageFi

heejudeveloper.tistory.com

우선 저번에 모델링해뒀던 User에서 인스타처럼 프로필사진도 추가할 수 있게 모델링을 바꿔주었다.

 

✅ 모델링 수정

📌 # accounts/models.py

from django_resized import ResizedImageField

class User(AbstractUser):
    profile_image = ResizedImageField(
        size = [500, 500],
        crop = ['middle', 'center'],
        upload_to = 'profile',
    )

profile_image를 추가한 후 게시글보다 프로필사진이 크면 안되니 Resized도 해주었다.

 

 

📌 migrates

모델링이 수정되었으니 마이그레이션을 해주어야 하는데 아래와 같이 profile_image가 추가되면서 기존 모델에 대한 처리를 물어본다.

서비스 운영단계가 아니다보니 나는 1번(default값 제공 후 모든 데이터 default값으로 처리)으로 선택했다.

migrations파일을 삭제하는 방법도 있지만 이미 한차례 데이터베이스를 삭제하기도 했고 이런식으로 처리할 수 있음도 남기고 싶어 삭제하지 않고 처리해보았다.

 

 

📌 # settings.py

AUTH_USER_MODEL = 'accounts.User'

 

 

📌 # posts/models.py

from django.conf import settings

class Post(models.Model):
	user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

게시글과 유저를 연결해야 하기 때문에 외래키를 이용하였다. (이렇게 또 자격증 공부한게 와닿는 순간 뿌듯 ✌️)

user가 탈퇴했을 때 작성했던 post도 함께 삭제되게끔 on_delete도 설정해주었다.

 

 

✅ Signup(회원가입) 기능 구현

📌 # accounts/forms.py

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

class CustomUserCreationForm(UserCreationForm):
    class Meta(UserCreationForm.Meta):
        model = User
        fields = ('username', 'profile_image',)

장고의 CustomUserCreationForm을 이용해 form을 간단하게 작성할 수 있다.

 

fields를 작성하지 않을 시에는 기본적으로 아이디(username), 비밀번호(password)를 받게 된다.

여기서는 추가로 프로필 이미지(profile_image)를 받아야 하므로 fields에 username, profile_image를 추가해준다.

password는 작성안해도 기본제공이 되서 fields에 profile_image만 넣어봤는데 그러면 username없이 profile_image만 입력받아서 username까지 기입해줘야 한다.

 

 

📌 # _nav.html

<a class="nav-link" href="{% url 'accounts:signup' %}">Signup</a>

Signup버튼은 nav bar에 추가했다.

 

 

📌 # INSTA/urls.py

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

posts를 작성할 때와 같이 accounts urls.py와 연결되게 기본 urls.py를 작성해준다.

 

 

📌 # accounts/urls.py

from django.urls import path
from . import views

app_name = 'accounts'

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

 

 

📌 # accounts/accounts_form.html

{% extends 'base.html' %}
{% load django_bootstrap5 %}

{% block body %}
    <form action="" method="POST" enctype="multipart/form-data">
        {% csrf_token %}
        {% bootstrap_form form %}
        <input type="submit">
    </form>
{% endblock %}

 

 

📌 # accounts/views.py

from django.shortcuts import render, redirect
from .forms import CustomUserCreationForm

def signup(request):
    if request.method == 'POST':
        form = CustomUserCreationForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            return redirect('posts:index')
    else:
        form = CustomUserCreationForm()

    context = {
        'form': form,
    }

    return render(request, 'accounts_form.html', context)

[Django] 장고 CRUD기능 중 CREATE - 인스타 클론코딩

 

[Django] 장고 CRUD기능 중 CREATE - 인스타 클론코딩

📍 CRUD - CREATE CREATE기능을 구현하기 전 CREATE버튼은 Navbar에 추가하기로 했다. (정리하면서 Home 링크도 추가함!) 📌 # _nav.html Home Create 📌 기능 구현에 들어가기 전 더보기 아래와 같이 input, textarea

heejudeveloper.tistory.com

원리는 create기능과 흡사한 회원가입 기능을 구현해준다. 

프로필 이미지를 입력받는 방식이 POST가 아닌 FILES이기 때문에 함께 작성을 해줘야 한다.

(이전 글을 보니 FILES에 대한 설명이 없네..)

 

 

Signup버튼을 클릭해보면 bootstrap을 이용해서 좀 더 깔끔한 form을 확인할 수 있다.

Username, Profile image를 입력받고 4가지 조건에 충족하는 Pasword를 2번 입력받은 후 회원가입이 완료된다.

 

회원가입을 한 후 admin에서 확인해보면 관리자계정(admin)외의 user 데이터가 생긴 것을 확인할 수 있다.