Удаление записи
Создадим функционал удаления записи из базы данных. Кнопка удаления, аналогичная кнопке на странице со списком постов, будет перенаправлять пользователя на страницу вида /post/<id>/delete. <id> – динамический параметр, идентификатор удаляемой записи. Слово delete (или любое другое) используется для различения этого URL от URL просмотра статьи. Кнопка будет иметь класс btn btn-danger (красная кнопка) и текст «Удалить». Также добавим кнопку редактирования с классом btn btn-success (зелёная кнопка) и текстом «Редактировать», перенаправляющую на страницу вида /post/<id>/update.
Обработка удаления происходит в главном файле приложения. Функция post_delete принимает параметр <id> из URL. Для работы с базой данных используется функция get_or_404, возвращающая запись по ID или ошибку 404, если запись не найдена.
# ... код ...
try:
post = get_or_404(Post, id=id)
db.session.delete(post)
db.session.commit()
return redirect(url_for('post'))
except:
return render_template('post.html', error='При удалении статьи произошла ошибка')
Функция находит запись, пытается её удалить и выполнить commit. В случае успеха происходит перенаправление на страницу со списком статей. В случае ошибки выводится сообщение.
Редактирование записи
Страница редактирования доступна по URL вида /post/<id>/update через кнопку «Редактировать». Функция обработки этого URL похожа на функцию добавления новой записи.
# ... код ...
@app.route('/post/<int:id>/update', methods=['GET', 'POST'])
def post_update(id):
# ... код ...
Функция post_update принимает id записи из URL. Для отображения формы редактирования используется шаблон post_update.html, похожий на шаблон добавления статьи, но с полями, заполненными данными из базы данных через объект article.
<form method="POST">
<input type="text" name="title" value="{{ article.title }}">
<textarea name="intro">{{ article.intro }}</textarea>
<textarea name="text">{{ article.text }}</textarea>
<button type="submit">Обновить</button>
</form>
В функции post_update запись находится по ID. При POST-запросе значения из формы подставляются в найденный объект, и база данных обновляется с помощью db.session.commit(). В случае ошибки выводится сообщение.
# ... код ...
post = get_or_404(Post, id=id)
if request.method == 'POST':
post.title = request.form['title']
post.intro = request.form['intro']
post.text = request.form['text']
try:
db.session.commit()
return redirect(url_for('post'))
except:
return render_template('post_update.html', article=post, error='При редактировании статьи произошла ошибка')
# ... код ...
Условие отсутствия статей
В шаблон post.html добавлено условие, выводящее сообщение «У вас еще нет статей на сайте», если статей нет. Проверка количества статей осуществляется по длине переменной articles.
{% if articles|length > 0 %}
<!-- код вывода статей -->
{% else %}
<p>У вас еще нет статей на сайте</p>
{% endif %}
Реализованы функционалы удаления и обновления статей, а также добавлено сообщение об отсутствии статей.