Cat

Django 34.1. Простой профиль пользователя - страница профиля

В этом посте, мы начнём реализовывать профиль пользователя. Начнём с самого простого варианта.

Все статьи

Icon Link

Дополнительные материалы

Icon Link

Реклама

Icon Link
Сайт на Django proDream 23 Октябрь 2023 Просмотров: 1285

Что у нас уже есть?

Следующим шагом необходимо реализовать профиль пользователя.

Я знаю три способа реализации личного кабинета / профиля пользователя:

  • Простой - страничка с доступной из стандартной модели пользователя информацией, а также, например, со списком постов пользователя, его комментариями и другими данными, где пользователь указан в модели.
  • Средний - создание дополнительной модели профиля. В этой модели указываются дополнительные поля, методы и прочее, которых нет в стандартной модели.
  • Сложный - создание собственной модели пользователя, основываясь на базовом классе или описывая всё с нуля, если это необходимо.

Поскольку у всех разные требования и необходимости, я хочу рассмотреть все три способа, а у вас будет представление о способах реализации и можно будет выбрать наиболее подходящий.

Начнём с самого простого варианта.

Мы реализуем:

  • Страницу профиля. На ней будет информация о пользователе и список его постов, кнопка перехода на страницу настроек и кнопка перехода ко всем постам пользователя. Для этого нам надо будет сделать представление и шаблон.
  • Страницу настроек профиля. На ней будет две формы: со сменой имени пользователя и email, а так же со сменой пароля. Для этого нам надо будет сделать представление, шаблон и две формы.

 

Представление страницы профиля.

Напишем простое представление, которое будет передавать в шаблон объект и посты пользователя.

Откроем файл views.py в приложении user_app.

Создадим класс UserProfileView, унаследованный от TemplateView.

В нём прописываем единственное поле template_name, указывающее на файл шаблона.

Ниже переопределяем метод get_context_data.

В нём мы получаем объект класса User, полученный из переданного в адресной строке имени пользователя и записываем в переменную.
Получение объекта оборачиваем в try-except, в случае, если передано некорректное или отсутствующее в базе имя пользователя, вместо страницы с ошибкой получения данных, вернулась страница ошибки 404 (до написания собственных страниц ошибок, мы тоже дойдём.).

Записываем в контекст объект пользователя, список его последних пяти постов и заголовок страницы.

 

Код представления:

from django.contrib.auth.models import User
from django.views.generic import TemplateView
from django.shortcuts import get_object_or_404
from django.http import Http404

from blog.models import PostModel


class UserProfileView(TemplateView):  
    template_name = 'user_app/profile_page.html'  

    def get_context_data(self, **kwargs):  
        context = super().get_context_data(**kwargs)  
        try:  
            user = get_object_or_404(User, username=self.kwargs.get('username'))  
        except User.DoesNotExist:  
            raise Http404("Пользователь не найден")  
        context['user_profile'] = user  
        context['user_posts'] = PostModel.post_manager.filter(author=user)[:5]  
        context['title'] = f'Профиль пользователя {user}'  
        return context

 

Шаблон страницы профиля.

В директории с шаблонами приложения создадим новый файл profile_page.html.

Внутри разделим его на две части:

  • В левой будет список постов и кнопка (пока заглушка) для перехода на страницу всех постов пользователя.
  • В правой будет информация о пользователе. На данный момент, это имя пользователя (username), имя и фамилия (если указаны в профиле), а также кнопка для перехода на страницу изменения профиля (пока тоже заглушка).

 

Код шаблона:

{% extends 'blog/base.html' %}
{% block title %}{{ title }}{% endblock %}

{% block content %}
    <div class="container mt-3">
        <h2>Профиль пользователя {{ user_profile }}</h2>
        <hr>
        <div class="row">
            <div class="col-xl-8 сol-sm-12">
                <h3 class="mb-3">Последние посты:</h3>
                {% for post in user_posts %}
                    <div class="row">
                        <div class="col-lg-3 col-sm-12 d-flex align-items-center">
                            <img src="{{ post.image.url }}" alt="{{ post.title }}" class="img-fluid">
                        </div>
                        <div class="col-lg-9 col-sm-12">
                            <h4 class="head2"><a href="{{ post.get_absolute_url }}">{{ post.title }}</a></h4>
                            <div class="mb-3">
                                <p class="lead"><a
                                        href="{{ post.category.get_absolute_url }}">{{ post.category }}</a>
                                    | {{ post.publish | date:"d F Y" }} |
                                    Просмотров: {{ post.views }}</p>
                            </div>
                            {{ post.short_body | safe }}
                        </div>
                    </div>
                    <hr class="m-1">
                {% endfor %}
                <div class="text-center mt-3">
                    <a class="btn btn-primary my-btn mb-3" href="#">Все посты {{ user_profile }}</a>
                </div>
            </div>
            <div class="col-xl-4 col-sm-12 border border-start border-0">
            <h3 class="mb-3">Информация:</h3>
                <p>
                    <b>Имя пользователя:</b> {{ user_profile }}
                    {% if user_profile.first_name %}
                        <br>
                        <b>Имя:</b> {{ user_profile.first_name }}
                    {% endif %}
                    {% if user_profile.last_name %}
                        <br>
                        <b>Фамилия:</b> {{ user_profile.last_name }}</p>
                    {% endif %}
                {% if user_profile  user %}
                    <a class="btn btn-primary my-btn me-1" href="#">Настройки профиля</a>
                {% endif %}
            </div>
        </div>
    </div>
{% endblock %}

 

Ссылка на профиль в шапке и в карточке поста.

Теперь добавим ссылку на профиль в шапку сайта.

Откроем файл header.html и там, где у нас кнопка "выход", выше добавляем "профиль":

<li>  
    <a class="dropdown-item dd-item-color" href="{% url 'user_app:user_profile' username=user.username %}">Профиль</a>  
</li>

 

Также добавим ссылку в карточку поста или в сам пост:

<a href="{% url 'user_app:user_profile' username=post.author %}">{{ post.author }}</a>

 

В первом случае, мы передаём ключевой аргумент username текущего авторизованного пользователя, а во втором случае, берём его из поля author у поста.

 

URL-паттерн страницы профиля.

Последнее, что осталось сделать, это прописать URL-паттерн.

Открываем файл urls.py в директории приложения user_app и в список urlpatterns добавляем новую строку:

path('<str:username>/', views.UserProfileView.as_view(), name='user_profile'),

 

Готово. Теперь у нас есть простая страница профиля. В следующем посте сделаем страницу настроек и страницу всех постов.

 

Автор

    Нет комментариев

    Реклама