Мы еще не взаимодействовали с базой данных, но сейчас исправим это. В файле models.py будут содержаться инструкции для создания таблиц в базе данных. Каждый класс будет представлять отдельную таблицу в базе данных. Создадим таблицу в файле news/models.py:
class News(models.Model): title = models.CharField(max_length=255, verbose_name="заголовок") content = models.TextField(blank=True) pub_date = models.DateTimeField(auto_now_add=True)
Мы импортировали модуль "models" из django.db и унаследовали класс "Model".
Каждая строка в классе отвечает за создание столбца в таблице базы данных с определенными свойствами:
- Поле "title" будет содержать символы с максимальной длиной в 255 символов. Для более читаемого отображения добавлено свойство "verbose_name".
- Поле "content" будет текстовым. Свойство "blank=True" означает, что поле может быть пустым.
- Поле "pub_date" будет полем даты создания. Свойство "auto_now_add=True" означает, что полю будет присвоено одно значение только в момент создания записи.
Когда описание таблицы готово, запустим команду для создания миграции:
|
Эта команда создаст файл миграции 0001_initial.py в папке migrations.
Django формирует SQL-запросы к базе данных для создания таблиц. При этом автоматически создается поле "id" в качестве идентификатора. Применим миграции к базе данных:
|
Теперь мы создали базу данных с таблицей под названием "news"! Давайте добавим запись и отобразим ее в браузере.
Для создания записи в базе данных нам нужно войти в панель администратора. Чтобы это сделать, вначале нужно создать суперпользователя. В виртуальном окружении введем команду:
|
Из prompt следует ввести логин, пароль и адрес электронной почты.
Чтобы зарегистрировать модель в панели управления, перейдем в файл admin.py нашего приложения:
|
Теперь, введя в браузере адрес http://127.0.0.1:8000/admin/, и введя логин и пароль, которые мы использовали при создании суперпользователя, в административной панели появится категория "News". Давайте создадим новую запись.
Чтобы отобразить изменения на странице http://127.0.0.1:8000/news/, немного поправим файл news/views.py:
from django.views.generic import ListView from news import models class NewsView(ListView): model = models.News template_name = 'news.html'
Мы унаследовали класс "ListView" вместо "TemplateView", объявили модель, связанную с этим представлением, и указали имя и путь к шаблону.
Откроем файл news.html и добавим следующий код:
html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {% for news_item in news_list %} <p>{{ news_item.title }}</p> <p>{{ news_item.pub_date }}</p> <p>{{ news_item.content }}</p> {% endfor %} </body> </html> |
Мы не будет разбирать html код, сейчас нас интересует шаблонизатор django, а именно строки
{% for list in news_list %} <p>{{ list.title }}</p> <p>{{ list.pub_date }}</p> <p>{{ list.content }}</p> {% endfor %} |
Учитывая, что в файле views.py мы наследуемся от класса ListView, мы можем обращаться к списку новостей (news_list) в нашем шаблоне. Единственным способом вывести его содержимое является использование цикла "for". Внутри цикла мы уже используем переменную "list" для вывода каждого поля одной новости. Теперь давайте перейдем на страницу http://127.0.0.1:8000/news/.
Теперь наше приложение стало немного сложнее: оно получает данные из базы данных и отображает их с помощью шаблонизатора Django.