장고 프레임워크는 MVT 모델로 이루어있는데, Django에 내장된 User를 이용하면 model을 따로 만들어줄 필요가 없다.
- 대신 forms.py를 만들어서 로그인, 회원가입 폼을 만들어야 한다.
1. forms.py
- UserCreateForm은 django.contrib.auth.forms의 UserCreateForm 에서 오버라이딩한 클래스이다.
class UserCreateForm(UserCreationForm):
email = forms.EmailField(required=True)
class Meta:
model = User
fields = ("email", "username")
def save(self, commit=True):
user = super(UserCreateForm, self).save(commit=False)
user.email = self.cleaned_data["email"]
if commit:
user.save()
return user
# Help메시지가 표시되지 않도록 수정
def __init__(self, *args, **kwargs):
super(UserCreateForm, self).__init__(*args, **kwargs)
for fieldname in ['username', 'password1', 'password2']:
self.fields[fieldname].help_text = None
2. urls.py
- views.py와 template의 url을 연결해주는 역할을 한다.
from django.conf.urls import url
from . import views
urlpatterns = [
url('join/', views.create_user, name="join"),
url('login/', views.sign_in, name="login"),
url('logout/', views.sign_out, name='logout'),
]
3. views.py
- urls.py에서 지정한 url과 연결되는 메소드 - 회원가입, 로그인, 로그아웃 기능- 을 구현한다.
- 대부분의 기능이 기존 authentication에 함수로 내장되어 있어서 잘 사용하기만 하면 된다.
- 회원가입
- 로그인/로그아웃
from django.shortcuts import render
# Create your views here.
from .forms import UserCreateForm
from django.contrib.auth.models import User
from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.forms import AuthenticationForm
def create_user(request):
if request.method == 'POST':
try:
username = request.POST['username']
email = request.POST['email']
password = request.POST['password1']
new_user = User.objects.create_user(username, email, password)
new_user.save()
return render(request, 'registration/signup_done.html', {'message': '회원가입이 완료됨'})
except:
return render(request, 'registration/signup_done.html', {'message': '회원이 이미 있음'})
else:
form = UserCreateForm()
return render(request, 'registration/signup.html', {'form': form})
def sign_out(request):
logout(request)
return render(request, 'home/base.html')
def sign_in(request):
if request.method == 'POST':
user = authenticate(request, username=request.POST.get('username',''), password=request.POST.get('password',''))
if user is not None:
login(request, user)
return render(request, 'registration/login.html', {'message': "로그인 되었습니다."})
else:
form = AuthenticationForm()
return render(request, 'registration/login.html', {'form': form})
4. template
- 넘어가는 메뉴(home/navbar.html)
<div class="dropdown-menu">
<a class="dropdown-item" href="{% url 'login' %}">Login</a>
<a class="dropdown-item" href="{% url 'join' %}">Register</a>
</div>
- registration/login.html
{% extends 'home/base.html' %}
{% block content %}
<div id="content-wrapper">
<div class="container-fluid">
<div>
<h1>Login</h1>
</div>
<form method="post" action="{% url 'login' %}">
{% csrf_token %}
{{ form.as_p }}
<div><button type="submit", class="btn btn-success", value="save">Submit Login</button>
</div>
</form>
<a href="{% url 'index' %}"><button type="button" class="btn btn-primary">Back to List</button></a>
</div>
</div>
{% endblock content %}
- registration/signup.html
{% extends 'home/base.html' %}
{% block content %}
<div id="content-wrapper">
<div class="container-fluid">
<div>
<h1>New User Registration</h1>
</div>
<form method="post" action="{% url 'join' %}">
{% csrf_token %}
{{ form.as_p }}
<div><button type="submit", class="btn btn-success", value="save">Submit Registration</button>
</div>
</form>
<a href="{% url 'index' %}"><button type="button" class="btn btn-primary">Back to List</button></a>
</div>
</div>
{% endblock content %}
5. 결과 화면
- 회원가입
- 회원가입 후
- 로그인
- 로그인 후
+ 참고로...
유저가 추가된 것을 localhost:8000/admin에서 admin계정을 통해서 확인할 수 있다.
- 이전에 test로 만든 계정들을 확인할 수 있다.
- 추가할 기능 : 개인 계정 업데이트 및 관리
- 앞으로의 방향 : 유저에 다양한 필드를 갖추기 위해서는 기본적으로 제공되는 user에 한계점이 보여서 다른 user를 사용해서 구현할 것.
[
20. Django authentication를 활용한 회원가입 구현
이번 포스트에서는 장고에서 자체적으로 내장하고 있는 authentication를 활용하여 회원가입을 구현하는 것...
blog.naver.com
'프로젝트 > Django project' 카테고리의 다른 글
[웹 프로젝트] instagram clone 코드 MVT 총정리 (0) | 2020.11.06 |
---|---|
[웹 프로젝트] Django User 분류 (0) | 2020.10.27 |
[웹 프로젝트] Django Git merge (DB 오류) (0) | 2020.10.26 |
[웹 프로젝트] Django admin계정 확인하기 (0) | 2020.10.25 |
[웹 프로젝트] Django 앱을 실행하기 위한 과정 (0) | 2020.10.23 |
WRITTEN BY
,