学习 Django:构建一个 Netflix 克隆版
概括
您好,欢迎来到本教程课程的第一部分,您将通过构建一个流行的网站Netflix的克隆版本来学习和了解 Django 的基础知识。
本教程假设您至少具备以下方面的基础知识:
- Python3编程语言
- Linux
- HTML 和 CSS
- MySQL。
Django 的介绍
Django是构建全栈网站和API最流行的框架之一。它遵循MVT(模型、视图和模板)架构。
-
什么是模型:模型是数据库的 Python 对象表示。例如,User类代表数据库中的用户表,User 类的一个实例就是users表中的一条记录。然后,User 类的每个属性都对应users表中的一列,而User类特定实例的每个属性值就是与该属性对应的列的值。如果现在听起来有点奇怪,别担心,在本教程结束之前,当我们开始实际操作模型时,你会更好地理解的。
-
什么是模板:简单来说,模板就是最终用户看到的内容(由 HTML 和 CSS 创建的界面,按钮、图像、文本、动画等)。
-
什么是视图:视图是监听用户在模板上操作的组件。用户操作可能会触发对视图的请求。视图会执行与处理用户请求相关的操作,如果需要,它会与数据库(通过模型)交互,并在需要时向用户返回响应。响应可以是另一个模板或 HTML 页面,也可以是 JSON 响应,甚至是其他类型的响应。
-
此外,对于初学者来说,需要了解的重要一点是,Django 项目被分成称为apps 的小型可重用部分(python 模块) 。
Django 安装
要在您的系统上安装 Django,我建议您:
-
可以在虚拟环境或 conda 工作区中工作。但首先,请确保您的计算机上已安装 Python。
-
创建一个
requirements.txt文件,其中包含项目在任何计算机上正常运行所需的 Python 库及其版本列表。目前,我们只需要Django这样requirements.txt一行:
Django==4.0.2
截至本文撰写之时,Django 的最新稳定版本是4.0.2。
- 然后运行`npm install`
pip install -r requirements.txt或python -m pip install requirements.txt`npm install`(也可以python3只运行 `npm install`python或pip3只运行 `npm install`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 项目是由应用组成的。这个文件夹是
appDjango 默认自动创建的,其中也包含一些自动生成的文件。下面我们来简单解释一下: -
wsgi.py(Web 服务器网关接口):当您想将 Django 部署到生产环境中的真实服务器上时,此文件用作入口点,以允许应用程序服务器连接到您的 Django 项目。
-
asgi.py(异步服务器网关接口):简单来说,它的作用与wsgi.py相同,但专用于异步 Web 服务器和应用程序。因此,当您的项目支持异步任务时,可以使用 asgi.py 代替wsgi.py。
-
settings.py:这是项目配置文件。所有应用和项目的设置都定义在这里。
其中重要的设置包括:SECRET_KEY它用于为项目提供加密签名。它主要用于对会话 cookie 进行签名(我们将在本课程的后续部分讨论会话和 cookie)。如果有人拥有此密钥,他们就可以修改应用程序发送的 cookie。INSTALLED_APPS这是一个包含项目中所有应用列表的数组。Django 添加了一些默认应用,例如django.contrib.admin用于管理后台(我们将在本教程后面部分介绍)、django.contrib.auth用于管理身份验证等的应用……(应用名称本身就说明了其功能)。MIDDLEWARE中间件是在每个请求之前执行的函数。Django 默认会添加一些中间件,例如django.middleware.security.SecurityMiddleware用于验证请求的安全性。
我们会边讲解边解释其他设置。
- 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现在应用文件夹下新创建的所有文件和文件夹。我们只views.py解释models.py:
- views.py:这个文件将包含我们在文章开头描述的视图。每个视图都是一个类,我们将在课程的后续部分深入讲解。
- models.py:这是包含我们模型的文件。如上所述,在 Django 中,我们的数据库由 Django 类表示。
设计我们的数据库
我们已经创建了项目并添加了主应用程序。现在让我们根据功能设计数据库。请记住,每个模型都是一个 Python 类,并且继承自 Django 内部类django.db.models.Model。
-
打开目录
models.py内的文件netflix。 -
我们有用户注册并观看电影。Django 默认提供了
contribs一些预制模块,可以简化我们的工作。这些模块中包含一个默认User模型。您可以按照此处的User说明自定义 Django 的默认模型。但是,在本教程中,我们将仅使用默认模型。
电影模特
- 我们将要观看电影。让我们创建一个模型类来表示电影。
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)
名称列应该是一个字符串,所以我们使用了 Django 模型中的 `name` 字段CharField。我们决定将名称长度限制为 150 个字符。
通过 `$('name')` 这行代码,CHARS_MAX_LENGTH: int = 150我们定义了一个常量,以避免在代码中使用“魔法数字”。
通过 `$('name')` 这行代码,我们要求 Django在我们的表中name = models.CharField(max_length=CHARS_MAX_LENGTH, blank=True)添加一个名为 `name` 的列,并且每条电影记录的名称长度不应超过 150 个字符。这意味着,当我们想要创建或修改一条电影记录时,无需提供名称值。您将在下文中了解更多。namemoviesblank=True
- 每部电影都可以添加一段描述,我们用这行文字添加吧:
description = models.TextField(blank=True, null=True)
我们使用 `movie.description`TextField而不是CharField`movie.description`,因为描述长度不可预测,但我们知道电影名称通常不会太长。
注意,null=True这意味着我们可以创建电影而不指定描述值。如果null=True像 `movie.description` 一样没有指定描述name,尝试创建不提供描述的电影description将会引发异常。
我们可能需要保留电影的创建日期,让我们这样做:`movie.description` date_created = models.DateTimeField(auto_now_add=True)。
并不是说我们使用它是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)
- 每部电影应该只有一个类别。最好将类别也存储在数据库中,以便于管理。让我们在创建电影模型之前先创建一个类别模型
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)
- 在本教程中,我们假设一部电影只能属于一个类别。这定义了我们所说的“一对多”关系。在 Django 中,它用 `<class>` 表示
django.db.models.ForeignKey。让我们添加它:category = models.ForeignKey( Category, 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)
- 每部电影都会有一个或多个标签。最好将标签也存储在数据库中。让我们在创建电影模型之前先创建一个标签模型,其中包含
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 中,这种关系用 `<code>` 表示django.db.models.ManyToManyField。让我们添加它:`<code>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表示如果删除一个标签,则所有与其相关的电影也将被删除,以避免数据无效值(例如,某些电影具有不存在的标签)。
-
我们可能需要一些关于每部电影的统计数据,例如观看人数。让我们添加它:
watch_count = models.IntegerField(default=0)。
这里,由于它是一个数字,我们使用了 `false`IntegerField,default = 0这意味着默认值为 `0`0。此外,由于我们定义了默认值,即使我们不提供该属性,Django 也不会抛出异常,而是将该属性设置为 `0`0。 -
当然,我们需要存储电影视频文件。
好了,这就完成了。我们已经有了数据库所需的所有基本信息。
管理静态文件
STATIC_URL在此之前,我们将解释 Django 如何管理文件。Django 会根据文件中的参数值,提供与网站相关的所有文件(html、css、js、图片)settings.py。默认值为/static/。
我们还需要定义静态根文件夹,其值为static/:
STATIC_URL = 'static/'
STATIC_ROOT = 'static/' # Add this line
您可以将其更改为其他值,但我建议您仅在有充分理由更改时才保留它。
在开发过程中,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目录根目录下的一个名为“my-movies”的文件夹中。我们使用了 ` os.path.joinand` BASE_DIR(定义在文件顶部)来获取系统中文件夹的完整路径。该文件夹不存在,所以我们来创建它:
请确保位于项目根目录并运行:mkdir media。
- 最后一步是将静态文件和媒体文件的值添加到路径中,以完成设置。
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 迁移
我们已经完成了基础数据库的搭建。现在我们需要创建所谓的迁移文件migrations。迁移文件是包含模型定义和变更历史记录的 Python 文件。要创建迁移文件,我们应该运行以下命令:python manage.py makemigrations。请注意,我们使用了项目管理工具manage.py。
运行该命令后,应该会收到以下错误信息:

这是因为它是程序运行所需的模块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 的组件,并且自带一个名为 `<model_name>` 的默认组件objects。它允许我们从模型中向数据库执行查询。例如,我们可以对Movie模型执行的基本查询包括:
- 制作电影:这是通过以下方式实现的:
Movie.objects.create(name="Avatar") - 获取所有电影:这是通过以下方式实现的
Movie.objects.all()。 - *筛选所有名称以大写字母开头的电影
A*:这是通过Movie.objects.filter(name__startswith="A"). - 筛选所有名称以“.”开头的电影(无论
a大小写)Aa:这可以通过以下方式实现Movie.objects.filter(name__istartswith="a")。如果您仍然不太明白,没关系,在学习如何使用右侧下一节中的管理器后,您就会明白了。
Django Shell:玩转我们的数据
为了快速测试我们的模型和管理器,Django 提供了一个非常有用的工具,叫做Django Shell。
from netflix.models import Category, Movie, Tag
然后按回车键。
- 让我们尝试创建一个名为
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")
然后,将新创建的类别分配给 shell
变量tech_category。
我们可以验证其信息。
- 在终端中输入“just”
tech_category并按回车键,它应该会显示以下内容:
>>> tech_category
<Category: Category object (1)>
请注意,这Category object (1)是 Python 用于渲染对象实例的默认名称。我们可以通过重写__str__模型类的方法来自定义名称。
例如,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
-
现在,执行
exit()命令关闭 django shell,然后重新打开它python manage.py shell。 -
让我们再次导入模型
>>> from netflix.models import Category, Tag, Movie
>>>
- 让我们来获取我们的类别。为此,我们有以下几种方法:
- 你可以运行
tech_category = Category.objects.get(name="Tech")
这里我们进行了直接访问。特殊之处在于,如果存在名为 `<category name>` 的类别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并按回车键,您将看到:
>>> tech_category.pk
1
这意味着我们模型的主键值为10。
这是因为,正如我们之前看到的,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 shell 中使用模型。
我们今天只学习了一些对模型进行基本操作的方法。在本课程的后续部分,我们将学习更多内容。
Django ORM
Django 模型是代表数据库的类抽象。即使我们使用默认的模型管理器Movie.objects.create()或直接在模型实例上执行操作new_movie.save(),所有这些操作都会在后台由 Django ORM(对象关系映射器)转换为 SQL 查询。Django 的 ORM 只是以 Python 的方式创建 SQL 查询、操作数据库并获取结果。是不是很棒?
注册管理员
既然你已经了解了如何在命令行中操作数据,接下来我们来看看如何通过图形界面来操作数据。Django提供了一个强大的工具——Django Admin
, 让我们能够轻松地管理数据库。它提供了一个管理界面,我们可以轻松地列出、创建、修改、查看和删除数据库中的条目。设置管理功能也非常简单。 需要注意的是,正是 contrib 模块为我们提供了这些强大的功能。'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 的身份验证和角色机制。
要在 VS Code 的项目终端中创建超级用户,请运行以下命令:
python manage.py createsuperuser它会要求输入一些值。我们假设用户名是admin,邮箱是admin@admin.com,密码也是admin。它会打印一些警告信息:
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 自带一个轻量级的开发服务器。要启动它,像往常一样在 VS Code 的项目窗口中打开一个新的终端,然后运行:python manage.py runserver。你会看到以下消息:
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浏览器)。
- 输入开发环境网址,您应该会看到此页面。
- 打开管理页面:
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 管理后台进行一些自定义,以允许超级用户查看电影的播放列表和播放次数。
preview_imagedescription
- 打开
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(
f"""
<video width="320" height="240" controls>
<source src="/media/{movie.file}" type="video/mp4">
Your browser does not support the video tag.
</video>"""
)
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 格式化程序将视频django.utils.html.format_html渲染为 HTML。preview_imagefile - 我们
list_display = ['name', 'preview', 'video', 'description']要求 django 显示数据库中每条记录的计算值preview和video属性。namedescriptionMovie
结果如下:
注:完整源代码可在此处获取:https://github.com/fayomihorace/django-netflix-clone
恭喜。
第一部分到此结束。
概括
在本教程中,您学习了:
- 什么是 Django
- 如何创建 Django 项目
- 如何创建应用程序并将其链接到项目
- Django 文件架构基础知识
- Django 基本设置
- 什么是模型以及如何创建模型
- 如何使用 Django 基本模型字段
- 什么是 Django ORM
- 什么是 Django 模型管理器?如何对其执行基本数据库操作?
- 如何使用 Django Shell 轻松地操作我们的模型
- 什么是迁移,以及如何创建迁移
- 如何启动 Django 开发服务器
- 什么是静态文件和媒体文件?如何设置它们?
- 如何将模型注册到 Django 管理后台并创建超级用户
- 如何使用 Django 管理界面管理我们的数据库。
如果您在学习本教程的过程中遇到任何问题或错误,请留言,我会尽快回复并帮助您。很高兴您能来到本教程的第二部分。
文章来源:https://dev.to/fayomihorace/build-a-netflix-clone-with-django-part-1-complete-beginner-course-3al3










