Представление профиля пользователя в Django
Давайте создадим в нашем модуле system -> views -> profiles.py
Получится следующая структура (если вы следуете моим урокам и декомпозиции):

А теперь перейдем к представлению:
modules/system/views/profiles.py
from django.views.generic import DetailView
from modules.system.models import Profile
class ProfileView(DetailView):
"""
Представление для показа профиля на страничке
"""
model = Profile
context_object_name = 'profile'
template_name = 'modules/system/profiles/profile-detail.html'
queryset = model.objects.detail()
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['title'] = f'Страница пользователя: {self.object.user.username}'
return context
Пояснения:
- Мы добавили представление DetailView на основе классов, что позволит нам посмотреть полный профиль.
- Задали context_object_name, как 'profile' для использования переменных в шаблоне.
- Добавили контекст для заголовка.
Примечание: если вы используете ту же структуру файлов и папок, то в views/__init__.py добавим следующее:
from modules.system.views.profiles import *
__all__ = '__all__'
Теперь создадим файл urls.py в system, где добавим представление профиля и подключим его в backend/urls.py.
modules/system/urls.py
from django.urls import path
from modules.system.views import ProfileView
urlpatterns = [
path('user/<str:slug>/', ProfileView.as_view(), name='profile'),
]
И подключим в основном файле urls.py
backend/urls.py
from django.contrib import admin
from django.urls import path, include
from django.conf.urls.static import static
from backend import settings
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('modules.blog.urls')),
path('s/', include('modules.system.urls'))
]
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Пояснения:
- Показываю наш весь файл urls.py для напоминания.
- Все системные ссылки будут начинаться с s, как это реализовано на notehunter.net. Вы можете сделать как пожелаете, хоть system, хоть оставить пустое значение и ссылки будут как /user/ и т.д.
- Профиль будет находиться по ссылке следующего вида /s/user/slug/
А теперь приступаем к самому шаблону, создадим следующую структуру по декомпозиции: templates -> modules -> system -> profiles -> profile-detail.html
templates/modules/system/profiles/profile-detail.html
{% extends 'main.html' %}
{% block content %}
<div class="card border-0">
<div class="card-body">
<div class="row">
<div class="col-md-3">
<figure>
<img src="{{ profile.get_avatar }}" class="img-fluid rounded-0" alt="{{ profile }}">
</figure>
</div>
<div class="col-md-9">
<h5 class="card-title">
{{ profile }}
</h5>
<div class="card-text">
<ul>
<li>Никнейм: {{ profile.user.username }}</li>
<li>Заходил: {{ profile.user.last_login }}</li>
<li>Возраст: {{ profile.get_age }}</li>
<li>О себе: {{ profile.bio }}</li>
</ul>
</div>
</div>
</div>
</div>
</div>
{% endblock %}
Смотрим результат:

Надеюсь у вас все получилось верно, дорогие читатели. В следующем уроке мы добавим формы редактирования профиля и пользователя на одну страницу.