Приветствую.
На одном из проходимых мной курсов, итоговым заданием необходимо было сделать прототип сервиса по сокращению ссылок.
Задание достаточно простое и мне стало интересно, а что если вынести фронт на Vue, а бэк пусть остаётся на Django?
Также, дополнительным плюсом будет иметь свой сервис сокращения ссылок, поскольку часто ссылка + UTF метки занимают много места, а сервисы типа click.ru|bit.ly|vk.cc и прочие, помечаются как небезопасные.
Результатом стал сайт https://lkeep.ru/
Работать будет так: https://lkeep.ru/l/EMDRTbZUpi
На данный момент из "косяков" только отсутствие адаптивной вёрстки и неработающий(недописанный) функционал копирования ссылки в лк.
Мне нужны ваши отзывы. Как вам, может что-то улучшить/изменить? Пишите в комментариях!
P.S. Регистрация обязательна, иначе это будет такая же помойка как и другие сайты.
На одном из проходимых мной курсов, итоговым заданием необходимо было сделать прототип сервиса по сокращению ссылок.
Задание достаточно простое и мне стало интересно, а что если вынести фронт на Vue, а бэк пусть остаётся на Django?
Также, дополнительным плюсом будет иметь свой сервис сокращения ссылок, поскольку часто ссылка + UTF метки занимают много места, а сервисы типа click.ru|bit.ly|vk.cc и прочие, помечаются как небезопасные.
Результатом стал сайт https://lkeep.ru/
Работать будет так: https://lkeep.ru/l/EMDRTbZUpi
На данный момент из "косяков" только отсутствие адаптивной вёрстки и неработающий(недописанный) функционал копирования ссылки в лк.
Мне нужны ваши отзывы. Как вам, может что-то улучшить/изменить? Пишите в комментариях!
P.S. Регистрация обязательна, иначе это будет такая же помойка как и другие сайты.
Django 32. Форма регистрации
Авторизацию мы добавили. Теперь добавим возможность регистрироваться на сайте.
В целом, процесс примерно такой же как и с авторизацией.
Продолжаем работать в директории приложения
Почти весь пост будем использовать, написанный в прошлом посте код с небольшими изменениями.
Форма регистрации.
Откроем файл
Далее добавляем 4 поля:
Поля
Поле
Далее прописываем внутренний класс
Авторизацию мы добавили. Теперь добавим возможность регистрироваться на сайте.
В целом, процесс примерно такой же как и с авторизацией.
Продолжаем работать в директории приложения
user_app.Почти весь пост будем использовать, написанный в прошлом посте код с небольшими изменениями.
Форма регистрации.
Откроем файл
forms.py и создадим новый класс RegistrationForm, унаследованный от UserCreationForm.Далее добавляем 4 поля:
username, email, password1 и password2.Поля
username и password можно скопировать из формы авторизации. Они такие же. Разве, что в поле password2 изменим название и описание поля.Поле
email описывается похожим образом, но для валидации используется EmailInput.Далее прописываем внутренний класс
Meta, в котором указываем модель и поля формы.Код:
Представление страницы регистрации.
Перейдём в файл
И здесь снова берём за основу уже написанный код, а именно поля и переопределение метода из представления авторизации.
Изменяя значения:
-
-
-
-
Ниже переопределяем метод
Код:
URL-паттерн страницы регистрации.
Открываем файл
Шаблон страницы регистрации.
В директории с шаблонами приложения
Копируем код из файла
Изменяем в коде текстовые значения, и добавляем отображение ошибки под поле, если в поле есть ошибка.
Код:
Добавляем кнопку в шапку.
Последнее, что осталось сделать, это добавить кнопку регистрации в шапку.
Откроем файл
Готово. Теперь на сайте есть и авторизация, и регистрация. Осталось добавить возможность сбрасывать пароль пользователю. После чего можно будет заняться профилем.
Файлы к посту, можно получить в боте по коду: 618284
Пост на сайте.
Поддержать канал.
from django.contrib.auth.forms import UserCreationForm
class RegistrationForm(UserCreationForm):
username = forms.CharField(
max_length=150,
label='Имя пользователя',
widget=forms.TextInput(attrs={
'class': 'form-control',
'placeholder': 'Введите имя пользователя'
})
)
email = forms.EmailField(
widget=forms.EmailInput(attrs={
'class': 'form-control',
'placeholder': 'Введите email'
})
)
password1 = forms.CharField(
max_length=128,
label='Пароль',
widget=forms.PasswordInput(attrs={
'class': 'form-control',
'placeholder': 'Введите пароль'
})
)
password2 = forms.CharField(
max_length=128,
label='Подтверждение пароля',
widget=forms.PasswordInput(attrs={
'class': 'form-control',
'placeholder': 'Повторите пароль'
})
)
class Meta:
model = User
fields = ['username', 'email', 'password1', 'password2', ]
Представление страницы регистрации.
Перейдём в файл
views.py и создадим новый класс CustomRegistrationView, унаследованный от CreateView.И здесь снова берём за основу уже написанный код, а именно поля и переопределение метода из представления авторизации.
Изменяя значения:
-
form_class - прописываем класс формы регистрации.-
template_name - прописываем файл шаблона.-
extra_context - прописываем заголовок страницы.-
get_success_url - изменяем страницу, на которую будет перенаправлен пользователь, в данном случае это страница авторизации.Ниже переопределяем метод
form_valid. В котором сохраним нового пользователя.Код:
class CustomRegistrationView(CreateView):
form_class = RegistrationForm
template_name = 'user_app/signup.html'
extra_context = {'title': 'Регистрация на сайте'}
def get_success_url(self):
return reverse_lazy('user_app:login')
def form_valid(self, form):
user = form.save()
return super().form_valid(form)
URL-паттерн страницы регистрации.
Открываем файл
urls.py и добавляем новый URL-паттерн для страницы регистрации:path('signup/', views.CustomRegistrationView.as_view(), name='signup'),Шаблон страницы регистрации.
В директории с шаблонами приложения
user_app создадим файл signup.html.Копируем код из файла
login.html.Изменяем в коде текстовые значения, и добавляем отображение ошибки под поле, если в поле есть ошибка.
Код:
<form method="post">
{% csrf_token %}
{% if form.non_field_errors %}
<div class="alert alert-danger">
{{ form.non_field_errors }}
</div>
{% endif %}
{% for field in form %}
<p class="form-label">{{ field.label }}</p>
<p>{{ field }}</p>
{% if field.errors %}
<ul class="alert alert-danger">
{{ field.errors }}
</ul>
{% endif %}
{% endfor %}
<button type="submit" class="btn btn-outline-success">Зарегистрироваться</button>
</form>
Добавляем кнопку в шапку.
Последнее, что осталось сделать, это добавить кнопку регистрации в шапку.
Откроем файл
header.html и добавим кнопку рядом с авторизацией:<li class="nav-item">
<a class="nav-link btn btn-primary my-btn me-3"
href="{% url 'user_app:signup' %}">Регистрация</a>
</li>
Готово. Теперь на сайте есть и авторизация, и регистрация. Осталось добавить возможность сбрасывать пароль пользователю. После чего можно будет заняться профилем.
Файлы к посту, можно получить в боте по коду: 618284
Пост на сайте.
Поддержать канал.
🔥1
Снова пятница, пора бы отдохнуть, а то я чёт устал)
Сегодня хочу предложить фильм "Капитан Фантастик"
Синопсис: Бен живёт в лесу с шестью своими детьми. Они говорят на нескольких языках, разбираются в квантовой физике, философии и литературе, а вместо Рождества отмечают день рождения Ноама Хомского. Они умеют охотиться, способны разделать добычу и приготовить её на костре, а также находятся в прекрасной физической форме. Когда их мать, лежащая в больнице, кончает с собой, всему семейству приходится отправиться в большой мир на её похороны.
Если у вас есть подписка КП, то смотреть можно тут: https://www.kinopoisk.ru/film/841147/
Если подписки нет, то тут: https://www.sspoisk.ru/film/841147
А как у вас прошла неделя? Какие планы на выходные? Рассказывайте)
Сегодня хочу предложить фильм "Капитан Фантастик"
Синопсис: Бен живёт в лесу с шестью своими детьми. Они говорят на нескольких языках, разбираются в квантовой физике, философии и литературе, а вместо Рождества отмечают день рождения Ноама Хомского. Они умеют охотиться, способны разделать добычу и приготовить её на костре, а также находятся в прекрасной физической форме. Когда их мать, лежащая в больнице, кончает с собой, всему семейству приходится отправиться в большой мир на её похороны.
Если у вас есть подписка КП, то смотреть можно тут: https://www.kinopoisk.ru/film/841147/
Если подписки нет, то тут: https://www.sspoisk.ru/film/841147
А как у вас прошла неделя? Какие планы на выходные? Рассказывайте)
🔥3
Приветствую.
От подписчика @sstormss поступило предложение написать небольшой командный проект.
Идея: Библиотека фанфиков.
Фреймворк: Django.
Функционал: Пользователи, личный кабинет, публикации, комментарии, разделение на жанры, обсуждения/форумы, оценки, лайки и так далее.
Подробное ТЗ будет сформировано в течении пары недель.
Цель: Научиться работать в команде над групповым PET-проектом.
Сроки не регламентированы. В свободное время.
Если хотите присоединиться, пишите в комментарии и вступайте в чат https://t.iss.one/+cm-ITbA-JTczMTRi
От подписчика @sstormss поступило предложение написать небольшой командный проект.
Идея: Библиотека фанфиков.
Фреймворк: Django.
Функционал: Пользователи, личный кабинет, публикации, комментарии, разделение на жанры, обсуждения/форумы, оценки, лайки и так далее.
Подробное ТЗ будет сформировано в течении пары недель.
Цель: Научиться работать в команде над групповым PET-проектом.
Сроки не регламентированы. В свободное время.
Если хотите присоединиться, пишите в комментарии и вступайте в чат https://t.iss.one/+cm-ITbA-JTczMTRi
Telegram
Кот на салфетке
Чат для канала https://t.iss.one/press_any_button
Обсуждаем посты, программирование и просто болтаем.
Обсуждаем посты, программирование и просто болтаем.
🔥2
Голосовалка на тему прошлого поста.
Хотите присоединиться к нашему PET-проекту?
Хотите присоединиться к нашему PET-проекту?
Anonymous Poll
37%
Да, хочу. Уже вступаю в группу!
53%
Хочу, но нет времени
10%
Не хочу. Я лучше самостоятельно))
🔥2
Приветствую.
Следующие посты чуть задержатся. Последнюю неделю было много дел, частью из которых хочу с вами поделиться.
1. 12-го числа подал заявку на стажировку в LAD Academy, в качестве Backend Python/Django разработчика.
15-го числа был последний день для отправки тестового задания - сайта на Django. Поэтому отложил все дела и занимался им. И, считаю, что вышло весьма добротно.
Результаты отбора будут 30-31 октября, о чём я конечно же сообщу 🙂
Код и само задание доступно на GitHub.
Ссылка на стажировку.
2. Параллельно с этим получил небольшой "заказ" - разработать приложение по конвертации файлов, заточенных под один ЧПУ-станок в другой. Реализовал с помощью библиотеки
Код доступен на GitHub.
В целом, неделя была продуктивной. В скором времени вернусь к постам.
У меня к вам два вопроса:
1. Помимо Django, на какую тему вам было бы интересно почитать посты? (желательно прям с идеями).
2. Если у вас есть комментарии, предложения, критика к коду тестового задания или программы - не стесняйтесь писать в комментарии.
Спасибо.
Пост на сайте.
Поддержать канал.
Следующие посты чуть задержатся. Последнюю неделю было много дел, частью из которых хочу с вами поделиться.
1. 12-го числа подал заявку на стажировку в LAD Academy, в качестве Backend Python/Django разработчика.
15-го числа был последний день для отправки тестового задания - сайта на Django. Поэтому отложил все дела и занимался им. И, считаю, что вышло весьма добротно.
Результаты отбора будут 30-31 октября, о чём я конечно же сообщу 🙂
Код и само задание доступно на GitHub.
Ссылка на стажировку.
2. Параллельно с этим получил небольшой "заказ" - разработать приложение по конвертации файлов, заточенных под один ЧПУ-станок в другой. Реализовал с помощью библиотеки
Flet.Код доступен на GitHub.
В целом, неделя была продуктивной. В скором времени вернусь к постам.
У меня к вам два вопроса:
1. Помимо Django, на какую тему вам было бы интересно почитать посты? (желательно прям с идеями).
2. Если у вас есть комментарии, предложения, критика к коду тестового задания или программы - не стесняйтесь писать в комментарии.
Спасибо.
Пост на сайте.
Поддержать канал.
🔥6
Приветствую.
6-го числа был пост с опросом о городах подписчиков.
Я благополучно про это забыл, исправляюсь)
Всего отметилось 19 человек из 20 городов (можно было бы и по активнее!).
В результате получился такой список:
- Бельдяжки - Vadim
- Бор - Кристина
- Волгоград - Евгений Акопян
- Волжский - Тимур Машков
- Воронеж - Mike_Ploskiy
- Грахово - Arthur
- Люблин, Польша - Иван Пеньковский
- Магнитогорск - Михаил Воропаев
- Мерсин, Турция - ole
- Москва - Segio B, Vadim
- Нижний Новгород - Кристина
- Нови Сад, Сербия - Mariya
- Новосибирск - Сергей, Андрей Богданов
- Прохладный - Roman Eremenko
- Рязань - Рыжов Василий
- Санкт-Петербург - ole
- Сарапул - proDreams
- Симферополь - Александр Бабичев
- Уфа - Regina
- Хабаровск - Юрий Б.
Прикрепляю криво сделанную карту с отметками городов.
P.S. Прости, Юра. Хабаровск не влез в экран))
6-го числа был пост с опросом о городах подписчиков.
Я благополучно про это забыл, исправляюсь)
Всего отметилось 19 человек из 20 городов (можно было бы и по активнее!).
В результате получился такой список:
- Бельдяжки - Vadim
- Бор - Кристина
- Волгоград - Евгений Акопян
- Волжский - Тимур Машков
- Воронеж - Mike_Ploskiy
- Грахово - Arthur
- Люблин, Польша - Иван Пеньковский
- Магнитогорск - Михаил Воропаев
- Мерсин, Турция - ole
- Москва - Segio B, Vadim
- Нижний Новгород - Кристина
- Нови Сад, Сербия - Mariya
- Новосибирск - Сергей, Андрей Богданов
- Прохладный - Roman Eremenko
- Рязань - Рыжов Василий
- Санкт-Петербург - ole
- Сарапул - proDreams
- Симферополь - Александр Бабичев
- Уфа - Regina
- Хабаровск - Юрий Б.
Прикрепляю криво сделанную карту с отметками городов.
P.S. Прости, Юра. Хабаровск не влез в экран))
🔥5💩1🤣1
Приветствую.
Давайте проведём новый опрос:
Какой ваш основной язык программирования и почему?
А если вы только учитесь, то какому языку отдаёте приоритет и также почему?
Хотел сперва сделать опрос, но тогда, он был бы не сильно информативен. По этому, просто пост.
Пишите ответы в комментарии, я уверен, многим будет интересно почитать то, к чему лежит выбор у других людей.
Давайте проведём новый опрос:
Какой ваш основной язык программирования и почему?
А если вы только учитесь, то какому языку отдаёте приоритет и также почему?
Хотел сперва сделать опрос, но тогда, он был бы не сильно информативен. По этому, просто пост.
Пишите ответы в комментарии, я уверен, многим будет интересно почитать то, к чему лежит выбор у других людей.
🔥2
Django 33. Сброс пароля пользователя
В посте "Django 13. Сброс пароля", мы уже писали сброс пароля, но то было для панели администратора.
В этом посте, реализуем сброс пароля для обычных пользователей.
Также для корректной работы, необходимо указать почтовый сервис.
Как его настроить я описывал в посте "Django 12. Настройка отправки почты".
А в постах "Docker 5.1 Почтовый сервер на Docker Mailserver - настройка домена" и "Docker 5.2 Почтовый сервер на Docker Mailserver - настройка и запуск" рассказывал как запустить свой почтовый сервер.
Для реализации сброса пароля, можно пойти простым или сложным путём.
Простой путь, это использовать уже встроенные в Django представления и формы, именно так мы и сделали в прошлый раз.
В посте "Django 13. Сброс пароля", мы уже писали сброс пароля, но то было для панели администратора.
В этом посте, реализуем сброс пароля для обычных пользователей.
Также для корректной работы, необходимо указать почтовый сервис.
Как его настроить я описывал в посте "Django 12. Настройка отправки почты".
А в постах "Docker 5.1 Почтовый сервер на Docker Mailserver - настройка домена" и "Docker 5.2 Почтовый сервер на Docker Mailserver - настройка и запуск" рассказывал как запустить свой почтовый сервер.
Для реализации сброса пароля, можно пойти простым или сложным путём.
Простой путь, это использовать уже встроенные в Django представления и формы, именно так мы и сделали в прошлый раз.
👍2
Достаточно в файле
Указав собственные шаблоны.
Однако, в нашем случае, уже есть сброс пароля для админа и они будут конфликтовать.
Можно вовсе убрать сброс пароля для админ и оставить общий, но куда интереснее переопределить представления.
Этим и займёмся.
Переопределение форм.
Начнём с переопределения форм для того, чтобы добавить в них поддержку стилей из Bootstrap.
Откроем файл
Тут нам надо переопределить две формы: форму ввода электронной почты для сброса и форму ввода нового пароля.
Мы не будем переписывать их полностью, а просто наследуемся от них и изменим стандартные поля.
Код форм:
В первой форме
Добавив класс из
Во второй форме
Переопределение представлений.
Откроем файл
Тут мы создадим два собственных представления:
-
-
urls.py указать паттерны:from django.contrib.auth import views as auth_views
path('password-reset/',
auth_views.PasswordResetView.as_view(template_name='users/pass_reset.html'),
name='password-reset'),
path('password_reset_confirm/<uidb64>/<token>/',
auth_views.PasswordResetConfirmView.as_view(template_name='users/password_reset_confirm.html'),
name='password_reset_confirm'),
path('password_reset_complete/',
auth_views.PasswordResetCompleteView.as_view(template_name='users/password_reset_complete.html'),
name='password_reset_complete'),
path('password-reset/done/',
auth_views.PasswordResetDoneView.as_view(template_name='users/password_reset_done.html'),
name='password_reset_done'),
Указав собственные шаблоны.
Однако, в нашем случае, уже есть сброс пароля для админа и они будут конфликтовать.
Можно вовсе убрать сброс пароля для админ и оставить общий, но куда интереснее переопределить представления.
Этим и займёмся.
Переопределение форм.
Начнём с переопределения форм для того, чтобы добавить в них поддержку стилей из Bootstrap.
Откроем файл
forms.py в директории приложения user_app.Тут нам надо переопределить две формы: форму ввода электронной почты для сброса и форму ввода нового пароля.
Мы не будем переписывать их полностью, а просто наследуемся от них и изменим стандартные поля.
Код форм:
from django.contrib.auth import password_validation
from django.contrib.auth.forms import PasswordResetForm, SetPasswordForm
class CustomPasswordResetForm(PasswordResetForm):
email = forms.EmailField(
label="Email",
max_length=254,
widget=forms.EmailInput(
attrs={'class': 'form-control',
'placeholder': 'Введите Email',
"autocomplete": "email"}
)
)
class CustomSetPasswordForm(SetPasswordForm):
error_messages = {
"password_mismatch": "Пароли не совпадают"
}
new_password1 = forms.CharField(
label='Новый пароль',
widget=forms.PasswordInput(
attrs={'class': 'form-control',
'placeholder': 'Введите новый пароль',
"autocomplete": "new-password"}
),
strip=False,
help_text=password_validation.password_validators_help_text_html(),
)
new_password2 = forms.CharField(
label='Подтверждение нового пароля',
strip=False,
widget=forms.PasswordInput(
attrs={'class': 'form-control',
'placeholder': 'Подтвердите новый пароль',
"autocomplete": "new-password"}
),
)
В первой форме
CustomPasswordResetForm, унаследованной от PasswordResetForm, мы переопределили только поле email.Добавив класс из
Bootstrap и прописав текст внутри поля.Во второй форме
CustomSetPasswordForm, унаследованной от SetPasswordForm, мы переопределили два поля new_password1 и new_password2, а так же прописали сообщение, если пароли не совпадают в поле error_messages.Переопределение представлений.
Откроем файл
views.py в директории приложения user_app.Тут мы создадим два собственных представления:
-
CustomPasswordResetView - представление страницы, где пользователь вводит электронную почту для сброса. Наследуемся от PasswordResetView.-
CustomUserPasswordResetConfirmView - представление страницы на которую пользователь перейдёт из письма для ввода нового пароля. Наследуемся от PasswordResetConfirmView.Код представлений.
В этих представлениях, переопределим следующие поля:
-
-
-
-
Шаблоны страниц.
В директории с шаблонами приложения
-
-
-
-
-
password_reset.html и password_reset_confirm.html.
Стандартный шаблон формы:
Различия только в тексте кнопки. Вообще можно сделать один файл и передавать текст кнопки через контекст.
password_reset_done.html.
В этом шаблоне сообщаем, что письмо отправлено и добавляем кнопку возврата на главную страницу.
password_reset_complete.html.
В этом шаблоне сообщаем, что пароль изменён и добавляем две кнопки: переход на главную и вход на сайт.
password_reset_email.html.
Изменённый стандартный шаблон письма со ссылкой для восстановления пароля.
Изменить необходимо имя URL-шаблона в этой строке:
Код шаблона:
from django.contrib.auth.views import PasswordResetView, PasswordResetConfirmView
from user_app.forms import CustomPasswordResetForm, CustomSetPasswordForm
class CustomPasswordResetView(PasswordResetView):
template_name = 'user_app/password_reset.html'
email_template_name = 'user_app/password_reset_email.html'
form_class = CustomPasswordResetForm
success_url = reverse_lazy('user_app:password_reset_done')
class CustomUserPasswordResetConfirmView(PasswordResetConfirmView):
template_name = 'user_app/password_reset_confirm.html'
success_url = reverse_lazy('user_app:password_reset_complete')
form_class = CustomSetPasswordForm
В этих представлениях, переопределим следующие поля:
-
template_name - файл шаблона.-
email_template_name - файл шаблона для отправки по электронной почте. Только в представлении CustomPasswordResetView.-
form_class - класс с формой.-
success_url - путь, куда будет перенаправлен пользователь после отправки формы.Шаблоны страниц.
В директории с шаблонами приложения
user_app, необходимо создать пять файлов:-
password_reset.html - первая страница сброса пароля. На этой странице пользователь вводит свой email.-
password_reset_done.html - вторая страница сброса пароля. На этой странице сообщаем пользователю, что письмо со ссылкой для сброса было отправлено на email.-
password_reset_confirm.html - третья страница сброса пароля. На этой странице пользователь вводит новый пароль.-
password_reset_complete.html - четвёртая и последняя страница сброса пароля. На этой странице сообщаем, что пароль был изменён.-
password_reset_email.html - страница шаблона для электронной почты. Код страницы взят из стандартного Django-шаблона, с одним лишь изменением - ссылкой на которую перейдёт пользователь из письма. Если этот файл не изменить, то в письме будет ссылка на сброс пароля администратора, а нам не нужно, что бы пользователи знали адрес панели администратора.password_reset.html и password_reset_confirm.html.
Стандартный шаблон формы:
<form method="POST">
{% csrf_token %}
{{ form.as_p }}
<button type="submit" class="btn btn-danger mt-3">Запросить новый пароль</button>
</form>
Различия только в тексте кнопки. Вообще можно сделать один файл и передавать текст кнопки через контекст.
password_reset_done.html.
В этом шаблоне сообщаем, что письмо отправлено и добавляем кнопку возврата на главную страницу.
<div class="container mt-3">
<h2>Ссылка для смены пароля отправлена на вашу почту.</h2>
<a href="{% url 'blog:index' %}" class="btn btn-danger mt-3">Вернуться на главную</a>
</div>
password_reset_complete.html.
В этом шаблоне сообщаем, что пароль изменён и добавляем две кнопки: переход на главную и вход на сайт.
<div class="container mt-3">
<h2>Вы успешно обновили пароль</h2>
<p>Ваш пароль заменен на новый!</p>
<a href="{% url 'user_app:login' %}" class="btn btn-danger mt-3">Войти</a>
<a href="{% url 'blog:index' %}" class="btn btn-danger mt-3">Вернуться на главную</a>
</div>
password_reset_email.html.
Изменённый стандартный шаблон письма со ссылкой для восстановления пароля.
Изменить необходимо имя URL-шаблона в этой строке:
{{ protocol }}://{{ domain }}{% url 'user_app:password_reset_confirm' uidb64=uid token=token %}Код шаблона:
{% load i18n %}{% autoescape off %}
{% blocktranslate %}You're receiving this email because you requested a password reset for your user account at {{ site_name }}.{% endblocktranslate %}
{% translate "Please go to the following page and choose a new password:" %}
{% block reset_link %}
{{ protocol }}://{{ domain }}{% url 'user_app:password_reset_confirm' uidb64=uid token=token %}
{% endblock %}
{% translate 'Your username, in case you’ve forgotten:' %} {{ user.get_username }}
{% translate "Thanks for using our site!" %}
{% blocktranslate %}The {{ site_name }} team{% endblocktranslate %}
{% endautoescape %}URL-паттерны страниц.
Откроем файл
Последний штрих.
Осталось добавить ссылку на страницу сброса пароля в шаблон страницы входа.
Откроем файл
Готово. Теперь пользователь сможет сбросить свой пароль.
Файлы к посту, можно получить в боте по коду: 568363
Пост на сайте.
Поддержать канал.
Откроем файл
urls.py и в список urlpatterns добавим новые паттерны:from django.contrib.auth import views as auth_views
path('password-reset/', views.CustomPasswordResetView.as_view(), name='password-reset'),
path('password_reset_confirm/<uidb64>/<token>/',
views.CustomUserPasswordResetConfirmView.as_view(),
name='password_reset_confirm'),
path('password_reset_complete/',
auth_views.PasswordResetCompleteView.as_view(template_name='user_app/password_reset_complete.html'),
name='password_reset_complete'),
path('password-reset/done/',
auth_views.PasswordResetDoneView.as_view(template_name='user_app/password_reset_done.html'),
name='password_reset_done'),
Последний штрих.
Осталось добавить ссылку на страницу сброса пароля в шаблон страницы входа.
Откроем файл
login.html и добавим следующую строчку где-нибудь внизу:Забыли пароль? <a href="{% url 'user_app:password-reset' %}">Сбросить пароль</a>Готово. Теперь пользователь сможет сбросить свой пароль.
Файлы к посту, можно получить в боте по коду: 568363
Пост на сайте.
Поддержать канал.
🔥1
Приветствую.
Снова неделя пролетела, а вроде бы ещё вчера было воскресенье. Пора отдыхать!
Фильм на сегодня: Голограмма для короля (2016).
Краткий синопсис: Алан Клей - муж, отец, бизнесмен. Но его бизнес терпит крах, его брак трещит по швам, и он не знает, где взять деньги на оплату обучения дочери. Чтобы избежать банкротства и разорвать замкнутый круг, Клей отправляется в Саудовскую Аравию, где он надеется продвинуть свой дерзкий технологический проект. Во время томительного ожидания встречи с королем Алан познает скрытые тайны арабского мира, которые преображают реальность, подобно голограмме. Никто не подозревал, чем обернется это путешествие к Красному морю…
Если у вас есть подписка КП, то смотреть можно тут: https://www.kinopoisk.ru/film/771067/
Если подписки нет, то тут: https://www.sspoisk.ru/film/771067/
А как провели неделю вы?
Снова неделя пролетела, а вроде бы ещё вчера было воскресенье. Пора отдыхать!
Фильм на сегодня: Голограмма для короля (2016).
Краткий синопсис: Алан Клей - муж, отец, бизнесмен. Но его бизнес терпит крах, его брак трещит по швам, и он не знает, где взять деньги на оплату обучения дочери. Чтобы избежать банкротства и разорвать замкнутый круг, Клей отправляется в Саудовскую Аравию, где он надеется продвинуть свой дерзкий технологический проект. Во время томительного ожидания встречи с королем Алан познает скрытые тайны арабского мира, которые преображают реальность, подобно голограмме. Никто не подозревал, чем обернется это путешествие к Красному морю…
Если у вас есть подписка КП, то смотреть можно тут: https://www.kinopoisk.ru/film/771067/
Если подписки нет, то тут: https://www.sspoisk.ru/film/771067/
А как провели неделю вы?