Настройка проекта django, базы данных и управление с помощью Django Admin

Здравствуйте, добро пожаловать в первую часть этого учебника-курса, в котором вы изучите и поймете основы Django, создав клон популярного сайта Netflix.
Учебник разделен на 5 частей следующим образом:

  1. Часть 1: Настройка проекта, создание базы данных и управление ею с помощью Django Admin.
  2. Часть 2: Добавление функций аутентификации.
  3. Часть 3: Добавление основных функций Netflix (список, поиск, фильтр, просмотр фильмов).
  4. Часть 4: Юнит-тестирование вашего Django проекта.
  5. Часть 5: Разверните свой клон Netflix на Netlify (и добавьте его в свое портфолио 😌😉).

Этот учебник предполагает, что у вас есть хотя бы базовые знания:

  • язык программирования Python3
  • Linux
  • Html и CSS
  • Mysql.

Презентация Django

Django — один из самых популярных фреймворков для создания полнофункциональных веб-сайтов, а также API. Он следует архитектуре MVT (модель, представления и шаблон).

  • Что такое модели: Модели — это объектные представления нашей базы данных на языке python. Например, класс User представляет таблицу пользователей в нашей базе данных, а экземпляр этого класса User является записью в таблице users. Тогда каждый атрибут класса User — это столбец таблицы users*, а значение каждого атрибута для конкретного экземпляра класса User — это значение столбца, связанного с этим атрибутом. Не волнуйтесь, если сейчас это звучит странно, вы поймете это лучше в глубине до конца этого урока, когда мы будем играть с моделями.

  • Что такое шаблоны: Проще говоря, шаблоны — это то, что видят конечные пользователи (интерфейс, созданный с помощью HTML и CSS, кнопки, изображения, текст, анимация и т.д.).

  • Что такое представления: Представления — это слушатели действий пользователей над шаблонами. Действие пользователя может вызвать запрос к представлению. Представление будет выполнять операции, связанные с обработкой запросов пользователя, при необходимости оно будет взаимодействовать с базой данных (со всеми моделями) и возвращать ответ пользователю, если это необходимо. Ответом может быть другой шаблон или html-страница, или Json-ответ, или даже другой тип ответа.

  • Кроме того, для начинающих важно знать, что проект Django делится на небольшие многократно используемые части (модули python), называемые приложениями.

Установка Django

Чтобы установить Django на вашу систему, я советую вам:

  1. работать в виртуальном окружении или в рабочем пространстве conda. Но сначала убедитесь, что python установлен на вашем компьютере.

  2. Создайте файл requirements.txt, который будет содержать список библиотек python и их версии, необходимые нашему проекту для нормальной работы на любом компьютере. Пока нам нужен только Django, поэтому наш requirements.txt будет содержать всего одну строку, как показано ниже:

Django==4.0.2
Войти в полноэкранный режим Выйти из полноэкранного режима

На момент написания этой статьи последней стабильной версией Django является 4.0.2.

  1. Затем запустите pip install -r requirements.txt или python -m pip install requirements.txt (или это также может быть python3 вместо просто python или pip3 вместо pip). Это позволит установить все перечисленные в файле пакеты с указанными версиями.

Создание проекта Django

