Django 실전편 ch10

김용녀·2022년 7월 26일
0

이번엔 새로운 앱을 만드는것이 아닌 웹 개발에서 필수인 인증 기능을 만들어보려한다.

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 =사용자에게 보여줄 템플릿 파일명 지정

Template

base.html의 일부분을 수정해 로그인/회원가입 버튼을 만든다.

 {% if user.is_active %}  # user는 장고 기본 템플릿변수. is_active=로그인여부
<i class="fas fa-user"></i>&ensp;{% firstof user.get_short_name user.get_username %}&ensp;</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>&ensp;Anonymous&ensp;</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





profile
어서오세요

0개의 댓글