코딩공부/Python Django

django password reset - PasswordResetView 커스터마이징

integerJI 2020. 8. 27. 22:40

들어가기에 앞서

남은 작업

앞으로 남은 페이지는 PasswordResetConfirmView ( 비밀번호를 변경하는 페이지 )와PasswordResetCompleteView ( 변경 후 페이지 ) 입니다. PasswordResetConfirmView 같은 경우 token을 생성하여 같이 넘겨주어야 합니다.

 

PasswordResetConfirmView 상속

views.py

from django.shortcuts import render, redirect, get_object_or_404
from django.contrib.auth.models import User
from django.contrib import auth
from django.contrib import messages
from django.contrib.auth.views import LoginView, LogoutView, PasswordResetView, PasswordResetDoneView, PasswordResetConfirmView, PasswordResetCompleteView
from django.shortcuts import resolve_url
from django.core.exceptions import ValidationError
from django.contrib.auth.forms import UserCreationForm
from django.conf import settings
from django.views.generic.edit import CreateView
from django.views.generic.detail import DetailView
from django.urls import reverse_lazy
from django.views import generic, View
from django.contrib.auth.decorators import login_required
from django.contrib import messages
from django.contrib.auth import login, authenticate
from django.template import RequestContext
from django.http import HttpResponse
try:
    from django.utils import simplejson as json
except ImportError:
    import json
from django.http import HttpResponse, HttpResponseRedirect
from django.views.decorators.http import require_POST
from django.contrib.auth import (
    REDIRECT_FIELD_NAME, get_user_model, login as auth_login,
    logout as auth_logout, update_session_auth_hash,
)
from django.contrib.auth.forms import (
    AuthenticationForm, PasswordChangeForm, PasswordResetForm, SetPasswordForm,
)
from django.contrib.auth.tokens import default_token_generator
from django.utils.decorators import method_decorator
from django.utils.http import is_safe_url, urlsafe_base64_decode
from django.views.decorators.debug import sensitive_post_parameters
from django.views.decorators.cache import never_cache
from django.utils.translation import gettext_lazy as _

UserModel = get_user_model()
INTERNAL_RESET_URL_TOKEN = 'set-password'
INTERNAL_RESET_SESSION_TOKEN = '_password_reset_token'


class UserPasswordResetConfirmView(PasswordResetConfirmView):
    form_class = SetPasswordForm
    success_url=reverse_lazy('password_reset_complete')
    template_name = 'password_reset_confirm.html'

    def form_valid(self, form):
        return super().form_valid(form)

class UserPasswordResetCompleteView(PasswordResetCompleteView):
    template_name = 'password_reset_complete.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['login_url'] = resolve_url(settings.LOGIN_URL)
        return context

 

수많은 에러를 거쳐 결국 auth의 import들을 모두 가져왔습니다.

 

비밀번호 변경을 위해 캐시를 남기지 않아야 하고 토큰 값을 생성 및 확인까지 들어가야 합니다.

 

또한

 

from django.contrib.auth.forms import (

AuthenticationForm, PasswordChangeForm, PasswordResetForm, SetPasswordForm,

)

 

을 상속받아 form_class를 넣어줍니다.

 

password_reset_confirm.html

{% extends 'signBase.html' %}
{% load static %}
{% block signcontent %}

<body class="text-center">

    <form action="" method="post">

    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">비밀번호 초기화</button>
</form>

</body>

{% endblock %}

 

제 프로젝트의 base.html도 상속받았습니다.

 

form을 불러와 post로 넘겨줍니다.

 

PasswordResetCompleteView 상속

class UserPasswordResetCompleteView(PasswordResetCompleteView):
    template_name = 'password_reset_complete.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['login_url'] = resolve_url(settings.LOGIN_URL)
        return context

 

마찬가지로 template_name으로 연결할 html을 만들어 줍니다.

 

password_reset_complete.html

{% extends 'signBase.html' %}
{% load static %}
{% block signcontent %}
<body class="text-center">
    <div class="form-signin">
        <h1> Password reset complete </h1>
        <p> 새 비밀번호가 설정되었습니다. <a href="{% url 'signin'%}"> 로그인 하러가기 </a>.</p>
    </div>
</body>
{% endblock %}

 

비밀번호 설정이 완료되면 이동되는 페이지도 만들어줍니다~

 


해당 기능을 구현하며 오버 라이딩과 장고에서 제공해주는 기능의 사용을 알게 되었습니다.

 

특히 기존의 알지도 못하면서 썼던 오버라이딩과 import 그리고 장고에서 제공해주는 기능이니까 ~ 하며 그냥 썻던 클래스들을

 

하나씩 파고들어가 어떠한 방식으로 작동되는지

 

또한 토큰과 uid가 무엇인지 너무 신기하고 재밌는 기술을 배우게 되어 좋았습니다.

 

물론 당연한 이야기 지만 내가 상속받는 클래스가 어떻게 동작하는지

 

그 클래스를 내가 가지고 왔을 때 어떻게 동작하는지에 대해 

 

한번 더 확인해야 한다는 생각을 갖게 되었습니다.

 

해당 기능을 완성하며 생긴 에러 처리 보러 가기 >>> https://integer-ji.tistory.com/280