Давайте используем django_netflix_clone для названия проекта. (Я использовал подчеркивание, потому что это улучшает читабельность.

  • Затем выполните: django-admin startproject django_netflix_clone.

Примечание: django-admin — это утилита командной строки Django. Она используется для обычных операций на этапе разработки Django, как мы увидим далее.

Будет создана новая папка с именем django_netflix_clone.
Я советую вам переместить файл requirements.txt в папку django_netflix_clone, чтобы он оказался внутри проекта.

  • Запустите: mv requirements.txt django_netflix_clone.

Архитектура проекта django_netflix_clone должна выглядеть следующим образом:

Вы заметите, что Django создал несколько файлов и папку по умолчанию с тем же именем, что и проект django_netflix_clone.
В корне проекта у нас должно быть следующее:

  • файл manage.py: это файл-помощник Python, используемый для выполнения команд, связанных с проектом. Мы увидим его применение по ходу дела.

  • папка django_netflix_clone. Мы говорили, что проект Django состоит из приложений. Эта папка является папкой по умолчанию app, автоматически создаваемой Django. Она также содержит некоторые автоматически создаваемые файлы. Давайте немного объясним их:

  • wsgi.py (Web Server Gateway Interface): Когда вы хотите развернуть ваш Django на реальном сервере, этот файл используется в качестве точки входа, чтобы позволить серверу приложений подключиться к вашему проекту Django.

  • asgi.py (Asynchronous Server Gateway Interface): Проще говоря, он играет ту же роль, что и wsgi.py, но предназначен для асинхронных веб-серверов и приложений. Поэтому он используется вместо wsgi.py, когда ваш проект поддерживает асинхронные задачи.

  • settings.py: Это файл конфигурации проекта. В нем определяются все настройки приложений и проектов.
    Здесь находятся важные настройки:

Остальные настройки мы объясним по ходу дела.

  • urls.py: Этот файл описывает все пути, которые могут быть доступны в проекте. По умолчанию он содержит один путь (admin):
urlpatterns = [
    path('admin/', admin.site.urls),
]
Войти в полноэкранный режим Выйти из полноэкранного режима

На этом шаге мы можем сказать, что разрешенными URL-адресами в нашем приложении являются http://my_project_url и http://my_project_url/admin/.

Затем войдите в проект:

  • cd django_netflix_clone
  • Откройте проект в редакторе кода (я использую VSCode или visual studio code)code .

Создаем наше рабочее приложение

Приложение по умолчанию должно быть централизованным. Давайте создадим еще одно приложение с именем netflix для работы с нашими функциями Netflix.

  • В VS code откройте новый терминал, нажав Terminal -> New terminal из меню верхней горизонтальной панели. Это должно открыть терминал в корневом каталоге проекта.
  • Затем введите эту команду: django-admin startapp netflix. Будет создана новая папка с именем netflix:

  • откройте файл settings.py и добавьте приложение netflix в параметр INSTALLED_APPS, как описано выше:Это зарегистрирует наше приложение netflix в проекте. Без этого приложение будет создано, но не привязано к проекту.

Мы не будем сейчас объяснять все файлы и папки, созданные в папке netflix app. Давайте просто объясним views.py и models.py:

  • views.py: это файл, который будет содержать наши представления, описанные вверху. Каждое представление — это класс, и мы подробно рассмотрим их позже в курсе.
  • models.py: Это файл, который содержит наши модели. Как описано выше, в Django наша база данных представлена классами Django.

Проектирование нашей базы данных

Мы создали наш проект и добавили наше главное приложение. Теперь давайте спроектируем нашу базу данных в соответствии с нашими возможностями. Помните, что каждая модель — это класс python и наследуется от внутреннего класса Django django.db.models.Model.

  • Откройте файл models.py, который находится в директории netflix.

  • У нас есть пользователи, которые будут регистрироваться и смотреть фильмы. По умолчанию в Django есть то, что мы называем contribs, которые являются готовыми модулями для облегчения нашей работы. Из этих контрибсов у нас есть модель по умолчанию User. Вы можете настроить модель Django User по умолчанию, как описано здесь. Но в этом руководстве мы просто будем использовать модель по умолчанию.

Модели фильмов

  • У нас будут фильмы для просмотра. Давайте создадим класс модели для представления фильма.
class Movie(models.Model):
    """Movie model class."""

Вход в полноэкранный режим Выход из полноэкранного режима

Это означает, что в нашей базе данных будет таблица с именем Movie.

У каждого фильма будет свое имя, давайте добавим его:

CHARS_MAX_LENGTH: int = 150

class Movie(models.Model):
    """Movie model class."""

    name = models.CharField(max_length=CHARS_MAX_LENGTH, blank=True)
Войти в полноэкранный режим Выйти из полноэкранного режима

Колонка name должна быть строкой, поэтому мы использовали поле модели Django под названием CharField. Мы решили ограничить длину имени до 150 символов.
В строке CHARS_MAX_LENGTH: int = 150 мы определяем константу, чтобы избежать использования магических чисел в нашем коде, который мы будем использовать.
Строкой name = models.CharField(max_length=CHARS_MAX_LENGTH, blank=True). мы просим Django добавить колонку с именем name в нашу таблицу movies и каждая запись фильма не должна иметь имя более 150 символов. blank=True означает, что, когда мы хотим создать или изменить запись фильма, нам не нужно указывать значение name. Более подробно вы поймете это ниже.

  • Каждый фильм может иметь описание, давайте добавим его с помощью этой строки:

description = models.TextField(blank=True, null=True)

Для этого мы используем TextField вместо CharField, поскольку длина описания не предсказуема, а мы знаем, что названия фильмов не такие длинные.
Примечание null=True означает, что мы можем создать фильм без указания значения для описания. Если null=True не было указано, как для name, попытка создать фильм без указания description вызовет исключение.
Нам может понадобиться сохранить дату создания фильма, пусть так и будет:

Мы использовали DateTimeField, потому что это дата, и мы установили атрибут auto_now_add в True, так что дата создания будет автоматически установлена Django во время создания объекта.

Теперь наш models.py должен выглядеть следующим образом:

from django.utils import timezone
from django.db import models


class Movie(models.Model):
    """Movie model class."""

    name = models.CharField(max_length=CHARS_MAX_LENGTH, blank=True)
    description = models.TextField(blank=True, null=True)
    date_created = models.DateTimeField(default=timezone.now)
Вход в полноэкранный режим Выход из полноэкранного режима
  • Каждый фильм должен иметь только одну категорию. Лучше хранить категории в базе данных, чтобы мы могли управлять ими. Давайте создадим модель Category перед моделью Movie с name и description (дата создания категории не очень полезна):
class Category(models.Model):
    """Category model class."""

    name = models.CharField(max_length=CHARS_MAX_LENGTH, blank=True)
    description = models.TextField(blank=True, null=True)
Войти в полноэкранный режим Выход из полноэкранного режима
  • В этом учебнике мы будем считать, что фильм должен принадлежать к одной и только одной категории. Это определяет то, что мы называем отношением OneToMany. В Django оно представлено django.db.models.ForeignKey. Давайте добавим его:category = models.ForeignKey(
    Категория,
    models.CASCADE
    )
    .

Атрибут models.CASCADE означает, что если категория удаляется, то все ее фильмы должны быть удалены, чтобы избежать некорректных значений данных (например, наличие фильма с несуществующей категорией).

Теперь ваш код должен выглядеть следующим образом:

class Movie(models.Model):
    """Movie model class."""

    name = models.CharField(max_length=CHARS_MAX_LENGTH, blank=True)
    description = models.TextField(blank=True, null=True)
    category = models.ForeignKey(Category, on_delete=models.CASCADE)  # <----------- Add this line
    date_created = models.DateTimeField(auto_now_add=True)
Вход в полноэкранный режим Выход из полноэкранного режима
  • Каждый фильм будет иметь один или несколько тегов. Лучше хранить теги также в базе данных. Давайте создадим модель Tag перед моделью Movie с name и description (дата создания категории не очень полезна):
class Tag(models.Model):
    """Tag model class."""

    name = models.CharField(max_length=CHARS_MAX_LENGTH, blank=True)
    description = models.TextField(blank=True, null=True)
Вход в полноэкранный режим Выход из полноэкранного режима
  • В этом учебнике мы предположим, что фильм может иметь много тегов, а тег может быть связан с множеством категорий. Это определяет то, что мы называем отношением ManyToMany. В django оно представлено django.db.models.ManyToManyField. Давайте добавим его:tags = models.ManyToManyField(Tag).Ваш код должен выглядеть следующим образом:
class Movie(models.Model):
    """Movie model class."""

    name = models.CharField(max_length=CHARS_MAX_LENGTH, blank=True)
    description = models.TextField(blank=True, null=True)
    category = models.ForeignKey(Category, on_delete=models.CASCADE)
    tags = models.ManyToManyField(Tag)  #  <--- Add this line
    date_created = models.DateTimeField(auto_now_add=True)
Вход в полноэкранный режим Выход из полноэкранного режима

Примечание: Атрибут models.CASCADE означает, что если тег удаляется, все связанные с ним фильмы также будут удалены, чтобы избежать некорректных значений данных (например, некоторые фильмы с несуществующим тегом).

  • Нам может понадобиться некоторая статистика о каждом фильме, например, количество людей, которые его посмотрели. Давайте добавим ее:

    Здесь, поскольку это число, мы использовали IntegerField, а default = 0 означает, что значение по умолчанию будет 0. И плюс, поскольку мы определили значение по умолчанию, даже если мы не предоставим этот атрибут, django не вызовет исключения, а установит атрибут в 0.

  • Естественно, нам нужно хранить видеофайл фильма. Для этого
    Вот и все. У нас есть вся минимальная информация для нашей базы данных.

Управление статическими файлами

Перед этим мы объясним, как Django управляет файлами. Django передает все файлы, связанные с сайтом (html, css, js, изображения), по значению параметра STATIC_URL в файле settings.py. Значение по умолчанию — /static/.

STATIC_URL = 'static/'
Вход в полноэкранный режим Выйти из полноэкранного режима

Вы можете изменить его на другое значение, но я рекомендую оставить его только в том случае, если у вас есть веская причина для его изменения.

Во время разработки Django рекомендует хранить эти файлы в папке с названием static внутри каждого приложения.

Управление медиафайлами

Теперь файлы, загружаемые в проекты (например, наши фильмы-видео), обслуживаются по значению параметра MEDIA_URL в settings.py. По умолчанию этого параметра нет, но его рекомендуемое значение /media/, поэтому мы должны добавить его (мы можем добавить его сразу после STATIC_URL):

MEDIA_URL = 'media/'
Вход в полноэкранный режим Выйти из полноэкранного режима

По умолчанию медиафайлы хранятся не в базе данных, а в папке, определенной настройками MEDIA_ROOT. Этой настройки также не было, поэтому мы должны определить ее.

import os # Add this at the top of the settings.py file
...
...
STATIC_URL = 'static/'
MEDIA_URL = 'media/' 
MEDIA_ROOT = os.path.join(BASE_DIR, 'media/') # Add this line too
Вход в полноэкранный режим Выход из полноэкранного режима

.
Это означает, что наши фильмы будут загружены в папку с именем media в корне каталога. Мы использовали os.path.join и BASE_DIR (определенный в верхней части файла), чтобы получить полный путь к папке в системе. Этой папки не существует, поэтому давайте создадим ее:
Убедитесь, что она находится в корне проекта и запустите:

  • Последняя часть для завершения настройки статических и медиа файлов — это добавление их значений в путь. Откройте файл urls.py следующим образом:
from django.contrib import admin
from django.urls import path
from django.conf import settings            # Add this line
from django.conf.urls.static import static  # Add this line

urlpatterns = [
    path('admin/', admin.site.urls),
]

# Add the lines below
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Войти в полноэкранный режим Выйти из полноэкранного режима

Мы закончили настройку статических и медиа файлов для нашего проекта.

Затем мы можем использовать django.db.models.FileField для хранения ссылки на наш фильм (медиа) следующим образом:

file = models.FileField(upload_to='movies/')
Вход в полноэкранный режим Выход из полноэкранного режима

.

  • И последнее, нам нужна картинка-превью для нашего фильма. Поскольку это картинка, используем django.db.models.ImageField вот так:
preview_image = models.ImageField(upload_to='preview_images/')
Вход в полноэкранный режим Выход из полноэкранного режима

.

Наш конечный файл класса Movie выглядит следующим образом:

class Movie(models.Model):
    """Movie model class."""

    name = models.CharField(max_length=CHARS_MAX_LENGTH, blank=True)
    description = models.TextField(blank=True, null=True)
    categories = models.ForeignKey(Category, on_delete=models.CASCADE)
    tags = models.ManyToManyField(Tag)
    watch_count = models.IntegerField(default=0)
    file = models.FileField(upload_to='movies/')
    preview_image = models.ImageField(upload_to='preview_images/')
    date_created = models.DateTimeField(default=timezone.now)

Войти в полноэкранный режим Выход из полноэкранного режима

Вот так

Миграции Django

Мы закончили настройку нашей базовой базы данных. Теперь нам нужно создать то, что мы называем миграции. Миграции — это файлы Python, содержащие определение и историю изменений в ваших моделях. Чтобы создать миграции, мы должны выполнить команду:

После выполнения команды мы должны получить эту ошибку:


Это потому, что модуль, необходимый для работы ImageField, еще не установлен в нашем окружении. Поэтому мы можем добавить его в наш файл requirements.txt следующим образом:

django==4.0.2
Pillow==9.0.1 # Add this line into requirements.txt
Войти в полноэкранный режим Выйти из полноэкранного режима

.
Затем снова запустите pip install -r requirements.txt (он установит только недостающие модули, в нашем случае pillow).

Затем запустите еще раз: python manage.py makemigrations.
Вы должны получить следующий результат:
.

Это создаст некоторые файлы (миграции) в папке migrations в модуле netflix. Эти файлы содержат описания наших моделей, которые будут использоваться для физического создания и/обновления нашей базы данных.

Перенос базы данных

Чтобы физически создать нашу базу данных, нам необходимо указать тип базы данных в настройках. Если вы откроете файл settings.py, вы увидите:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}
Войти в полноэкранный режим Выход из полноэкранного режима

