Найти тему
Computer Pro

MVC, язык шаблонов

Оглавление

Задача 1. Добавление новой книги

В лекции мы подключили endpoint, который показывает форму добавления книги. Сделайте так, чтобы она заработала: пусть отправка формы создаёт новую запись в базе данных.

Запустив (попытался запустить) изначальную программу, у меня выскочила ошибка - syntax error при создании таблицы в базе данных. Оказывается лишняя запятая:

собственно этот код работает только один раз (если таблица не создана)
собственно этот код работает только один раз (если таблица не создана)

Чтобы данное задание было выполнено нужно чтобы эта форма:

-3

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

-4

Ну и соответственно нужно импортировать все что не хватает для обработки данного эндпойнта:

request кажется уже был...
request кажется уже был...

Ну и написать функцию add_new_book:

-6

Ну и результат работы:

Добавлены две новые книги...
Добавлены две новые книги...

Задача 2. Валидация формы

Форма из предыдущей задачи работает, но данные из неё никак не проверяем. Подключите библиотеки wtforms и flask_wtf, которые мы использовали в модуле 4, и с помощью них добавьте валидацию — поля должны быть заполнены.

-8

Создаем новый класс, который будет наследником от FlaskForm, он уже и будет генерировать нашу форму.

Изменяем наш routes.py под данный класс, ну и немного подправил чтобы переменная передавалась в функцию только одна - кортеж с данными.

переменная data содержит кортеж вида (title, author). Не забываем про WTF_CSRF_ENABLED!!!
переменная data содержит кортеж вида (title, author). Не забываем про WTF_CSRF_ENABLED!!!

Соответственно подправил функцию внесения данных в БД:

-10

Ну и вишенка на торте - подправить шаблон, в котором будет прописана форма:

-11

Задача 3. Страница книг автора

В практике №2 мы добавили endpoint, который принимает на вход имя автора, а возвращает все его книги. Обновите для него визуальную часть, пусть он тоже использует шаблоны.

Ну вот что у меня нарисовалось в решении данной задачи. Эндпойнт:

-12

Перед написанием данного эндпойнта, я создал еще один класс формы который будет генерить лишь одно поле для ввода - ввод имени автора:

-13

Ну и пройдя по данном эндпойнту в браузере мы получим вот такую строку запроса:

-14

Отрисовкой данной формы занимается файл author.html который мы получаем если просто обращаемся к эндпойнту:

-15

После ввода фамилии или имени автора книги мы получим POST запрос, который обрабатывается этим же эндпойнтом но уже обрабатывается другой веткой условия. И мы перемещаемся к запросу к базе данных через функцию search(author) в аргументе которой указывается то самое имя или фамилия автора что мы ввели в строке выше...

-16

В моей базе данных немного книг, но если сделать поиск по имени "Михаил" то он выдаст и Михаила Булгакова и Михаила Лермонтова.

-17
-18
-19

Найденные книги выводятся с помощью файла find_book.html в который передается переменная books наполненная списком книг, полученных при обращении к базе данных, либо надпись:

-20

Если такого автора (или похожего) не найдется в базе данных.

Задача 4. Счётчик просмотров книг

Давайте немного расширим информацию о книгах в нашей базе: хочется знать, какая книга самая популярная.
Добавьте:
Страницу /books/id.
Здесь будет основная информация о книге с указанным ID.
Новое поле — счётчик просмотров. 
Оно должно увеличиваться на один каждый раз, когда мы показываем запись о книге на сайте. Количество просмотров должно отображаться.
Счётчик просмотров книги увеличивается как при показе её в списке, так и на отдельной странице.
Счётчик просмотров является отдельным полем в БД у модели книги.
Информация о просмотрах отображается на страницах /books и books/id.

Для решения данной задачи, в базе данных создаю новую таблицу "about", связанную с таблицей table_books по первичному ключу связью один к одному (у одной книги может быть только одно описание и количество просмотров).

Создать таблицу со связью один к одному можно посредством вот такого кода:

-21

И вот как это выглядит в DBEaver:

-22

В новой таблице я добавил немного данных, описание, просмотры:

-23

Которые в последствии и буду выводить на страницу about.html

Хотя, по большому счету, нужно было создать новую таблицу взамен table_books, с дополнительной колонкой, в которую будут записываться просмотры каждой конкретной книги. Было бы проще вытаскивать данные. Но, может в будущем, это пригодится.

Чтобы информация о просмотрах отображалась на главной странице, пришлось добавить доп. вызов функции, она ниже...
Чтобы информация о просмотрах отображалась на главной странице, пришлось добавить доп. вызов функции, она ниже...
-25
Здесь, помимо создания таблицы, если ее нет происходит получение дополнительных данных о книге и обновление счетчика посещения страницы данной книги.
Здесь, помимо создания таблицы, если ее нет происходит получение дополнительных данных о книге и обновление счетчика посещения страницы данной книги.
вызов эндпойнта с id интересующей нас книги
вызов эндпойнта с id интересующей нас книги

Вот кажется и все, дальше дело за шаблонами index.html и about.html

-28
index.html
index.html
about.html
about.html

Вывод, главная страница:

По цифрам id можно перейти на страницу книги. Можно было и по другим полям настроить переход но я не стал заморачиваться.
По цифрам id можно перейти на страницу книги. Можно было и по другим полям настроить переход но я не стал заморачиваться.

Как можно заметить не все поля таблицы about заполнены и поэтому некоторые поля колонки views пустые. Но там где есть данные - можно перейти по ссылке под id.

-32

Вот такое получилось домашнее задание.

Ну и что-то вроде послесловия. Данные публикации я делаю в первую очередь для себя, ибо потом вспомнить то что ты когда-то делал открыв свой собственный конспект проще чем снова рыться на просторах интернета. А если кому-то еще это поможет - не забудьте поблагодарить! Это важно. Лайка вполне достаточно.

Ну и

-33