기본 제공 템플릿 사용
먼저 장고에서 기본으로 제공되는 비밀번호 변경 템플릿을 사용해본 뒤, 커스텀 템플릿을 작성해 봅시다.
member/urls.py
from django.contrib.auth import views as auth_views
from django.urls import path, reverse_lazy
from member import views
app_name = 'member'
urlpatterns = [
# login logout signin
# password-reset
path('password-change/',
auth_views.PasswordChangeView.as_view(),
name='password_change'),
path('password-change/done/',
auth_views.PasswordChangeDoneView.as_view(),
name='password_change_done'),
]
templates/navbar.html
<nav class="navbar navbar-expand-lg bg-body-tertiary">
<div class="container-fluid">
...
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
{% if request.user.is_authenticated %}
<li class="nav-item dropdown">
...
<ul class="dropdown-menu">
...
<!-- 로그인 한 사용자에게 비밀번호 변경 드롭바 메뉴 추가 -->
<li><a class="dropdown-item" href="{% url 'member:password_change' %}">비밀번호 변경</a></li>
</ul>
</li>
{% else %}
...
{% endif %}
</ul>
</div>
</div>
</nav>
결과 확인


password-reset때와 같은 에러가 발생합니다. success_url 매개변수를 작성해 줍시다.
path('password-change/',
auth_views.PasswordChangeView.as_view(
success_url=reverse_lazy('member:password_change_done')),
name='password_change'),
주의
success_url을 통해 완료 창을 보여주는 뷰가 연결되지 않았을 뿐 비밀번호 변경 요청은 정상처리 됩니다.
결과 확인


커스텀 템플릿 작성하기

templates/registration/password_change_form.html
{% extends 'base.html' %}
{% load i18n %}
{% block title %}
Password Change
{% endblock title %}
{% block body %}
<div class="error container mt-3">
{% include 'form_errors.html' %}
<div>
<p>{% translate 'Please enter your old password, for security’s sake, and then enter your new password twice so we can verify you typed it in correctly.' %}</p>
</div>
</div>
<div class="container justify-content-center d-flex">
<form method="post">
{% csrf_token %}
<div class="form-group text-center">
<label>{% translate 'Old password:' %}
<input type="password" name="old_password" class="form-control">
</label>
</div>
<div class="form-group text-center">
<label>{% translate 'New password:' %}
<input type="password" name="new_password1" class="form-control">
</label>
{% if form.new_password1.help_text %}
<div class="help"
{% if form.new_password1.id_for_label %}
id="{{ form.new_password1.id_for_label }}_helptext"
{% endif %}>
{{ form.new_password1.help_text|safe }}
</div>
{% endif %}
</div>
<div class="form-group text-center">
<label>{% translate 'Confirm password:' %}
<input type="password" name="new_password2" class="form-control">
</label>
{% if form.new_password2.help_text %}
<div class="help"
{% if form.new_password2.id_for_label %}
id="{{ form.new_password2.id_for_label }}_helptext"
{% endif %}>
{{ form.new_password2.help_text|safe }}
</div>
{% endif %}
</div>
<div class="mt-3 text-center">
<button type="submit" class="btn btn-primary">{% translate 'Change my password' %}</button>
</div>
</form>
</div>
{% endblock %}
templates/registration/password_change_done.html
{% extends 'base.html' %}
{% load i18n %}
{% block title %}
Password Change
{% endblock %}
{% block body %}
<div class="container text-center mt-3">
<p>{% translate "Your password was changed." %}</p>
<a class="btn btn-primary" href="{% url 'forum:post_list' %}">{% translate 'Home' %}</a>
</div>
{% endblock %}
결과 확인



'Back-end > Forum with Django' 카테고리의 다른 글
| 31. 회원 탈퇴 (0) | 2025.08.12 |
|---|---|
| 30. 프로필 페이지 (2) | 2025.08.12 |
| 28. SMTP, django-environ (2) | 2025.07.29 |
| 27. 비밀번호 초기화 (2) | 2025.07.29 |
| 26. 게시물 검색 (3) | 2025.07.29 |