Профайл пользователя и страница записи
Создадим страницу профайла пользователя. Пока что на ней будет отображаться информация об авторе и его посты.
Дополнительно напишем страницу для просмотра отдельного поста, а в следующих уроках добавим на неё форму для комментариев и систему подписки на автора.
Персональная страница
В качестве адреса персональной страницы автора будет использоваться его 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">
@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">
<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/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">
@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">
<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:
- Страницу профайла пользователя с постами. Добавьте на неё паджинатор, количество записей автора вы умеете вычислять
- Страницу просмотра отдельной записи
- Страницу с формой редактирования существующей записи: расширьте готовый шаблон с формой создания поста. В зависимости от ситуации заголовок формы должен меняться: «Добавить запись» или «Редактировать запись». Надпись на кнопке отправки формы тоже должна зависеть от операции: «Добавить» для новой записи и «Сохранить» — для редактирования.
В этом задании ничего не нужно отправлять на проверку, мы всё проверим вместе с финальным проектом спринта.