Получение данных из базы данных и вывод их на страницах сайта.
Создание страницы /posts
В файле app.py создадим правило маршрутизации для URL /posts:
@app.route('/posts')
def posts():
articles = Article.query.order_by(Article.date.desc()).all()
return render_template('posts.html', articles=articles)
Функция posts() получает все записи из базы данных и передает их в шаблон posts.html. Запрос данных осуществляется следующим образом:
articles = Article.query.order_by(Article.date.desc()).all()
Описание:
- Article.query обращается к модели Article.
- .order_by(Article.date.desc()) сортирует статьи по полю date в порядке убывания.
- .all() возвращает все записи.
Полученный список статей передается в шаблон posts.html с помощью render_template.
Создание шаблона posts.html
Создадим файл templates/posts.html. Заголовок:
<h1>Все статьи на сайте</h1>
Перебор массива articles с помощью цикла Jinja2:
{% for article in articles %}
<div class="alert alert-info">
<h2>{{ article.title }}</h2>
<p>{{ article.intro }}</p>
<p>{{ article.date.strftime('%Y-%m-%d') }}</p>
<a href="#" class="btn btn-warning">Подробнее</a>
</div>
{% endfor %}
Описание:
- {{ article.title }}, {{ article.intro }}, {{ article.date.strftime(‘%Y-%m-%d’) }} выводят значения полей статьи.
- strftime(‘%Y-%m-%d’) форматирует дату.
- <a href="#" class="btn btn-warning">Подробнее</a> — кнопка «Подробнее».
Добавление ссылки и функционала кнопки «Подробнее»
Добавим ссылку на страницу /posts в templates/base.html:
<a href="/posts">Статьи</a>
Для каждой статьи генерируем ссылку вида /post/<id>. Модифицируем код шаблона:
<a href="/post/{{ article.id }}" class="btn btn-warning">Подробнее</a>
В app.py добавим обработчик для URL /post/<int:id>:
@app.route('/post/<int:id>')
def post_detail(id):
article = Article.query.get(id)
return render_template('post_detail.html', article=article)
Описание:
- @app.route(‘/post/<int:id>’) обрабатывает URL с целочисленным параметром id.
- Article.query.get(id) получает статью по ID.
Создание шаблона post_detail.html
Создадим файл templates/post_detail.html:
<h1>{{ article.title }}</h1>
<p>{{ article.text }}</p>
<p>{{ article.date.strftime('%Y-%m-%d') }}</p>
Этот шаблон выводит полную информацию о статье. После добавления новой статьи, перенаправим пользователя на страницу /posts в app.py:
return redirect(url_for('posts'))
Отображение данных из базы данных в Flask: вывод списка статей и подробной информации об отдельной статье. В последующих уроках будет реализован функционал редактирования и удаления статей.