Django 점프 투 장고 정리
작성일 : 2021-11-18
문서버전 : 1.0
개요
이 문서는 점프 투 장고 사이트의 장고 튜토리얼 학습 내용을 정리한 내용입니다.
레퍼런스
점프 투 장고 https://wikidocs.net/72242
3-6. 계정생성
파이보 사용자 추가할 수 있는 계정생성(회원가입) 기능 구현해보자. 계정생성도 물론 장고의 django.contrib.auth 앱을 이용하면 쉽게 구현 가능하다.
계정생성 링크
> ../projects/mysite/templates/common/login.html
계정생성을 위한 링크를 다음처럼 login.html 템플릿에 추가하자.
(... 생략 ...)
<div class="container my-3">
<div class="row">
<div class="col-4">
<h4>로그인</h4>
</div>
<div class="col-8 text-right">
<span>또는 <a href="{% url 'common:signup' %}">계정을 만드세요.</a></span>
</div>
</div>
<form method="post" class="post-form" action="{% url 'common:login' %}">
(... 생략 ...)
Form 태그 상단에 <div class=”row”>...</div> 영역 추가하여 계정생성 할 수 있는 링크 추가했다.
Urls.py
Login.html 템플릿에 {% url ‘common:signup’ %}태그를 방금 추가했다. 그러므로 이에 대응하는 URL 매핑도 추가해야 한다. common/urls.py 파일에 계정생성을 위한 URL매핑을 추가해주자.
> ../projects/mysite/common/urls.py
from django.urls import path
from django.contrib.auth import views as auth_views
from . import views
app_name = 'common'
urlpatterns = [
path('login/', auth_views.LoginView.as_view(template_name='common/login.html'), name='login'),
path('logout/', auth_views.LogoutView.as_view(), name='logout'),
path('signup/', views.signup, name='signup'),
]
계정생성 링크를 클릭하면 {% url ‘common:signup’ %} 태그를 실행하여 Views.signup 함수가 실행될 것이다.
Forms.py
위에서 실행시킬 뷰 함수를 만들기 전에 해야할 것이 있다. 계정생성 시 사용할 UserForm을 common/forms.py 파일에 작성하자.
> ../projects/mysite/common/forms.py
from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
class UserForm(UserCreationForm):
email = forms.EmailField(label="이메일")
class Meta:
model = User
fields = ("username", "password1", "password2", "email")
UserForm 클래스는 django.contrib.auth.forms 모듈의 UserCreationForm 클래스를 상속해서 만들었다. 그리고 email 속성을 추가했다. UserForm을 따로 만들지 않고 UserCreationForm을 바로 사용가능하다. 하지만 email 등과 같이 부가적으로 속성을 추가하고싶다면 UserCreationForm 클래스를 상속하여 만들자.
UserCreationForm의 속성
속성명 | 설명 |
username | 사용자이름 |
password1 | 비밀번호1 |
password2 | 비밀번호2(비밀번호1과 대조) |
UserCreationForm의 is_valid 함수는 계정생성 화면에서 3개의 필드값에 내용이 모두 입력되었는지, 비밀번호1과 2가 동일한지, 비밀번호 값이 비밀번호 생성규칙에 맞는지를 검사해주는 함수다.
Views.py
> ../projects/mysite/common/views.py
common/views.py에 signup 합수를 정의해주자.
from django.contrib.auth import authenticate, login
from django.shortcuts import render, redirect
from common.forms import UserForm
def signup(request):
"""
계정생성
"""
if request.method == "POST":
form = UserForm(request.POST)
if form.is_valid():
form.save()
username = form.cleaned_data.get('username')
raw_password = form.cleaned_data.get('password1')
user = authenticate(username=username, password=raw_password) # 사용자 인증
login(request, user) # 로그인
return redirect('index')
else:
form = UserForm()
return render(request, 'common/signup.html', {'form': form})
Signup 함수에는 조건문이 있다. POST 요청일 경우 화면에서 입력한 데이터로 사용자 계정을 생성하고 GET 요청인 경우에는 계정생성 화면을 리턴한다. 여기서 form.cleaned_data.get 함수는 입력값을 개별적으로 얻기 위해 사용하는데, 이 경우 사용자명과 비밀번호를 얻기 위해 사용했다.
신규 사용자 생성 후 자동으로 로그인하는 장치를 위해 authenticate와 login함수가 사용되었다. Authenticate와 login 함수는 django.contrib.auth 모듈의 함수이며 사용자 인증과 로그인 기능과 관련있다. Authenticate 함수는 사용자명과 비밀번호가 정확한지 검증한다.
signup.html
계정생성화면 구성하는 common/signup.html을 아래와 같이 작성해주자.
{% extends "base.html" %}
{% block content %}
<div class="container my-3">
<div class="row my-3">
<div class="col-4">
<h4>계정생성</h4>
</div>
<div class="col-8 text-right">
<span>또는 <a href="{% url 'common:login' %}">로그인 하세요.</a></span>
</div>
</div>
<form method="post" class="post-form" action="{% url 'common:signup' %}">
{% csrf_token %}
{% include "form_errors.html" %}
<div class="form-group">
<label for="username">사용자 이름</label>
<input type="text" class="form-control" name="username" id="username"
value="{{ form.username.value|default_if_none:'' }}">
</div>
<div class="form-group">
<label for="password1">비밀번호</label>
<input type="password" class="form-control" name="password1" id="password1"
value="{{ form.password1.value|default_if_none:'' }}">
</div>
<div class="form-group">
<label for="password2">비밀번호 확인</label>
<input type="password" class="form-control" name="password2" id="password2"
value="{{ form.password2.value|default_if_none:'' }}">
</div>
<div class="form-group">
<label for="email">이메일</label>
<input type="text" class="form-control" name="email" id="email"
value="{{ form.email.value|default_if_none:'' }}">
</div>
<button type="submit" class="btn btn-primary">생성하기</button>
</form>
</div>
{% endblock %}
상단에 ‘로그인’페이지로 이동할 수 있는 링크를 추가했고 오류 표시를 위한 form_errors.html 템플릿을 include 했다. 그리고 UserForm의 속성인 사용자이름, 비밀번호1, 비밀번호2, 이메일 관련 필드들을 추가했다.
계정생성
Admin사이트에 들어가면 꿀딱이 계정이 생성된 것을 알 수 있다.
'Research > Django' 카테고리의 다른 글
[django]MDSE_02_CSS으로 세련된 웹사이트 만들기 (0) | 2021.11.22 |
---|---|
[django]MDSE_01_웹사이트 간단한 문구 표시 (0) | 2021.11.22 |
[Django] 점프 투 장고 튜토리얼 - 03-5. 로그인과 로그아웃 (0) | 2021.11.19 |
[Django] 점프 투 장고 튜토리얼 - 03-4. 답변 개수 표시 (0) | 2021.11.16 |
[Django] 점프 투 장고 튜토리얼 - 03-3. 템플릿 필터 (0) | 2021.11.16 |
댓글