Обратная
связь

1.6 Модели

архитектура базы данных django

Мы еще не взаимодействовали с базой данных, но сейчас исправим это. В файле 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" означает, что полю будет присвоено одно значение только в момент создания записи.

Когда описание таблицы готово, запустим команду для создания миграции:

python manage.py makemigrations

Эта команда создаст файл миграции 0001_initial.py в папке migrations.

Django формирует SQL-запросы к базе данных для создания таблиц. При этом автоматически создается поле "id" в качестве идентификатора. Применим миграции к базе данных:

python manage.py migrate

Теперь мы создали базу данных с таблицей под названием "news"! Давайте добавим запись и отобразим ее в браузере.

Для создания записи в базе данных нам нужно войти в панель администратора. Чтобы это сделать, вначале нужно создать суперпользователя. В виртуальном окружении введем команду:

python manage.py createsuperuser

Из prompt следует ввести логин, пароль и адрес электронной почты.

Чтобы зарегистрировать модель в панели управления, перейдем в файл admin.py нашего приложения:

from django.contrib import admin
from news import models

@admin.register(models.News)
class NewsAdmin(admin.ModelAdmin):
    list_display = ['title', 'content']

Теперь, введя в браузере адрес 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.