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

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

Персональная страница

В качестве адреса персональной страницы автора будет использоваться его username, это логично и удобно. Добавьте в конец файла posts/urls.py новые пути:
Скопировать кодPYTHON
from django.urls import path from . import views urlpatterns = [ ... # Главная страница path('', views.index, name='index'), # Профайл пользователя path('<str:username>/', views.profile, name='profile'), # Просмотр записи path('<str:username>/<int:post_id>/', views.post_view, name='post'), path( '<str:username>/<int:post_id>/edit/', views.post_edit, name='post_edit' ), ]
А в файл posts/views.py добавьте функции:
Скопировать кодPYTHON
def profile(request, username): # тут тело функции return render(request, 'profile.html', {}) def post_view(request, username, post_id): # тут тело функции return render(request, 'post.html', {}) def post_edit(request, username, post_id): # тут тело функции. Не забудьте проверить, # что текущий пользователь — это автор записи. # В качестве шаблона страницы редактирования укажите шаблон создания новой записи # который вы создали раньше (вы могли назвать шаблон иначе) return render(request, 'post_new.html', {})

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

Обычно backend-разработчик берет готовый HTML-код либо комбинирует части существующих шаблонов. Сейчас ваша задача — превратить статичный HTML-код в динамический шаблон.
В этом фрагменте HTML-кода выводятся посты определённого пользователя и информация о нём. Этот блок content должен встраиваться в базовый шаблон base.html (подсказку про тег {% extends "file_name.html" %} мы не дадим).
Комментарии в коде показывают, где статические данные нужно заменить на переменные.
Скопировать кодHTML
<main role="main" class="container"> <div class="row"> <div class="col-md-3 mb-3 mt-1"> <div class="card"> <div class="card-body"> <div class="h2"> <!-- Имя автора --> Лев Толстой </div> <div class="h3 text-muted"> <!-- username автора --> @leo </div> </div> <ul class="list-group list-group-flush"> <li class="list-group-item"> <div class="h6 text-muted"> Подписчиков: XXX <br /> Подписан: XXX </div> </li> <li class="list-group-item"> <div class="h6 text-muted"> <!-- Количество записей --> Записей: 36 </div> </li> </ul> </div> </div> <div class="col-md-9"> <!-- Начало блока с отдельным постом --> <div class="card mb-3 mt-1 shadow-sm"> <div class="card-body"> <p class="card-text"> <!-- Ссылка на страницу автора в атрибуте href; username автора в тексте ссылки --> <a href="/leo/"><strong class="d-block text-gray-dark">@leo</strong></a> <!-- Текст поста --> [Фокшаны.] Еще переходъ до Фокшанъ, во время котораго я ѣхалъ съ Монго. Человѣкъ пустой, но съ твердыми, хотя и ложными убѣжденіями. Генерал[у] по этому должно быть случаю, угодно было спрашивать о моемъ здоровьи. Свинья! К[о]вырялъ носъ и ничего не написалъ — вотъ 2 упрека за нын[ѣшній] день. Послѣдній упрекъ становится слишкомъ частъ, хотя походъ и можетъ служить въ немъ отчасти извиненіемъ. Отношенія мои съ товарищами становятся такъ пріятны, что мнѣ жалко бросить штабъ. Здоровье кажется (2) лучше. </p> <div class="d-flex justify-content-between align-items-center"> <div class="btn-group "> <!-- Ссылка на страницу записи в атрибуте href--> <a class="btn btn-sm text-muted" href="/leo/37/" role="button">Добавить комментарий</a> <!-- Ссылка на редактирование, показывается только автору записи --> <a class="btn btn-sm text-muted" href="/leo/37/edit" role="button">Редактировать</a> </div> <!-- Дата публикации --> <small class="text-muted">31 июля 1854 г. 0:00</small> </div> </div> </div> <!-- Конец блока с отдельным постом --> <!-- Остальные посты --> <!-- Здесь постраничная навигация паджинатора --> </div> </div> </main>

Шаблон страницы просмотра записи

Этот шаблон почти идентичен странице профайла, но в нём показывается только один пост.
Скопировать кодHTML
<main role="main" class="container"> <div class="row"> <div class="col-md-3 mb-3 mt-1"> <div class="card"> <div class="card-body"> <div class="h2"> <!-- Имя автора --> Лев Толстой </div> <div class="h3 text-muted"> <!-- username автора --> @leo </div> </div> <ul class="list-group list-group-flush"> <li class="list-group-item"> <div class="h6 text-muted"> Подписчиков: XXX <br /> Подписан: XXX </div> </li> <li class="list-group-item"> <div class="h6 text-muted"> <!--Количество записей --> Записей: 36 </div> </li> </ul> </div> </div> <div class="col-md-9"> <!-- Пост --> <div class="card mb-3 mt-1 shadow-sm"> <div class="card-body"> <p class="card-text"> <!-- Ссылка на страницу автора в атрибуте href; username автора в тексте ссылки --> <a href="/leo/"><strong class="d-block text-gray-dark">@leo</strong></a> <!-- Текст поста --> [Фокшаны.] Еще переходъ до Фокшанъ, во время котораго я ѣхалъ съ Монго. Человѣкъ пустой, но съ твердыми, хотя и ложными убѣжденіями. Генерал[у] по этому должно быть случаю, угодно было спрашивать о моемъ здоровьи. Свинья! К[о]вырялъ носъ и ничего не написалъ — вотъ 2 упрека за нын[ѣшній] день. Послѣдній упрекъ становится слишкомъ частъ, хотя походъ и можетъ служить въ немъ отчасти извиненіемъ. Отношенія мои съ товарищами становятся такъ пріятны, что мнѣ жалко бросить штабъ. Здоровье кажется (2) лучше. </p> <div class="d-flex justify-content-between align-items-center"> <div class="btn-group "> <!-- Ссылка на редактирование, показывается только автору записи --> <a class="btn btn-sm text-muted" href="/leo/36/edit" role="button">Редактировать</a> </div> <!-- Дата публикации --> <small class="text-muted">31 июля 1854 г. 0:00</small> </div> </div> </div> </div> </div> </main>

Задание

Создайте в своём локальном проекте Yatube:
  • Страницу профайла пользователя с постами. Добавьте на неё паджинатор, количество записей автора вы умеете вычислять
  • Страницу просмотра отдельной записи
  • Страницу с формой редактирования существующей записи: расширьте готовый шаблон с формой создания поста. В зависимости от ситуации заголовок формы должен меняться: «Добавить запись» или «Редактировать запись». Надпись на кнопке отправки формы тоже должна зависеть от операции: «Добавить» для новой записи и «Сохранить» — для редактирования.
В этом задании ничего не нужно отправлять на проверку, мы всё проверим вместе с финальным проектом спринта.