发布于 2026-01-06 0 阅读
0

学习 Django:构建一个 Netflix 克隆版 总结

学习 Django:构建一个 Netflix 克隆版

概括

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,我建议您:

  1. 可以在虚拟环境或 conda 工作区中工作。但首先,请确保您的计算机上已安装 Python。

  2. 创建一个requirements.txt文件,其中包含项目在任何计算机上正常运行所需的 Python 库及其版本列表。目前,我们只需要Django这样requirements.txt一行:

Django==4.0.2
Enter fullscreen mode Exit fullscreen mode

截至本文撰写之时,Django 的最新稳定版本是4.0.2

  1. 然后运行​​`npm install`pip install -r requirements.txtpython -m pip install requirements.txt`npm install`(也可以python3只运行 `npm install`pythonpip3只运行 `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_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),
]
Enter fullscreen mode Exit fullscreen mode

至此,我们可以说我们的应用程序允许的 URL 为http://my_project_urlhttp://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."""

Enter fullscreen mode Exit fullscreen mode

这意味着,我们Movie的数据库中将有一个名为“表”的表。

每部电影都会有一个名字,我们来添加一下:

CHARS_MAX_LENGTH: int = 150

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

    name = models.CharField(max_length=CHARS_MAX_LENGTH, blank=True)
Enter fullscreen mode Exit fullscreen mode

名称列应该是一个字符串,所以我们使用了 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_addTrue所以创建日期会在对象创建期间由 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)
Enter fullscreen mode Exit fullscreen mode
  • 每部电影应该只有一个类别。最好将类别也存储在数据库中,以便于管理。让我们在创建电影模型之前先创建一个类别模型namedescription类别创建日期实际上用处不大):
class Category(models.Model):
    """Category model class."""

    name = models.CharField(max_length=CHARS_MAX_LENGTH, blank=True)
    description = models.TextField(blank=True, null=True)
Enter fullscreen mode Exit fullscreen mode
  • 在本教程中,我们假设一部电影只能属于一个类别。这定义了我们所说的“一对多”关系。在 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)
Enter fullscreen mode Exit fullscreen mode
  • 每部电影都会有一个或多个标签。最好将标签也存储在数据库中。让我们在创建电影模型之前先创建一个标签模型,其中包含namedescription类别创建日期实际上用处不大):
class Tag(models.Model):
    """Tag model class."""

    name = models.CharField(max_length=CHARS_MAX_LENGTH, blank=True)
    description = models.TextField(blank=True, null=True)
Enter fullscreen mode Exit fullscreen mode
  • 在本教程中,我们假设一部电影可以有多个标签,一个标签可以关联到多个类别。这就定义了我们所说的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)
Enter fullscreen mode Exit fullscreen mode

注意:该属性models.CASCADE表示如果删除一个标签,则所有与其相关的电影也将被删除,以避免数据无效值(例如,某些电影具有不存在的标签)。

  • 我们可能需要一些关于每部电影的统计数据,例如观看人数。让我们添加它:
    watch_count = models.IntegerField(default=0)
    这里,由于它是一个数字,我们使用了 `false` IntegerFielddefault = 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
Enter fullscreen mode Exit fullscreen mode

您可以将其更改为其他值,但我建议您仅在有充分理由更改时才保留它。

在开发过程中,Django 建议将这些文件存储在static每个应用程序内部的名为 的文件夹中。

管理媒体文件

现在,上传到项目(例如我们的电影视频)的文件将根据MEDIA_URL参数的值进行分发settings.py。该设置默认情况下不存在,但建议设置为该值,/media/因此我们需要添加它(我们可以在之后立即添加STATIC_URL):

MEDIA_URL = 'media/'
Enter fullscreen mode Exit fullscreen mode

默认情况下,媒体文件不会存储在数据库中,而是存储在设置中指定的文件夹中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
Enter fullscreen mode Exit fullscreen mode



这意味着,我们的电影将被上传到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)
Enter fullscreen mode Exit fullscreen mode

我们已经完成了项目的静态文件和媒体文件的设置。

然后我们可以用它django.db.models.FileField来存储电影(媒体)的链接,如下所示:

file = models.FileField(upload_to='movies/')
Enter fullscreen mode Exit fullscreen mode


  • 最后,我们需要一张电影预览图。既然是图片,我们就django.db.models.ImageField这样用吧:
preview_image = models.ImageField(upload_to='preview_images/')
Enter fullscreen mode Exit fullscreen mode


我们最终的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)

Enter fullscreen mode Exit fullscreen mode

好了。

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
Enter fullscreen mode Exit fullscreen mode


然后再次
运行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',
    }
}
Enter fullscreen mode Exit fullscreen mode

'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

  • 在 VSCode 中打开终端(默认情况下,它将在项目根目录下打开)。
  • 运行:python manage.py shell。将显示一个新的命令提示符。
    图片描述

  • 导入我们的模型:类型

from netflix.models import Category, Movie, Tag
Enter fullscreen mode Exit fullscreen mode

然后按回车键。

  • 让我们尝试创建一个名为Dracula3“run”的电影
Movie.objects.create(name="Dracula")
Enter fullscreen mode Exit fullscreen mode

您应该会看到类似这样的错误:

sqlite3.IntegrityError: NOT NULL constraint failed: netflix_movie.category_id
Enter fullscreen mode Exit fullscreen mode

这是正常的,因为我们无法创建没有类别的电影。请记住,由于类别之间的关联性,一部电影只能属于一个类别category = models.ForeignKey(Category, ...

所以首先我们需要创建一个分类。我们来创建一个名为“.”的分类tech。运行以下命令:

tech_category = Category.objects.create(name="Tech")
Enter fullscreen mode Exit fullscreen mode

然后,将新创建的类别分配给 shell
变量tech_category
我们可以验证其信息。

  • 在终端中输入“just”tech_category并按回车键,它应该会显示以下内容:
>>> tech_category
<Category: Category object (1)>
Enter fullscreen mode Exit fullscreen mode

请注意,这Category object (1)是 Python 用于渲染对象实例的默认名称。我们可以通过重写__str__模型类的方法来自定义名称。
例如,Category我们可以像这样返回类别名称:

class Category(models.Model):
    ...
    # Add the function below
    def __str__(self):
        return self.name
Enter fullscreen mode Exit fullscreen mode

我们还可以返回名称CategoryTag模型。

class Movie(models.Model):
    ...
    # Add this function
    def __str__(self):
        return self.name
Enter fullscreen mode Exit fullscreen mode
class Tag(models.Model):
    ...
    # Add this function
    def __str__(self):
        return self.name
Enter fullscreen mode Exit fullscreen mode
  • 现在,执行exit()命令关闭 django shell,然后重新打开它python manage.py shell

  • 让我们再次导入模型

>>> from netflix.models import Category, Tag, Movie
>>> 
Enter fullscreen mode Exit fullscreen mode
  • 让我们来获取我们的类别。为此,我们有以下几种方法:
    • 你可以运行
tech_category = Category.objects.get(name="Tech")
Enter fullscreen mode Exit fullscreen mode

这里我们进行了直接访问。特殊之处在于,如果存在名为 `<category name>` 的类别Tech,则会抛出异常。要验证这一点,请运行以下命令。

Category.objects.get(name="NonExistentName")
Enter fullscreen mode Exit fullscreen mode

你会得到这个:

>>> 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.
Enter fullscreen mode Exit fullscreen mode
- you can also access the object by it primary key, which is even better than using any other keys
Enter fullscreen mode Exit fullscreen mode
tech_category = Category.objects.get(pk=1)
Enter fullscreen mode Exit fullscreen mode
- you can access the category using `filter` method that we saw in previous point:
Enter fullscreen mode Exit fullscreen mode
tech_category = Category.objects.filter(name="Tech").first()
Enter fullscreen mode Exit fullscreen mode

请注意,Category.objects.filter(name="Tech")返回的是一个包含匹配类别的数组。
您可以通过运行以下命令进行验证:

>>> Category.objects.filter(name="Tech")
<QuerySet [<Category: Tech>]>
Enter fullscreen mode Exit fullscreen mode

然后链式调用,.first()返回列表的第一个元素。

现在您应该已经注意到,类别显示方式如下:

<Category: Tech>
Enter fullscreen mode Exit fullscreen mode


而不是

<Category: Category object (1)>
Enter fullscreen mode Exit fullscreen mode

这意味着我们的__str__方法效果很好^_^。

然后我们创建了第一个类别实例。

  • 在终端中输入tech_category.pk并按回车键,您将看到:
>>> tech_category.pk
1
Enter fullscreen mode Exit fullscreen mode

这意味着我们模型的主键值为10。
这是因为,正如我们之前看到的,Django 的默认数据库是 sqlite,而 sqlite 与大多数其他关系型数据库一样,其主键默认是一个从 1 开始自动生成的整数。

  • 我们还可以通过在终端输入命令来查看类别名称tech_category.name。输出结果应该如下所示:
>>> tech_category.name
'Tech'
Enter fullscreen mode Exit fullscreen mode
  • 现在我们终于可以制作我们的第一部电影了:
movie = Movie.objects.create(name="Dracula", category=tech_category)
Enter fullscreen mode Exit fullscreen mode

现在我们可以验证我们的属性了。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)
Enter fullscreen mode Exit fullscreen mode

太棒了,我们的第一部电影也制作精良。

  • 我们可以列出数据库中所有正在上映的电影供您查看:
>>> Movie.objects.all()
<QuerySet [<Movie: Dracula>]>
Enter fullscreen mode Exit fullscreen mode
  • 我们还可以用另一种方式制作电影。执行
new_movie = Movie(name="Harry potter3")
Enter fullscreen mode Exit fullscreen mode
  • 设置电影类别
new_movie.category = tech_category
Enter fullscreen mode Exit fullscreen mode

在这一步,电影对象已创建,但电影尚未保存到数据库中。要保存电影,我们需要调用save()模型实例的方法。

new_movie.save()
Enter fullscreen mode Exit fullscreen mode

好了。你可以再次翻遍所有电影列表,看看新电影是否也在其中:

>>> Movie.objects.all()
<QuerySet [<Movie: Dracula>, <Movie: Harry potter3>]>
Enter fullscreen mode Exit fullscreen mode

好的。

  • 你可以查看watch_count这部new_movie电影的片长0
>>> new_movie.watch_count
0
Enter fullscreen mode Exit fullscreen mode
  • 我们可以将计数更新为任何数字。
>>> new_movie.watch_count = 10
>>> new_movie.save()
>>>
Enter fullscreen mode Exit fullscreen mode

现在运行new_movie.watch_count应该会显示10

>>> new_movie.watch_count
10
Enter fullscreen mode Exit fullscreen mode
  • 要查看数据库中的电影数量,您可以运行Movie.objects.count()以下命令,它应该会输出 2:
>>> Movie.objects.count()
2
Enter fullscreen mode Exit fullscreen mode
  • 你也可以通过调用命令来删除电影delete()。让我们删除new_movie
>>> new_movie.delete()
(1, {'netflix.Movie': 1})
Enter fullscreen mode Exit fullscreen mode
  • 我们可以检查一下,现在计数是1
>>> Movie.objects.count()
1
Enter fullscreen mode Exit fullscreen mode

希望你喜欢在 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)
Enter fullscreen mode Exit fullscreen mode

就这样。

注意:管理界面是可以自定义的,但本教程不会介绍这部分内容。

创建超级用户

要管理我们的管理站点,我们需要创建一个超级用户。超级用户拥有足够的权限访问管理界面。默认情况下,创建的用户不是超级用户。我们将在本教程的后续部分深入探讨 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]:
Enter fullscreen mode Exit fullscreen mode

按下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.
Enter fullscreen mode Exit fullscreen mode

这意味着服务器已启动并可在主机上访问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……CategoryTag……。点击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)
Enter fullscreen mode Exit fullscreen mode
  • 我们使用 Django 类django.contrib.admin.ModelAdmin来自定义影片的显示方式。我们使用 Django 格式化程序将视频django.utils.html.format_html渲染为 HTML。preview_imagefile
  • 我们list_display = ['name', 'preview', 'video', 'description']要求 django 显示数据库中每条记录的计算previewvideo属性。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