Django에서 사용자가 비밀번호를 잊어버렸을 때 재설정할 수 있도록 사용자 정의 페이지를 구현하는 방법을 알아보겠습니다.
1. 로그인 페이지에 비밀번호 찾기 링크 추가
로그인 폼 아래에 '비밀번호를 잊으셨나요?' 링크를 추가하여 사용자가 비밀번호 재설정 절차를 시작할 수 있도록 합니다.
<div class="form-group text-center">
<button type="submit" class="btn btn-primary btn-block">로그인</button>
<a href="{% url 'register' %}" class="btn btn-link">회원가입</a>
<a href="{% url 'password_reset_request' %}" class="btn btn-link">비밀번호를 잊으셨나요?</a> <!-- 비밀번호 재설정 요청 링크 -->
</div>
2. 비밀번호 재설정 요청 뷰 및 URL 설정
비밀번호 재설정을 요청하는 뷰 함수와 해당 URL을 설정합니다. 사용자가 이메일을 입력하면 Django의 기본 비밀번호 재설정 메커니즘을 사용하여 재설정 링크가 포함된 이메일을 발송합니다.
# views.py
from django.contrib.auth.forms import PasswordResetForm
from django.shortcuts import render, redirect
from django.urls import reverse
from django.contrib import messages
def password_reset_request_view(request):
if request.method == 'POST':
form = PasswordResetForm(request.POST)
if form.is_valid():
form.save(request=request, email_template_name='registration/password_reset_email.html')
messages.success(request, '비밀번호 재설정 이메일이 발송되었습니다. 받은 편지함을 확인하고 지침에 따라 비밀번호를 재설정하세요.')
return redirect(reverse('login')) # 또는 다른 성공 페이지
else:
form = PasswordResetForm()
return render(request, 'registration/password_reset_request.html', {'form': form})
# urls.py
from django.urls import path
from . import views # 또는 앱 이름으로
urlpatterns = [
# ... 다른 URL 설정 ...
path('password/reset/', views.password_reset_request_view, name='password_reset_request'),
]
3. 비밀번호 재설정 이메일 템플릿 작성
사용자에게 발송될 비밀번호 재설정 이메일 템플릿을 작성합니다. Django는 기본적으로 registration/password_reset_email.html 템플릿을 사용합니다. 이 템플릿은 비밀번호 재설정 링크를 포함해야 합니다.
# templates/registration/password_reset_email.html
비밀번호 재설정 요청을 받았습니다.
아래 링크를 클릭하여 비밀번호를 재설정하세요:
{{ protocol }}://{{ domain }}{% url 'password_reset_confirm' uidb64=uid token=token %}
이 요청을 하지 않으셨다면 이 이메일을 무시하셔도 됩니다.
4. 비밀번호 재설정 확인 페이지 및 뷰 구현
사용자가 이메일의 링크를 클릭하면 비밀번호를 새로 입력받을 페이지로 이동합니다. 이를 처리하는 뷰 함수와 URL을 설정합니다.
# views.py (기존 파일에 추가 또는 별도 파일)
from django.contrib.auth.views import PasswordResetConfirmView
from django.urls import reverse_lazy
class CustomPasswordResetConfirmView(PasswordResetConfirmView):
template_name = 'registration/password_reset_confirm.html'
success_url = reverse_lazy('password_reset_complete') # 성공 시 이동할 URL
# urls.py (기존 파일에 추가)
from django.urls import path
from .views import CustomPasswordResetConfirmView # 위에서 정의한 뷰
urlpatterns = [
# ... 다른 URL 설정 ...
path('password/reset/confirm/<uidb64>/<token>/', CustomPasswordResetConfirmView.as_view(), name='password_reset_confirm'),
path('password/reset/complete/', lambda request: render(request, 'registration/password_reset_complete.html'), name='password_reset_complete'),
]
templates/registration/password_reset_confirm.html 템플릿은 새 비밀번호와 비밀번호 확인 필드를 포함해야 합니다.
# templates/registration/password_reset_confirm.html
<h2>비밀번호 재설정</h2>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">비밀번호 재설정</button>
</form>
마지막으로 비밀번호 재설정이 완료되었음을 알리는 templates/registration/password_reset_complete.html 템플릿을 생성합니다.
# templates/registration/password_reset_complete.html
<h2>비밀번호 재설정 완료</h2>
<p>비밀번호가 성공적으로 재설정되었습니다. 이제 로그인할 수 있습니다.</p>
<a href="{% url 'login' %}">로그인 페이지로 이동</a>
5. 이메일 설정 구성
Django 프로젝트의 settings.py 파일에서 이메일 서버 설정을 구성해야 합니다. 이를 통해 Django는 사용자의 이메일 주소로 비밀번호 재설정 이메일을 보낼 수 있습니다.
이 단계를 완료하면 사용자는 "비밀번호를 잊으셨나요?" 링크를 통해 비밀번호 재설정 이메일을 요청하고, 받은 이메일의 링크를 통해 새 비밀번호를 설정할 수 있습니다.