'ENGINE': 'django.db.backends.sqlite3' означает, что наша база данных SQLite и 'NAME': BASE_DIR / 'db.sqlite3', имеет имя db.sqlite3 и должно находиться в корне проекта. Django поддерживает множество других бэкендов, таких как MysQL, которые мы рассмотрим в пятой части этого курса. На данный момент мы будем придерживаться настроек по умолчанию.

Теперь, когда мы видим, что наша база данных уже настроена, но понимаем, какие настройки ее обрабатывают, давайте заполним нашу базу данных db.sqlite3 нашими моделями в процессе миграции. Запустите python manage.py migrate. Вы увидите следующее сообщение:

Менеджер моделей

Каждая модель Django имеет нечто, называемое Manager, и по умолчанию она поставляется с именем objects. Он позволяет нам выполнять запросы к базе данных из нашей модели. Например, основные запросы к модели Movie могут быть следующими:

  • Создать фильм*: это достигается с помощью Movie.objects.create(name="Avatar").
  • Получить все фильмы*: достигается с помощью Movie.objects.all().
  • *Отфильтровать все фильмы, название которых начинается с заглавной буквы A **: достигается с помощью Movie.objects.filter(name__startswith="A").
  • Фильтровать все фильмы, название которых начинается с a, независимо от регистра (A или a)*: это достигается с помощью Movie.objects.filter(name__istartswith="a").Если для вас это все еще немного неясно, ничего страшного, все станет ясно после того, как вы научитесь играть с менеджером в следующем разделе.

