Задача 1. Добавление новой книги
В лекции мы подключили endpoint, который показывает форму добавления книги. Сделайте так, чтобы она заработала: пусть отправка формы создаёт новую запись в базе данных.
Запустив (попытался запустить) изначальную программу, у меня выскочила ошибка - syntax error при создании таблицы в базе данных. Оказывается лишняя запятая:
Чтобы данное задание было выполнено нужно чтобы эта форма:
Могла сохранять в базу данных то, что мы напишем в полях для ввода. Первое что нужно сделать это добавить обработку метода POST. Выполняем проверку, если у нас сработал метод POST, то программа поймет что нужно отправить заполненные в форме данные для сохранения в БД и в случае успешного выполнения функции по добавлению книги в базу данных произошло перенаправление на эндпойнт со списком книг.
Ну и соответственно нужно импортировать все что не хватает для обработки данного эндпойнта:
Ну и написать функцию add_new_book:
Ну и результат работы:
Задача 2. Валидация формы
Форма из предыдущей задачи работает, но данные из неё никак не проверяем. Подключите библиотеки wtforms и flask_wtf, которые мы использовали в модуле 4, и с помощью них добавьте валидацию — поля должны быть заполнены.
Создаем новый класс, который будет наследником от FlaskForm, он уже и будет генерировать нашу форму.
Изменяем наш routes.py под данный класс, ну и немного подправил чтобы переменная передавалась в функцию только одна - кортеж с данными.
Соответственно подправил функцию внесения данных в БД:
Ну и вишенка на торте - подправить шаблон, в котором будет прописана форма:
Задача 3. Страница книг автора
В практике №2 мы добавили endpoint, который принимает на вход имя автора, а возвращает все его книги. Обновите для него визуальную часть, пусть он тоже использует шаблоны.
Ну вот что у меня нарисовалось в решении данной задачи. Эндпойнт:
Перед написанием данного эндпойнта, я создал еще один класс формы который будет генерить лишь одно поле для ввода - ввод имени автора:
Ну и пройдя по данном эндпойнту в браузере мы получим вот такую строку запроса:
Отрисовкой данной формы занимается файл author.html который мы получаем если просто обращаемся к эндпойнту:
После ввода фамилии или имени автора книги мы получим POST запрос, который обрабатывается этим же эндпойнтом но уже обрабатывается другой веткой условия. И мы перемещаемся к запросу к базе данных через функцию search(author) в аргументе которой указывается то самое имя или фамилия автора что мы ввели в строке выше...
В моей базе данных немного книг, но если сделать поиск по имени "Михаил" то он выдаст и Михаила Булгакова и Михаила Лермонтова.
Найденные книги выводятся с помощью файла find_book.html в который передается переменная books наполненная списком книг, полученных при обращении к базе данных, либо надпись:
Если такого автора (или похожего) не найдется в базе данных.
Задача 4. Счётчик просмотров книг
Давайте немного расширим информацию о книгах в нашей базе: хочется знать, какая книга самая популярная.
Добавьте:
Страницу /books/id.
Здесь будет основная информация о книге с указанным ID.
Новое поле — счётчик просмотров.
Оно должно увеличиваться на один каждый раз, когда мы показываем запись о книге на сайте. Количество просмотров должно отображаться.
Счётчик просмотров книги увеличивается как при показе её в списке, так и на отдельной странице.
Счётчик просмотров является отдельным полем в БД у модели книги.
Информация о просмотрах отображается на страницах /books и books/id.
Для решения данной задачи, в базе данных создаю новую таблицу "about", связанную с таблицей table_books по первичному ключу связью один к одному (у одной книги может быть только одно описание и количество просмотров).
Создать таблицу со связью один к одному можно посредством вот такого кода:
И вот как это выглядит в DBEaver:
В новой таблице я добавил немного данных, описание, просмотры:
Которые в последствии и буду выводить на страницу about.html
Хотя, по большому счету, нужно было создать новую таблицу взамен table_books, с дополнительной колонкой, в которую будут записываться просмотры каждой конкретной книги. Было бы проще вытаскивать данные. Но, может в будущем, это пригодится.
Вот кажется и все, дальше дело за шаблонами index.html и about.html
Вывод, главная страница:
Как можно заметить не все поля таблицы about заполнены и поэтому некоторые поля колонки views пустые. Но там где есть данные - можно перейти по ссылке под id.
Вот такое получилось домашнее задание.
Ну и что-то вроде послесловия. Данные публикации я делаю в первую очередь для себя, ибо потом вспомнить то что ты когда-то делал открыв свой собственный конспект проще чем снова рыться на просторах интернета. А если кому-то еще это поможет - не забудьте поблагодарить! Это важно. Лайка вполне достаточно.
Ну и