Здравствуйте, добро пожаловать в первую часть этого учебника-курса, в котором вы изучите и поймете основы Django, создав клон популярного сайта Netflix.
Учебник разделен на 5 частей следующим образом:
- Часть 1: Настройка проекта, создание базы данных и управление ею с помощью Django Admin.
- Часть 2: Добавление функций аутентификации.
- Часть 3: Добавление основных функций Netflix (список, поиск, фильтр, просмотр фильмов).
- Часть 4: Юнит-тестирование вашего Django проекта.
- Часть 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 на вашу систему, я советую вам:
-
работать в виртуальном окружении или в рабочем пространстве conda. Но сначала убедитесь, что python установлен на вашем компьютере.
-
Создайте файл
requirements.txt
, который будет содержать список библиотек python и их версии, необходимые нашему проекту для нормальной работы на любом компьютере. Пока нам нужен толькоDjango
, поэтому нашrequirements.txt
будет содержать всего одну строку, как показано ниже:
Django==4.0.2
На момент написания этой статьи последней стабильной версией Django является 4.0.2
.
- Затем запустите
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
. Вы можете настроить модель DjangoUser
по умолчанию, как описано здесь. Но в этом руководстве мы просто будем использовать модель по умолчанию.
Модели фильмов
- У нас будут фильмы для просмотра. Давайте создадим класс модели для представления фильма.
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)
Вот и все.
Примечание: Интерфейс администратора можно настраивать, но мы не будем рассматривать это в данном уроке.
Создание суперпользователя
Для управления админкой сайта нам необходимо создать суперпользователя. Это пользователь с достаточными привилегиями для доступа к интерфейсу администрирования. По умолчанию созданный пользователь не является суперпользователем. Мы углубимся в аутентификацию и роли 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 formatterdjango.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.
Если вы столкнулись с какой-либо блокировкой или ошибкой при прохождении этого урока, пожалуйста, оставьте комментарий, я отвечу и помогу вам как можно скорее. С нетерпением жду вас во второй части этого учебника-курса.