이번엔 새로운 앱을 만드는것이 아닌 웹 개발에서 필수인 인증 기능을 만들어보려한다.
1.로그인&로그아웃
2.비밀번호 변경, 변경완료
3.회원가입 -->이것만 장고가 지원X 따라서 뷰 따로 만들어야함
- 로그인대부분의 과정을 장고가 자체적으로 지원하고있다.
로그인할때 써야하는 auth앱의 경우 이미 우리의 장고 프로젝트에 앱으로 등록되어있을것이다.
따라서 따로 모델링을 할 필요가 없고 DB에도 반영이 잘되어있다.
URLConf를 코딩해보자.
로그인 기능 URL설계하는데 있어서 장고가 대부분 지원한다. 하지만 처음에 말한 회원가입기능은 빠져있으므로 우리가 직접 작성한다.
path('account/',include('django.contrib.auth.urls')),
path('acoount/register/',UserCreateView.as_view(),name='register'),
path('account/register/done/',UserCreateDoneTV.as_view(),name='register_done'),
include('django.contrib.auth.urls')을 사용하여 장고의 인증기능들(뷰)을 사용하면된다.
회원등록과 등록완료 과정의 경우만 뷰를 따로 작성해주면된다.
djangoProject/view.py
from django.views.generic import TemplateView
from django.views.generic import CreateView
from django.contrib.auth.forms import UserCreationForm
from django.urls import reverse_lazy
#=--Homepage View
class HomeView(TemplateView):
template_name = 'home.html' #TemplateVIew 이용하는경우에 필수적으로 template_name 오버라이딩 필수!
#---User Creation
class UserCreateView(CreateView):
template_name = 'registration/register.html'
form_class = UserCreationForm
success_url = reverse_lazy('register_done')
class UserCreateDoneTV(TemplateView):
template_name = 'registration/register_done.html'
CreateView(제네릭뷰)는 폼을 보여주고 폼에 입력된 데이터로 테이블의 레코드를 생성해주는 뷰다.테이블 관련 제네릭 뷰가 추가로 더 있다(DeleteVIew,UpdateView,FormView...)
UserCreationForm은 User모델 객체를 생성하기 위해 보여주는 폼이다.
reverse_lazy 는 reverse()함수를 통해 인자로 url패턴명을 받는다.
template_name =사용자에게 보여줄 템플릿 파일명 지정
base.html의 일부분을 수정해 로그인/회원가입 버튼을 만든다.
{% if user.is_active %} # user는 장고 기본 템플릿변수. is_active=로그인여부
<i class="fas fa-user"></i> {% firstof user.get_short_name user.get_username %} </a>
<div class="dropdown-menu">
<a class="dropdown-item" href="{% url 'logout' %}">Logout</a>
<a class="dropdown-item" href="{% url 'password_change' %}">Change Password</a>
#로그인된 상태 우측 상단에 로그인 상태 표시와 메뉴 바 보여줌
<i class="fas fa-user"></i> Anonymous </a>
<div class="dropdown-menu">
<a class="dropdown-item" href="{% url 'login' %}">Login</a>
<a class="dropdown-item" href="{% url 'register' %}">Register</a>
#로그아웃 된 상태 우측 상단에 로그인상태와 메뉴바
login.html
{% load widget_tweaks %} 폼을 꾸미기위한 도구(라이브러리)
{% if form.errors %}
<div class="alert alert-danger">
<div class="font-weight-bold">Wrong! Please correct the error(s) below.</div>
{{ form.errors }}
</div>
{% endif %}
#폼 에러있을때 에러내용과 다음 문장 출력
<form action="." method="post" class="card pt-3">{% csrf_token %}
#폼 영역 card클래스로 지정.POST방식 이용
{{ form.username|add_label_class:"col-form-label col-sm-2 ml-3 font-weight-bold" }}
#tweaks라이브러리 이용해서 부트스트랩 클래스 지정.+ form변수는 LoginView에서 넘겨주는 AuthenticationForm객체
<input type="hidden" name="next" value="{{ next }}" />
# 폼 제출시 next에 지정된 변수로 url이 이동함
register.html
login.html과 거의 동일하고,
비밀번호 입력시 password1 과 password2가 두번 입력받는다는 점이 다릅니다.
#중요한 차이점은. login.html에선 AuthenticationForm을 폼 변수로 이용했지만
register.html에선 폼 변수로 UserCreaetionForm 객체를 이용했습니다.
register_done.html
큰 특징없이 내용출력이 대부분이다.
password_change_form.html
이것또한 login.html과 거의 동일하다.
PasswordChangeView 뷰에서 Password Change라는 컨텍스트 변수를 넘겨준다는 점이 좀 다르다.
그리고 ## 이번 비밀번호 변경 폼에선 폼 변수로 PasswordChangeForm객체를 이용했다. 이것또한 장고가 자체적으로 지원하는 기능이다.
password_change_done.html
큰 특징없이 내용 출력이 대부분이다.
logged_out.html
#로그아웃 처리가 완료된 후 나타나는 화면이다. 로그아웃 자체는 아무 화면이나 우측 상단 버튼누르면 할수있음.
#폰트 어썸 아이콘을 이용했다. fa-quote-left , fa-quote-right