Django Shell: играем с нашими данными

Чтобы быстро протестировать наши модели и менеджер, Django предоставляет очень полезный инструмент под названием Django Shell.

  • Откройте терминал на VSCode (по умолчанию он будет открыт в корне проекта).
  • Запустите: python manage.py shell. Появится новая командная строка.

  • Импортируйте наши модели: введите

from netflix.models import Category, Movie, Tag
Войти в полноэкранный режим Выйти из полноэкранного режима

и нажмите Enter.

  • Попробуем создать фильм с именем Dracula3: run
Movie.objects.create(name="Dracula")
Войти в полноэкранный режим Выйти из полноэкранного режима

У вас должна появиться ошибка, подобная этой:

sqlite3.IntegrityError: NOT NULL constraint failed: netflix_movie.category_id
Вход в полноэкранный режим Выйти из полноэкранного режима

И это нормально, потому что мы не можем создать фильм без категории. Помните, что фильм должен принадлежать только одной категории из-за отношения category = models.ForeignKey(Category, ....

Поэтому сначала нам нужно создать категорию. Давайте создадим категорию с именем tech. Выполните следующую команду:

tech_category = Category.objects.create(name="Tech")
Войти в полноэкранный режим Выйти из полноэкранного режима

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

  • Наберите в терминале tech_category и нажмите Enter, после чего должно появиться следующее:
>>> tech_category
<Category: Category object (1)>
Вход в полноэкранный режим Выход из полноэкранного режима

Обратите внимание, что Category object (1) — это имя по умолчанию, используемое python для отображения экземпляра объекта. Мы можем настроить имя, переопределив метод __str__ нашего класса models.
Для модели Category мы можем вернуть имя категории следующим образом:

class Category(models.Model):
    ...
    # Add the function below
    def __str__(self):
        return self.name
Войти в полноэкранный режим Выйти из полноэкранного режима

Мы можем вернуть также имя для моделей Category и Tag.

class Movie(models.Model):
    ...
    # Add this function
    def __str__(self):
        return self.name
Войти в полноэкранный режим Выход из полноэкранного режима
class Tag(models.Model):
    ...
    # Add this function
    def __str__(self):
        return self.name
Войти в полноэкранный режим Выход из полноэкранного режима
  • Теперь закройте оболочку django shell, выполнив команду exit() и снова откройте ее командой python manage.py shell.

  • Давайте снова импортируем наши модели

>>> from netflix.models import Category, Tag, Movie
>>> 
Вход в полноэкранный режим Выход из полноэкранного режима
  • Давайте восстановим нашу категорию. Для этого у нас есть несколько способов:
    • вы можете запустить
tech_category = Category.objects.get(name="Tech")
Войти в полноэкранный режим Выйти из полноэкранного режима

Здесь мы сделали прямой доступ. Особенность в том, что если есть категория с именем Tech, то будет выброшено исключение. Для проверки выполните следующие действия

Category.objects.get(name="NonExistentName")
Войдите в полноэкранный режим Выйдите из полноэкранного режима

Вы получите следующее:

>>> Category.objects.get(name="NonExistentName")
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/home/horacefayomi/.local/lib/python3.10/site-packages/django/db/models/manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/home/horacefayomi/.local/lib/python3.10/site-packages/django/db/models/query.py", line 650, in get
    raise self.model.DoesNotExist(
netflix.models.Category.DoesNotExist: Category matching query does not exist.
Войти в полноэкранный режим Выйти из полноэкранного режима
- you can also access the object by it primary key, which is even better than using any other keys
Войти в полноэкранный режим Выйти из полноэкранного режима
tech_category = Category.objects.get(pk=1)
Войти в полноэкранный режим Выход из полноэкранного режима
- you can access the category using `filter` method that we saw in previous point:
Войти в полноэкранный режим Выход из полноэкранного режима
tech_category = Category.objects.filter(name="Tech").first()
Войти в полноэкранный режим Выход из полноэкранного режима

Обратите внимание, что Category.objects.filter(name="Tech") возвращает массив соответствующих категорий.
Вы можете проверить это, выполнив

>>> Category.objects.filter(name="Tech")
<QuerySet [<Category: Tech>]>
Вход в полноэкранный режим Выйти из полноэкранного режима

Затем цепочка с .first() возвращает первый элемент списка.

Теперь вы заметили, что теперь категория отображается следующим образом

<Category: Tech>
Вход в полноэкранный режим Выход из полноэкранного режима

вместо

<Category: Category object (1)>
Войти в полноэкранный режим Выход из полноэкранного режима

Это означает, что наши методы __str__ работают хорошо ^_^.

Затем мы создали наш первый экземпляр категории.

  • Если в терминале набрать tech_category.pk и нажать Enter, то вы увидите:
>>> tech_category.pk
1
Вход в полноэкранный режим Выход из полноэкранного режима

Это означает, что значение первичного ключа нашего моля 1.
Это потому, что, как мы видели ранее, в Django базой данных по умолчанию является sqlite, а в sqlite, как и в большинстве других реляционных баз данных, первичный ключ по умолчанию является целым числом, автоматически генерируемым, начиная с 1.

  • Мы также можем проверить название категории в терминале, набрав tech_category.name. Вот что должно получиться:
>>> tech_category.name
'Tech'
Вход в полноэкранный режим Выйти из полноэкранного режима
  • Теперь мы должны быть в состоянии создать наш первый фильм:
movie = Movie.objects.create(name="Dracula", category=tech_category)
Войти в полноэкранный режим Выход из полноэкранного режима

Теперь мы можем проверить атрибуты нашего movie.

>>> movie = Movie.objects.create(name="Dracula", category=tech_category)
>>> movie.pk
1
>>> movie.name
'Dracula'
>>> movie.category
<Category: Tech>
>>> movie.date_created
datetime.datetime(2022, 11, 7, 16, 54, 11, 259483, tzinfo=datetime.timezone.utc)
Войти в полноэкранный режим Выход из полноэкранного режима

Отлично, наш первый фильм тоже создан.

  • Мы можем перечислить все текущие фильмы нашей базы данных для просмотра:
>>> Movie.objects.all()
<QuerySet [<Movie: Dracula>]>
Войти в полноэкранный режим Выход из полноэкранного режима
  • Мы также можем создать фильм другим способом.Выполнить
new_movie = Movie(name="Harry potter3")
Войти в полноэкранный режим Выйти из полноэкранного режима
  • установить категорию фильма
new_movie.category = tech_category
Войти в полноэкранный режим Выйти из полноэкранного режима

На этом шаге объект фильма создан, но фильм еще не сохранен в базе данных. Для его сохранения необходимо вызвать метод save() экземпляра модели

new_movie.save()
Вход в полноэкранный режим Выйти из полноэкранного режима

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

>>> Movie.objects.all()
<QuerySet [<Movie: Dracula>, <Movie: Harry potter3>]>
Войти в полноэкранный режим Выйти из полноэкранного режима

Приятно.

  • Вы можете проверить, что watch_count фильма new_movie равен 0.
>>> new_movie.watch_count
0
Вход в полноэкранный режим Выход из полноэкранного режима
  • Мы можем обновить счетчик до любого числа.
>>> new_movie.watch_count = 10
>>> new_movie.save()
>>>
Вход в полноэкранный режим Выход из полноэкранного режима

Теперь запущенный new_movie.watch_count должен отображать 10.

>>> new_movie.watch_count
10
Войти в полноэкранный режим Выйти из полноэкранного режима
  • Чтобы увидеть количество фильмов в базе данных, вы можете запустить Movie.objects.count() и он должен вывести 2:
>>> Movie.objects.count()
2
Вход в полноэкранный режим Выход из полноэкранного режима
  • Вы также можете удалить фильм, вызвав delete(). Давайте удалим new_movie:
>>> new_movie.delete()
(1, {'netflix.Movie': 1})
Вход в полноэкранный режим Выход из полноэкранного режима
  • Мы можем проверить, что счетчик теперь 1.
>>> Movie.objects.count()
1
Вход в полноэкранный режим Выход из полноэкранного режима

Надеюсь, вам понравилось работать с моделями в оболочке Django.
Мы только что изучили основные операции, которые вы будете использовать для работы с моделями. Мы увидим больше в следующих частях этого курса.

Django ORM

Модели Django — это абстракции классов, которые представляют нашу базу данных. Даже если мы выполняем операции, используя менеджер моделей по умолчанию (Movie.objects.create()) или на экземпляре модели new_movie.save(), все эти операции транслируются в фоновом режиме в SQL запросы с помощью Django ORM (Object-Relational Mapper). Django ORM — это просто питонический способ создания SQL запросов, манипулирования нашей базой данных и получения результатов в питонической манере. Потрясающе!!!

Регистрация администратора

Теперь, когда вы знаете, как манипулировать данными в оболочке, давайте посмотрим, как манипулировать ими через графический интерфейс.
Django позволяет нам легко администрировать нашу базу данных с помощью мощного инструмента под названием Django Admin. По сути, он предоставляет интерфейс администрирования, где мы можем легко перечислять, создавать, изменять, просматривать и удалять элементы нашей базы данных. А настроить функции администратора просто, как съесть пирожное.
Напомню, что именно вкладка 'django.contrib.admin' позволяет нам получить эту мощную возможность.

Откройте файл admin.py в папке netflix. И добавьте эти строки:

from netflix.models import Movie
from netflix.models import Category
from netflix.models import Tag

admin.site.register(Movie)
admin.site.register(Category)
admin.site.register(Tag)
Enter fullscreen mode Выйти из полноэкранного режима

Вот и все.

Примечание: Интерфейс администратора можно настраивать, но мы не будем рассматривать это в данном уроке.

Создание суперпользователя

Для управления админкой сайта нам необходимо создать суперпользователя. Это пользователь с достаточными привилегиями для доступа к интерфейсу администрирования. По умолчанию созданный пользователь не является суперпользователем. Мы углубимся в аутентификацию и роли Django в следующих частях этого обучающего курса.
Чтобы создать суперпользователя, запустите темринал porject в VScode:

The password is too similar to the username.
This password is too short. It must contain at least 8 characters.
This password is too common.
Bypass password validation and create a user anyway? [y/N]:
Войдите в полноэкранный режим Выйдите из полноэкранного режима

Нажмите Y и продолжайте, мы вернемся к этому в следующих частях курса.

Вот так.

Запустите сервер разработки и добавьте некоторые данные

Django поставляется с внутренним легким сервером разработки. Чтобы запустить его, откройте новый терминал в проекте внутри VScode, как обычно, и запустите:

Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
February 27, 2022 - 02:28:29
Django version 4.0.2, using settings 'django_netflix_clone.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
Войти в полноэкранный режим Выйти из полноэкранного режима

Это означает, что сервер запущен и доступен на хосте http://127.0.0.1:8000/. Вы можете указать свой собственный порт с помощью python manage.py runserver 0.0.0.0:<your_port>.

Войдите в интерфейс администратора и поиграйте с данными

  • Откройте ваш любимый браузер (я использую chrome).
  • Введите URL-адрес разработки, вы должны увидеть эту страницу

  • Откройте страницу администратора: перейдите по адресу http://127.0.0.1:8000/admin/ в браузере. Это выглядит следующим образом:


-Это страница входа в систему. Введите учетные данные суперпользователя (имя пользователя = «admin», пароль = «admin») и подтвердите форму.

  • Вы будете перенаправлены на приборную панель администратора, представленную ниже:

Мы вернемся позже к User и Group. Давайте поиграем с нашими Media, Category и Tag. Нажмите на Category и добавьте несколько категорий. Интерфейс интуитивно понятен. У вас есть кнопка Add в правом верхнем углу.

  • Добавьте теги с названиями Trending, Popular. Задайте нужное вам описание.

  • Добавьте категории с названиями Action , Adventure, Romance, Thriller.

  • Добавить фильм Человек-паук: Нет пути домой:
    • Добавьте Spider-Man: No Way Home для названия и описания.
    • Выберите категорию
    • Выберите теги (Чтобы выбрать несколько тегов, поскольку фильм может иметь несколько тегов, удерживайте кнопку нажатой и выбирайте теги правой кнопкой мыши).
    • Скачайте изображение из интернета на свой компьютер и добавьте его в поле preview-image.

В настоящее время страница с фильмом выглядит следующим образом:

Мы можем немного подправить Django admin, чтобы позволить суперпользователям видеть preview_image и description фильма.

  • Откройте файл admin.py.
  • Удалите строку admin.site.register(Movie) и добавьте этот код:
from django.utils.html import format_html # Add this line
...
...
# add the lines below
class MovieAdmin(admin.ModelAdmin):

    def preview(self, movie):
        """Render preview image as html image."""

        return format_html(
            f'<img style="height: 200px" src="/media/{movie.preview_image}" />'
        )

    def video(self, movie):
        """Render movie video as html image."""

        return format_html(
            '''
            <video width="320" height="240" controls>
                <source src="%s" type="video/mp4">
                Your browser does not support the video tag.
            </video>''' % movie.file
        )

    preview.short_description = 'Movie image'
    video.short_description = 'Movie video'
    list_display = ['name', 'preview', 'video', 'description']

admin.site.register(Movie, MovieAdmin)
Вход в полноэкранный режим Выйти из полноэкранного режима
  • Мы использовали класс Django django.contrib.admin.ModelAdmin для настройки того, как будет отображаться наш фильм. Мы использовали django formatter django.utils.html.format_html для рендеринга preview_image и file видео как HTML.
  • С помощью list_display = ['name', 'preview', 'video', 'description'] мы просим django отобразить вычисленные preview и video, а также атрибуты name и description каждой записи Movie из базы данных.

И вот результат:

NB: Полный исходный код доступен здесь: https://github.com/fayomihorace/django-netflix-clone.

Поздравляем.

Мы подошли к концу этой первой части.

Резюме

В этом руководстве вы узнали

  • что такое Django
  • как создать проект Django
  • как создать приложение и связать его с проектом
  • основы архитектуры файлов Django
  • основные настройки Django
  • что такое модель и как создавать модели
  • как использовать основные поля модели Django
  • что такое Django ORM
  • что такое менеджер моделей Django и как выполнять над ними основные операции с базой данных
  • как использовать Django Shell, чтобы легко работать с нашими моделями
  • что такое миграции и как их создавать
  • как запустить сервер разработки Django
  • что такое статические файлы и медиафайлы и как их настроить
  • как зарегистрировать свои модели в Django admin и создать суперпользователя
  • как управлять нашей базой данных с помощью интерфейса администратора Django.

Если вы столкнулись с какой-либо блокировкой или ошибкой при прохождении этого урока, пожалуйста, оставьте комментарий, я отвечу и помогу вам как можно скорее. С нетерпением жду вас во второй части этого учебника-курса.

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *