Часть восьмая. Настройка базы данных
Базовая работа с базами данных
Цель: Создать и настроить базы данных
Задачи:
Создание файла сборки базы данных
Создание базы данных
Миграция баз данных
Отображение баз данных в динамическом режиме
Создание шаблона сборки базы данных
Статьи, которые выведены на сайте созданы при помощи ручного кодирования. Нам необходимо сделать так, чтобы статья формировалась сама из базы данных, которую сейчас мы создадим и настроим.
Откроем файл models.py. Мы делаем базу данных только для приложения blog, а это значит, что и работать будем из директории приложения.
Сейчас этот файл выглядит так:
Напишем небольшой код:
Построчно разберёмся в коде. Первая строка – импорт модели базы данных мы не меняем. Вторая строка и вторая библиотека, которая нам понадобится – timezon
. Мы будем делать вывод текущих даты и времени после написания статьи. Последняя библиотека, которая нам нужна – User
. Она нужна для того, чтобы из таблички пользователей взять авторов и поместить её в новую таблицу. С библиотеками закончили. Теперь – сам класс New.
Таблица, которую мы можем увидеть в панели администратора (см. предыдущий урок) – это класс со значениями. Нам нужно сделать таблицу с четырьмя столбцами – заголовок статьи (title
), текст статьи (text
), дата публикации (data
) и автор статьи (author
). Автором может быть только тот пользователь, который есть в таблице Users
.
Каждый столбец принимает отдельный тип данных. В столбце title
мы будем принимать текст, максимальная длина которого – 100 символов (models.CharField(max_length=100)
). То есть, мы обращаемся к библиотеке models
, из неё берём объект CharField
(ввод строки) и выставляем это поле на максимальную длину на 100 символов (max_length=100
). В столбце text
мы берём текстовое поле без ограничений в размере. Текст – html-текст. В data
мы поместим дату публикации. Для этого мы вводим поле даты (DateTimeField
) и выставляем значением по умолчанию текущую дату и время в часовой зоне пользователя (Django способен определять зону по IP-адресу и синхронизировать время с зоной). Последний столбец – автор публикации (author
). Так как, пользователи уже созданы и находятся в таблице Users
, нам не требуется заново их вводить, а нужно лишь обратиться за ключом (в каждой таблице элемент называется ключом) и вывести его. Для этого обратимся к ForeignKey
. Запросим таблицу с данными – User
. Если же пользователь с сайта будет удалён, мы можем вывести вместо его имени что-то (например, фразу "User deleted") или же мы можем удалить эту запись совсем. Я выбрал удаление записи, так как оно сложнее в написании и будет этот метод выглядеть так: on_delete=models.CASCADE
. Если же на нужно оставить запись и вывести фразу, то делается это так: on_delete='User deleted'
. Как вы видите, ничего сложного.
Теперь выполним миграцию. Введём знакомую команду:
Диалог сообщает нам о создании новой модели New:
Откроем в нашем приложении папку миграций: C:\Users\Valery\PycharmProjects\MySite\blog\migrations
В папке мы можем увидеть созданный нами файл – 0001_initial.py
. Заглянем внутрь файла:
Файл создан Django автоматически. В классе миграции обратите внимание на список operations. Мы задали имя новой таблице и в неё ввели все данные (title, text, data, author). Плюс к этому, перед всеми элементами списка был автоматически создан элемент id. На каждом сайте все элементы должны иметь свой уникальный номер в вёрстке (id). Этот элемент создаётся Django автоматически.
Создание базы данных
Нужно понимать, что файл с расширением .py не является базой данных. Базы данных хранятся в sql-файлах. Исправим же это.
Запустим ещё пару команд:
Первой командой мы запустили процесс сборки sql-файла из файла 0001_initial.py
. Второй командой выполнили полную миграцию баз данных.
Диалоги:
Запустим сервер и проверим результат:
Как мы видим, в панели администратора ничего нет. Исправим это перейдя в файл admin.py
В нём нет ничего нужного нам для вывода:
Исправим это:
Из файла models.py мы запросили класс New и зарегистрировали его на сайте одной командой.
Проверка:
Всё работает. Обратите внимание, к каждому классу добавляется автоматически буква "s" в конце.
Добавление записей
Создадим несколько статей. Нажмём на News и в верхнем правом углу нажмём кнопку «ADD NEW»
Введём любые данные в поля и сохраним результат. Я ввёл 3 примера статей:
Динамический вывод базы данных
Теперь мы можем удалять/добавлять/изменять статьи в графическом режиме из панели администратора. Но на сайте мы видим следующую картину:
Исправим это. Зайдём в файл, который передаёт все данные на html-страницы (views.py). Мы увидим следующую картину статических данных (news):
Исправим все данные в этом файле:
Единственные 2 пункта, которые нужно поменять:
Импорт New
Передача всех объектов в файле New (
'news': New.objects.all(),
)
Проверка:
Почти победа, но исчезла дата публикации. Исправим. В файле home.py мы назвали переменную передачу даты – date, а в базе данных – data. Изменим 1 букву и получим:
Единственный момент, который сейчас не удобен и выглядит странно – дата. Во-первых, оно выглядит не красиво и во-вторых, на английском языке.
Подредактируем файл home.html, а конкретно строку:
Исправим это на:
Все ключи я брал из документации Django – https://docs.djangoproject.com/en/3.0/ref/templates/builtins/#date
Результат:
Последний штрих – изменим американский «May» на русский «Май». Переходим в файл настройки всего проекта (setting.py) и найдём строку:
Заменим её на:
Результат:
Мало того, что мы изменили язык на сайте, мы ещё и перевели его панель администратора:
Last updated