jc.jang

12강 암호 변경 구현하기 본문

Django/Django - 인증편

12강 암호 변경 구현하기

jangstory 2019. 9. 3. 15:29

주제

  • 암호 변경 구현하기
  • django/contrib/auth에 있는 PasswordChangeView를 이용해 암호 변경을 구현한다.

노트

  • 최대한 auth에 있는 것을 활용하여 urls.py, views.py, forms.py를 구현한다.
  • accounts/urls.py
from django.contrib.auth import views
from django.urls import path

urlpatterns = [
	# ...
    path('password_change/', views.PasswordChangeView.as_view(), name='password_change'),
    path('password_change/done/', views.PasswordChangeDoneView.as_view(), name='password_change_done'),
	# ...
]
  • 이렇게 urls.py만 등록하고 로그인 하고 'password_change'에 접속해보면 익숙한 admin 로그인 화면창이 뜰 것이다.
  • 그 화면이 뜨는 이유는 기본 template 경로가 'registration/password_change_form.html'이라서 그렇다.
  • cbv를 views.py에서 재정의해주자.

 

  • accounts/urls.py
from django.urls import path, reverse_lazy
from django.contrib.auth import views as auth_views

from . import views

urlpatterns = [
    path('password_change/', views.MyPasswordChangeView.as_view(), name='password_change'),
    path('password_change/done/', 
        auth_views.PasswordChangeDoneView.as_view(
            template_name='accounts/password_change_done.html'
    ), name='password_change_done'),
]
  • PasswordChangeView를 MyPasswordChangeView로 변경하였다.

 

  • accounts/views.py
class MyPasswordChangeView(PasswordChangeView):
    success_url=reverse_lazy('profile')
    template_name='accounts/password_change_form.html'
  • template_name 필드를 설정해주고 템플릿 파일을 만든다.

 

  • accounts/templates/accounts/profile.html
{% extends "accounts/layout.html" %}

{% block content %}
    <h2>{{ user.username }}'s Profile</h2>

    <h3>Email</h3>
    {{ user.email|default:"&dash;" }}

    <h3>Bio</h3>
    {{ user.profile.bio|default:"&dash;" }}

    <hr>
    <a href="{% url 'password_change' %}">암호 변경하기</a>
{% endblock %}
  • profile 페이지에 '암호 변경하기' 링크를 만들었다.

 

  • accounts/templates/accounts/password_change_form.html
{% extends "accounts/layout.html" %}

{% block content %}
    <h2>암호변경</h2>
    
    <form action="" method="post">
        {% csrf_token %}
        <table>
            {{ form.as_table }}
        </table>
        <input type="submit">
    </form>
{% endblock %}
  • 현재 비밀번호, 새 비밀번호를 입력한다.

 

  • accounts/templates/accounts/password_change_done.html
{% extends "accounts/layout.html" %}

{% block content %}
    <h2>암호 변경 완료</h2>

    암호 변경을 완료했습니다.

{% endblock %}
  • 비밀번호 변경 완료 후 이동할 페이지다.

 

  • 하지만 굳이 password_change_done.html가 필요할까?
  • '비밀번호가 변경되었습니다!'라는 메시지로 변경 유무를 알려주고 profile 페이지로 이동시키고 싶다.

 

  • accounts/urls.py
from django.urls import path, reverse_lazy
from django.contrib.auth import views as auth_views

from . import views

urlpatterns = [
    # ...
    path('password_change/', views.MyPasswordChangeView.as_view(), name='password_change'),
    # path('password_change_done/', 
    #     auth_views.PasswordChangeDoneView.as_view(
    #         template_name='accounts/password_change_done.html'
    # ), name='password_change_done'),
]
  • 이제 'password_change_done' url은 없어도 된다.

 

  • accounts/views.py
class MyPasswordChangeView(PasswordChangeView):
    success_url=reverse_lazy('profile')
    template_name='accounts/password_change_form.html'
    
    def form_valid(self, form):
        messages.info(self.request, '암호 변경을 완료했습니다.')
        return super().form_valid(form)
  • success_url을 통해 비밀번호 변경 시 이동할 url을 설정한다.
  • django message framework가 있는데, 일회성 알림 메시지용도로 사용한다.
  • profile로 이동할 때 암호가 변경되었다는 메세지를 주면 사용자가 변경되었는지 알 수 있다.

질문

  • 메세지에 스타일을 주고 싶었는데 템플릿에서 변수를 사용해서 출력하려고하니 메세지가 중복되서 출력된다.
  • 차후에 강의에서 설명한다고 하니 그때가서 알아보자.

요약

  • django/contrib/auth에는 다양한 것들이 구현되어있다.

날짜

  • 오후 3시, 20190903

 

Comments