Рубрики
Без рубрики

Django – профиль пользователя

В сегодняшней части серии мы собираемся создать профиль для пользователя, включая дополнительные … Теги с Python, Django, WebDev, учебником.

В сегодняшней части серии мы собираемся создать профиль для пользователя, включая дополнительную информацию, такую как фотографию профиля и 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 %}
    

This is the profile page for {{user.username}}

{% endblock content %}
  • Позже мы изменим этот шаблон позже, чтобы отобразить профиль пользователя, но сначала есть пара вещей, которые нам нужно сделать.

Расширение пользовательской модели с использованием ссылки на одну к одной

Пришло время смоделировать наш профиль, чтобы он будет иметь фотографию профиля пользователя и биологически активные поля в базе данных.

Когда мы хотим хранить дополнительную информацию о пользователе, которая не связана с аутентификацией, мы можем создать новую модель, которая имеет ссылку на одну к одной с пользователем.

В 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”