В сегодняшней части серии мы собираемся создать профиль для пользователя, включая дополнительную информацию, такую как фотографию профиля и BiO.
Прежде всего, давайте создать вид профиля внутри
views.py
from django.shortcuts import render from django.contrib.auth.decorators import login_required @login_required def profile(request): return render(request, 'users/profile.html')
- Позже мы изменим этот вид, чтобы пользователи обновили свой профиль.
-
login_required
Декоратор ограничивает доступ к зарегистрированным пользователям. - Пользователь, который не вошел в систему, не может получить доступ к странице профиля. Если пользователь пытается сделать это,
login_required ()
перенаправляет его/ее внастройки. Login_url
(который мы настроили в Логин/Выход Часть серии), передавая текущий абсолютный путь в строке запроса. Пример:/login/? next =/profile/
- Как мы можем видеть из примерного пути, функция отслеживает какую страницу, которую пользователь пытается получить доступ. Следовательно, он будет перенаправлять пользователь на страницу профиля, которую они просили в первую очередь после успешной аутентификации.
Открыть приложение для пользователей URLS.PY и добавьте маршрут для просмотра профиля.
Пользователи/URLS.PY.
from django.urls import path from .views import profile urlpatterns = [ # Add this path('profile/', profile, name='users-profile'), ]
Создайте шаблон для вида внутри каталога шаблона приложений пользователей.
Профиль .html.
{% extends "users/base.html" %} {% block title %}Profile Page{% endblock title %} {% block content %}{% endblock content %}This is the profile page for {{user.username}}
- Позже мы изменим этот шаблон позже, чтобы отобразить профиль пользователя, но сначала есть пара вещей, которые нам нужно сделать.
Расширение пользовательской модели с использованием ссылки на одну к одной
Пришло время смоделировать наш профиль, чтобы он будет иметь фотографию профиля пользователя и биологически активные поля в базе данных.
Когда мы хотим хранить дополнительную информацию о пользователе, которая не связана с аутентификацией, мы можем создать новую модель, которая имеет ссылку на одну к одной с пользователем.
В Django мы можем создавать отношения в одну сторону между моделями, используя OneToonefield
Модель поле.
- В отношениях в одну сторону, одна запись в таблице связана с одной и только одной записью в другой таблице с использованием внешнего ключа. Пример – экземпляр пользователя модели связан с одним и только одним экземпляром профиля.
Хорошо, давайте создадим модель профиля с 2 полями, Avatar (изображение профиля) и Bio. Вы можете добавить больше, если хотите.
models.py
from django.db import models from django.contrib.auth.models import User # Extending User Model Using a One-To-One Link class Profile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE) avatar = models.ImageField(default='default.jpg', upload_to='profile_images') bio = models.TextField() def __str__(self): return self.user.username
- Первый аргумент
OneToonefield
Указывает, какая модель текущая модель будет связана с, которая в нашем случае является Пользователь модель. Второй аргументon_delete = модели. Каскад
означает, что если пользователь удален, удалите его/ее профиль. - Первый аргумент
ImageField
,по умолчанию = 'default.jpg'
Является ли изображение по умолчанию для использования для пользователя, если они не загружают себя. Второй аргументupload_to = 'profile_images'
это каталог, в котором изображения загружаются. - Bio – это просто текстовое поле, где хранятся некоторая информация о пользователях.
- ДРУДА
__str__
Метод преобразует объект в его строковое представление, что делает его более описательным и читаемым, когда напечатан экземпляр профиля. Итак, всякий раз, когда мы распечатываем профиль пользователя, он будет отображать его/ее имя пользователя.
Хорошо, есть библиотека, которой нам нужно, чтобы это было работать. Когда-нибудь работал с изображениями в Python раньше? Если это так, вы, вероятно, знаете о подушка
Что является одной из наиболее распространенных библиотеки обработки изображений, которая позволяет нам делать различные виды манипуляций изображений в Python.
Django требует от нас установить эту библиотеку всякий раз, когда работают с ImageField.
Так что перейдите к вашему терминалу и введите следующее.
Пип установить подушку
Для изменения вступают в силу внутри нашей базы данных, давайте запустим миграцию.
Python Manage.py Makemigrations
Python Manage.py мигрировать
- Еще один важный шаг – зарегистрировать модель профиля внутри приложения пользователя admin.py Отказ
admin.py
from django.contrib import admin from .models import Profile admin.site.register(Profile)
- Приведенный выше код импортирует модель профиля, а затем звонки
admin.site.register
зарегистрировать это.
Теперь вы можете войти в панель администратора и посмотреть модель, которую мы создали.
Загруженные пользователем файлы/работа с изображениями
При работе с медиафайлами в Django мы должны изменить некоторые настройки для хранения файлов локально и обслуживать их по необходимости.
В частности, нам нужно установить Media_URL и Media_root в настройках.
Media_root
Полный путь к каталогу, где хранятся загруженные файлы. Обычно мы храним такие файлы, создавая каталог внутри базового каталога проекта.Media_url
это базовый URL для обслуживания медиафайлов. Это то, что позволяет нам получить доступ к средам через наш веб-браузер.
settings.py
MEDIA_ROOT = os.path.join(BASE_DIR, 'media') MEDIA_URL = '/media/'
Теперь мы должны настроить проект URLS.PY Чтобы обслуживать загруженные пользователем медиа-файлы во время разработка ( когда).
user_management/urls.py
from django.conf import settings from django.conf.urls.static import static urlpatterns = [ # ... ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Теперь мы можем добавить файлы в корневую папку Media и Django послужит им из URL-адреса носителя.
Как вы можете видеть из изображения выше, изображение профиля, которую пользователи загружают, будут жить внутри
/Media/Profile_Images/your_image
Отказ Пока мы не создаем Frestend, где использование загрузит фотографии, вы можете перейти на панель администратора и создавать изображения для зарегистрированных пользователей, чтобы увидеть, если все это работает хорошо.Изображение профиля по умолчанию, которое дано пользователям живет внутри
/СМИ/
Следовательно, положите любое изображение по умолчанию, которое вы хотите в этом каталоге с именемdefault.jpg
Отказ
Сигналы в Джанго
Обратите внимание, что мы должны пойти на страницу администратора, чтобы создать профиль, когда пользователь создан, но мы не хочем делать это каждый сейчас, а затем. Было бы здорово, если мы можем автоматически создавать профили, когда создан новый пользователь. Для этого мы используем сигналы Отказ
Но что такое сигналы ??
Сигналы используются для выполнения некоторых действий по модификации/созданию конкретной записи в базе данных.
В сигнале у нас есть следующие основные концепции.
- Отправитель : Обычно это модель, которая уведомляет приемник, когда происходит событие.
- Приемник : Приемник обычно является функцией, которая работает на данных после того, как он уведомляется о некоторых действиях, которые имели место, например, когда пользовательский экземпляр практически сохраняется в базе данных.
- Соединение между отправителями и приемниками выполняется через «диспетчеры сигналов».
Используйте чехол : – Использование сигналов Мы можем создать экземпляр профиля вправо, когда новый пользовательский экземпляр создан внутри базы данных.
Django рекомендует нам поставить сигналы в каталог приложения в виде одного модуля. Поэтому создать Сигналы.пи Файл внутри приложения пользователей.
signals.py
from django.db.models.signals import post_save from django.contrib.auth.models import User from django.dispatch import receiver from .models import Profile @receiver(post_save, sender=User) def create_profile(sender, instance, created, **kwargs): if created: Profile.objects.create(user=instance) @receiver(post_save, sender=User) def save_profile(sender, instance, **kwargs): instance.profile.save()
create_profile
Это функция приемника, которая запускается каждый раз, когда пользователь создается.- Пользователь является отправителем, который отвечает за уведомление.
post_save
это сигнал, который отправляется в конце метода сохранения.- В общем, какой вышеуказанный код выполняет после того, как пользовательская модель
Сохранить ()
Метод завершил выполнение, он отправляет сигнал (post_save
) в функцию приемника (create_profile
), эта функция получит сигнал для создания и сохранения экземпляра профиля для этого пользователя.
Следующий шаг – подключить приемники в Готов ()
Способ конфигурации приложения, импортируя модуль сигналов. Открыть Apps.py Где мы можем включить любую конфигурацию приложения для приложения пользователей.
apps.py
from django.apps import AppConfig class UserConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'users' # add this def ready(self): import users.signals # noqa
- Что мы сделали, это переопределить
Готов ()
Метод приложения пользователей Config для выполнения задачи инициализации, которая регистрирует сигналы.
Теперь, когда у нас есть вышеперечисленные вещи под нашим поясом, в следующей части мы создадим форму, где пользователи будут обновлять свой профиль и отображать информацию внутри шаблона.
Вы можете найти готовое приложение в Github Отказ
Любые комментарии и предложения приветствуются.
Оригинал: “https://dev.to/earthcomfy/django-user-profile-3hik”