Изменение пароля
Обычно на странице профиля пользователи должны иметь возможность изменить свой пароль. В разделе 7.2 мы с вами сделали уже восстановление забытого пароля, но теперь мы должны добавить возможность его поменять. Это будет очень просто, потому что принцип будет такой же.
В Django есть представление PasswordChangeView, которое позволяет пользователям менять свой пароль. Давайте создадим наше собственное представление, которое будет расширяться и переопределять некоторые атрибуты класса.
Поэтому в файл accounts/views.py добавим следующий класс:
from django.contrib.auth.views import PasswordChangeView
from django.contrib.messages.views import SuccessMessageMixin
class ChangePasswordView(SuccessMessageMixin, PasswordChangeView):
template_name = 'registration/change_password.html'
success_message = "Successfully Changed Your Password"
success_url = reverse_lazy('users-profile')
Теперь перейдите к accounts/urls.py нашего приложения и создайте маршрут для этого представления:
from .views import SignUpView, CustomLoginView, profile, ChangePasswordView
urlpatterns = [
#......
path('password_change/', ChangePasswordView.as_view(), name='password_change'),
]
Наконец, создайте шаблон для представления registration/change_password.html:
{% extends "blog/base.html" %}
{% block content %}
<h3>Change Your Password</h3>
{% if form.errors %}
<div role="alert">
<div id="form_errors">
{% for key, value in form.errors.items %}
<strong>{{ value }}</strong>
{% endfor %}
</div>
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
{% endif %}
<form method="POST">
{% csrf_token %}
<label>Old Password</label>
<input type="password" name="old_password" autocomplete="new-password" required id="id_old_password"
placeholder="Enter Old Password"/>
<br>
<label>New Password</label>
<input type="password" name="new_password1" autocomplete="new-password"
required id="id_new_password1"
placeholder="Enter New Password"/>
<br>
<label for="id_new_password2">New Password Confirmation</label>
<input type="password" name="new_password2" autocomplete="new-password"
required id="id_new_password2" placeholder="Confirm New Password"/>
<br>
<button type="submit" id="reset">Update Password</button>
</form>
{% endblock content %}
На странице профиля(registration/profile.html) обновите ссылку <a href="#">Change Password</a>, как показано ниже:
<a href="{% url 'password_change' %}">Change Password</a>
Запустите сервер разработки и выполните обычную команду python manage.py runserver в своем терминале.
Теперь перейдите по адресу http://127.0.0.1:8000/accounts/signup/ и создайте нового пользователя.
Далее перейдите по адресу http://127.0.0.1:8000/accounts/profile/ и мы видим:
Попробуем изменить аватар и добавить информацию в поле биографии:
Как мы видим, все прекрасно работает, изображение загрузилось и уменьшилось, все данные сохраняются.
И напоследок, давайте внесем изменения в наш базовый шаблон, для этого откроем blog/base.html и внесем изменения в нашем сайдбаре:
{% if user.is_authenticated %}
Hi {{ user.username }}!
<p><a href="{% url 'users-profile' %}">My profile</a></p>
<form action="{% url 'logout' %}" method="post">
{% csrf_token %}
<p><a href="#" onclick="parentNode.submit();">Log Out</a></p>
</form>
{% else %}
<p>You are not logged in</p>
<p><a href="{% url 'login' %}">Log In</a></p>
<p><a href="{% url 'password_reset' %}">Forgot your password?</a></p>
{% endif %}
И получим следующие вид при переходе на сайт, а именно ссылку на страницу авторизации и ссылку для восстановления пароля:
После авторизации у нас будет ссылка на наш профиль и ссылка на выход из системы:
На этом все, в следующем модуле мы подключим с вами авторизацию через социальные сети.