你好，欢迎来到另一个 Django
为大家走过。
所以你可能在这一点
上工作你的 autos 分配。
这是我们第一个真正的创建
，读取，更新和删除任务。
这个任务的很多内容
是看看
我在 DJ4E 示例中给你的代码并将其拉入。
不要克隆此分配的存储库。
DJ4E 样品是一个怪物。
它已经得到了各种各样的东西，
它的方式太复杂了，你不想要的。
你想从一个漂亮的，干净的应用程序开始。
你之前的任务是做
一个非常小的应用程序，
我们将扩展该应用程序。
这就是为什么你已经
在你的任何地方拥有这个 DJ4E 项目的原因。
所以这是什么，
这个任务是
使用示例代码演变。
但是我真正要
做的是我将遍历
示例代码，因为
这个示例代码中有新的概念。
所以这更多的是关于
示例代码的讲座，而不是如何完成任务。
但重要的是，你需要
理解每一行，因为从字面上看
，我们将在
接下来的 n 个星期编写的每一个程序都是这个 CRUD 的变化。
所以这些默认
的视图，得到 404，
所有这些东西都是很多事情的真正基础。
我们要找到的是
编写这个代码的正确方法，
就像 Django 中的所有内容
一样，非常小而简洁。
所以让我们来看看代码。
好吧，让我们继续运行代码。
去汽车，你必须登录。
所以这个想法是有两个表。
有一个化妆品表。
所以我要添加一个化妆，
然后我要添加一个汽车
，关于这个很酷的事情是这个霓虹灯
1，里程 1,234，萨卡卡。
然后我有这个很酷的下拉菜单。
所以这里有一大堆形式，
有下拉菜单，有许多对
一的关系正在进行。
然后我有这个列表，我可以更新它并删除它。
所以这就是我们完整的 CRUD 所在。
所以我们可以添加品
牌，视图制作，添加汽车等，所
以这就是所有的样本。
所以它非常接近它是什么，它是什么，
它只是不要去抢和所有的东西。
因此，让我们先看看。
所以我在这里坐在我的 DJ4E 样本。
如果你看，你会看到
我在一个项目下的所有各种应用程序。
所以我们已经有了汽车，
但我真的想从身份验证码开始，
如果我回到这里
看样本，让我注销，允许我登录的代码。
所以，如果我直接去汽车看看我是否已经注销。
你会注意到，
当我直接进入汽车时，它做了什么，
它是路由我登录，
然后与下一个返回到 auto。
所以在 autos 中的这个视图，
/autos 已经通过登录混合来保护自己。
稍后我们会登录，
你的登录不会很像这样，
但这是我在示例上的那个。
你不必把它变得漂亮，
即将到来的任务将使一切变得漂亮。
所以现在我们在汽车和我们登录。
你的应用程序必须在这里有更多的东西，
但我更感兴趣的
是向你展示
这辆汽车中的意见的实质。
让我们简单地回顾一下自动登录的工作原理。
所以如果我看 dj4e-samples/settings.py，
你需要插入这个身份验证。
所以这基本上是一堆
来自 Django 的代码，一些视图等，
当你做你的开始项目时，这一直存在。
当然，然后在这里的某个地方，
我们必须有汽车，无论汽车在哪里。
是啊，汽车应用程序配置，
你必须拉汽车应用程序。
如果我看看 dj4e-samples/urls.py，
那么我可以在这里找到汽车，
并且需要有一些基本上说：
“在顶级，
autos 下面的所有内容都委托给
autos.py 中的 URL 文件。
但随后也有帐户。”
所以如果你还记得，
这是 Django 为我们提供的一堆视图，
它是为我们预先安装的。
我们要做的事情是，我们必
须为这个提供一个
名为 registration.html 的模板。
所以我想我已经得到了这个在家/模板/注册/.
是的，我知道 所以我实际上有两个登录。
我有一个非常简单的 login.html。
这是我建议你从开始的一个。
稍后我们将使用社交登录。 这是非常简单的。
这是一个使用 Django 表单功能的登录页面。
如果形成了错误，
这意味着存在验证错误。
它返回并重新显示
此页面，并显示您一个错误。
然后，我们使用 URL 创
建一个简单的帖子表单，该 URL 是对带有登录名称的视图的反向查找。
然后我们把 CSRF 令牌放入，然后我们采取形式
，我只是用段落标签来制作这个。
所以这是
一个简单的登录，这不是我们展示的实际登录。
然后下一个是你必须传递的隐藏值，
以便当你真正成功登录时，
它知道返回到 autos。
当这一切完成后，它会在
登录完成后返回到这里。
所以注册/登录，
你可以把它放在你的任何应用程序中，
但你想将其命名为 registration/login.html。 所
以，如果我看看真正
的快速，我进入家庭/模板，
这些都是模板。
当我做 LS, 你会看到，我有一
个家/模板/家庭和一个家/模板/注册.
您可以在此处拥有多个文件夹。
如果我看看注册中的内容，
你会发现我有这个简单的登录，然后
更复杂的登录，这将给我们
GitHub 登录功能。
所以这意味着登录使用社交。
关键在于这些模板下面，
你不必只有一个子文件夹，
你可以有多个子文件夹。
所以这是必要的配置，以便
当我们告诉我们的视图添加登录 mixin
，我们将在短短一秒钟内看到。
我们在登录中告诉我们的意见使用登录 mixin，
然后它知道从哪里获取模板。
所以这只是它的一部分，
你的指示告诉你如何做到这一点。
因此，任何你要
构建的应用程序或任何你要构建的项目，
你必须把它们放在设置 py，
urls.py，然后制作模板。
然后你必须开始使用
登录 mixin，然后一切都
奇迹般地开始聚集在一起。
所以让我们来看看实际的 autos 应用程序。
我们将在
这里看一些不同的东西，汽车/网址。
我将做一个多终端选项卡，
所以我可以很快地在文件之间切换回来。
你可能有一个比我更好的文本编辑器。
所以我有网址，
我要看看 autos/views.py。
然后我要看一下 autos/model.py。
然后我要看一下 autos/forms.py。
所以让我们来看看这四个文件，
网址，视图，模型，表单。
也许让我们先做模型。
所以这是非常简单的。
我们将创建一个 Make 对象类。
它将有一个字符字段，
其中有一些验证器。
我们玩的形式。
您可以在模型中放置验证器。
我们之前已经看到了形式的验证器，
但有一个验证器基本上说，除非
至少有两个字符，否则我们不会接受进入这个数据库表的数据。
这个 _str_，你已经这样做了一段时间。
这基本上是如果你把
一个模型对象一个实际的 make 并打印
它，它说明哪个字段，
在这种情况下，只有一个字段。
所以这只是说当我们将
模型对象转换为字符串时，
我们可以决定它的外观。
然后我们有一辆汽车，它有
一个昵称与 MinLengthValidator，max_length 为 200，
和里程，它有一个整数字段，一个注释，
这是一个 300 字符的字段，
然后是一个外键。
这是一对多或多对一的关系，
而不是多对多，只是一个外键到 Make。
然后我们将进行 on_delete
CACCADE，这实际上意味着如果你删除一个 Make，
那么相应的自动条目
将被自动删除。
所以这是一个非常简单的模型，
其实非常非常简单。
再次，我们总
是定义这个 _str_（self），以便我们知道，如果你只是在管理界面中显示它，或者如果你只是打印它或者只是将模型本身转换为字符串，那么这些应该使用的字段中的字段是昵称字段，
只是为了向最终用户显示。
这就是模型文件。 接下
来我们来看看表单文件。
所以表单文件很有趣，
因为我们已经看到了表
单本身只是表单，但这是一种特殊的形式，然后它是一个 ModelForm。
在这种情况下，我们通常在其他模型中，
我们有所有这些字段，
我们把它们放进去，它看起来
很像一个模型文件，我们
有一个字符字段，PositiveIntegerField。
但我们基本上说的是，你知道吗？
我们要在这里做一个表格
实际上，我们想要做的就是
从 M
ake 模型中获取所有字段并使它们成为表单域。
所以一个形式和一个模型是两个不同的东西。
表单是在
视图和模板之间进行的东西，正
如你所看到的，
它也会自动下降到模型中，所
以这就像创建所有字段一样。
让我们创建一个表单，因为
表单对象不必与模型相关联。
但是在这种情况下，我们将
从模型中派生一个表单对象。
所以我们不是扩展表单，而是扩展模型表单。 所
以这是一个 ModelForm 必须有的，
这只是一些数据，说我们
要从中提取所有字段的模型是 Make 模型
，它只有一件事是一个名称。
就是这样 所以这是自动生成一
个表单，如果
我们改变了它并在这里添加了另一个字段，
那么这个 make 窗体将自动有一个字段。
你可以给它一个字段列表，
_ _ 全部 _ 就
像一个信号说，“只要给我所有这些。”
现在可能有一些内部的
东西，比如在创建和
更新，或者你不想使用的东西。
所以这是一个表单，记住表单是如何工作的。
我们之前就报道了 让我们来看看我们的网址。
现在很多看起来和
我们做过的事情非常相似
我们基本上有一个主表，
这是我们的 autos 表，
和我们的查找表，这是我们的 make 表。
然后我们有三件事，
有主列表视图，
这是列出所有汽车。
有主制作列表视图
，列出了所有品牌。
然后我们可以创建
一个没有主键的新的，
因为创造的一部分想法
是创造一个新的东西，
这将生成一个主键。
然后我们将有更新和删除。
因此，我们有一个读取，创建，更新，删除。
所以这并不完全
是可以看到所有这四件事
所以我们有了视图，
我们命名这些视图，以便我们可以
在我们的视图
本身和模板中引用它们，以
便我们可以在它们之间建立链接。
所以这些都非常
简单，并不是所有的不同。
所以当我们在 views.py 中时，乐趣开始发生。
所以登录 mixin，
如果你记得从 z 演练的作者那里，
你只需将它添加
到一个视图，它基本上只是说
你无法访问这个视图，除非
你登录，如果你没有登录，
它会颠簸到
login.html 文件，然后在你完成。 所
以需要登录混合是我们需要做的。
如果你去作者 z 样本，
你会看到像我手工做的那样。
你不想手动做，
你只需调用登录 mixin。
现在，所以这个主视图是一个列表视图，
所以
让我们来看看这将是什么样子。
这是 “列表” 视图。
所以我们要采取无论我们有多少审计，
我们要循环查看这个列表，
我们将从数据库中检索所有审计。
然后我们将有一个添加自动链接，
然后一个视图，
使链接有多少品牌，并添加一个化妆。
所以让我也进入汽车模板，
再次进入汽车和自动列表。
所以这就是这样做的模板。
所以我们得到了一些东西，我们得
到了一个自动列表。
现在这些名字并不是强迫你们
的，但有一些惯例会在瞬间变成，
我们看起来非常有用。
所以我们要得到一个自动列表。
如果我们回到我们的视图中，
我们会看到我们说，
从自动表中获取所有对象，
所有自动类对象都将它们全部检索，
并将它们作为 auto_list 在上下文中过去。
现在我们也希望能够
显示出这个小数量，这是第二个数字，
所以我们要问，继续制作对象，但不要给我一个列表，
数他们然后给我一个数字。
所以，使计数卡在那里，你会
看到是否可以计数大于零。
我们可以显示广告和自动按钮，
它也显示了化妆计数，
查看所有品牌，添加一个化妆品，
并在这里出现化妆计数。
所以这是我们投入的另一件事
我们将要经历的自动列表和
auto 的迭代变量将
通过每个单独的东西，以
及昵称，make 等，
这正是直接从 models.py 文件中出来的。
每辆汽车都有四件事情
，我们只是打印出这些东西。
你也会得到主键
，所以我们将创建一个更新 URL，
并且该 URL 是自动：auto_update。
所以如果你查看 urls.py，
我们看到这个自动更新查找，
这给了我们一个视图的
路径，但
是这个特定的路径需要一个参数作
为主键，所以这意味着这个 URL 模板标记，autos 必须有 auto.id。通过模型，
你得到了一个，你做了一个 auto_create，
这非常简单。
但其中一个规则是，在你
可以做一个自动之前，你必须至少有一个 make，
因为如果你记得，
添加一个 auto 必须有
这个下拉列表可填充，
这是从 make 表中拉出的，
所以这基本上就是解决这个问题的方法。
这就是主要的观点
在这里，我们走，更新。
这是汽车视图，然后如果我们做 make 视图，
我们也在做同样的事情。
如果我们去看看 make 列表，
我们正在做同样的基本事情，
查看所有品牌，
现在我们得到了更新和删除。
这样你就不需要计数。
我们只想抓住所有的对象，
我们想把它放在 make 列表下的上下文中，
然后我们在 HTML 上创建列表
，这更简单。
它只是通过 make 列表，
它通过上下文进行。
如果没有，我们不打印出来，
然后我们发出它的名称，
然后我们有一个更新和一个删除按钮
来进行更新和删除，
当然，如果你查看 urls.py，
那些更新和删除都
有主键要求，
所以你有一个主键，
你必须在这里传递，
以使该 URL 成为正确的 URL，
然后只有一些链接
返回到各种东西，以便
我们可以返回到 autos，
视图制作，添加一个新的品牌。
现在，取消所有的东西。
所以这是
列出汽车和品牌的 views.py。
现在，我们要创建 make 创建视图。
所以，如果我们看一下 make create 视图，
那就是添加一个 make。
这将创建这个表单。
我可以在这里做更大
它可以创建这种形式，在
那里我们要把一个叫做雪佛兰的东西。
所以我们需要一种方法来制作这种形式。
我们将使其成为需要的登录，
我们不会让人们这样做。
我们将有一些类范围的变量，
比如我们想要使用的模板，而
且成功 _url 是在我们做了这个权利之后。
现在，如果你只是提交
它，它抱怨，它不会这样做。
但是，一旦你做得对了，
你想去哪里？
所以，雪佛兰，之后你想去哪里？
这是控制器功能。
我想返回到自动列表，所
以成功的 URL 转
到自动：所有这些在 urls.py 中都是这个主视图。
这是主视图的名称，
所以如果我们转到这里，
使用哪个模板和哪个成功 _url。
如果我们做一个 get 请求，
我们将为 make 形式
的 make 构建一个表单，
但实际上它来自 make 模型，
这只是一个字符串字段。
就这么简单 我们正在重复使用这个
我们只是说，让我们做一个形式，
从这里拉。
我们必须传递一个表单，
因为模型不能用于创建这个屏幕。
这个屏幕来自一个表单。
好吧 如果我们看看模板,
如果我们看看制作创建
模板或制作窗体.
所以这就是我们要用来制作表单的模板。
我们将需要表格。
所以这就是我们如何做的形式。
把 CSRF 令牌，
你创建一个表
，可以作为段落或表格。
但无论如何，你需要这个表单对象。
所以你需要传递表单对象。
所以我们
在这里，我们要做一个表单，然后我们要去表单对象，
然后我们将渲染为自己 .model
autos.makeform html。
然后我们要退回那个得到。
然后，当我们点击按钮
提交按钮, 添加一个化妆,
我们点击提交按钮,
它进入后，
因为我们做了一个表单帖子, 进来.
不要这样做 这是可怕的。
我讨厌它，当 vi 这样做。
但在这里，我们走了，我们回来了。
是啊 所以帖子进来，
Request.Post 具有所有键值对，
这些键值对是由表单定义的键值对。
所以我们说，让我们使用
请求帖子中的初始数据制作一个 make 表单。
鉴于表单生成它，
它知道这些字段的名称是什么
，这是隐藏在表单如何工作的背后。
但它也检查表单数据是否有效，这
意味着我们遵循所有这些验证器规则。
如果验证器规则没有得到遵循，
如果没有表单是有效的，
我们只是将其发回。
所以这里的代码，
这种形式是无效的代码。
如果我输入一个字母 A 并点击 “提交”，
它会回来并重新呈现
表单和所有错误的东西，所有这些东
西都由这个表单代码处理，这个
Django 表单代码找出了什么是错误的。
就在只是一点点，所以我可以
更快地回到它。 我们去那里
它找出了它有什么问题，发
出一个错误消息，
错误消息来自 models.py 就在这里。
不，就在这里
然后通过 forms.py，因为它
最终是我们从
模型表单继承的表单。 得到它？
所以这很酷。 所以这就是错误条件
，否则我们会形成 .save。
现在这里真的超级
酷是因为这个表单是
一个模型表单，
字段名称和
模型中的字段名称相同，
所以它实际上保存了模型本身。
因此，在某种程度上，表单包
含来自发布请求的模型数据，然后保存它。
这保存了表单。
它将它放入，然后我们只需
重新重定向回请求 URL。
这是相当简洁的我。
我们拉入旧的帖子数据，
我们检查它是否坏，如果它不好，
我们将表单发送回
完全相同的模板，
然后我们保存它，如果它是好的，
然后我们弹出到成功的 URL。
这是一件美丽的事情。
但就像 Django 一样，
尽管这超级简洁，这是一件更加艰苦的事情。
如果你用几乎任何其他语言做到这
一点，你会像 75 行代码
，这里我们有 15 行代码。
但事实证明，在 Django 中，
几乎总是有一种更简洁的方法来做到这一点。
我们有一个通用的创建视图。
您可以查看
这个通用创建视图的文档，django.Views。
让我们只是去谷歌这个东西。
我总是在这里放一个点，这通常
让我正确，因为这
是实际的包和
包内的类。 哦，没有。
对不起 你认为这是一个域名，
所以搜索不起作用。
但现在我只是说 Django，
至少
它会与搜索我有关，
通用编辑视图跳转到 CreateView。 所
以你可以阅读所有这些东西，
通用的创建视图实际上。
我有这个参考吗？
所以，你去那里。 看看这个
现在，这就像我们
继承的一些其他视图
一样，它们中有很多功能。
所以如果我想做一个自动创建，
这就是它所需要的。
现在，
为所有意图和目的自动创建和 MakeCreate，
做完全相同的事情。 因
此，AutoCreate 中会发生什么，
因为
我们扩展 CreateView，我们有三位元数据，
我们告诉它我们想要使用哪个模型，
我们想要从该模型中
哪些字段，以及成功 URL 去哪里。
然后这会生成所有这些代码。
我们继承了所有的代码。
你会注意到除了
MakeForm 之外，这里没有任何硬编码。
现在，我们甚至不必
为 Auto 创建表单，因为这里的代码构建了表单。
不仅如此，它使用这个名称
Auto 来选择模板。
所以如果我做自动表单，
我必须使用这个。
我用这个，这是我的基础引导程序。
不要太担心这一点。
所以它知道它
将要使用的模板的名称。
我只需要告诉它在这里使用哪个模板，
因为它派生了模板，
auto_form.html 是模板。
非常酷 相当真棒和酷。
所以它会自动找到该和成功 URL。
所以这是所有需要的。
事实上，在这个 MakeCreate 中，
我可以从这里删除所有这些代码，
而只是通过扩展 CreateView 来执行 CreateView。
所以我只是向你
们展示这个因为我希望你们看到真正发生了什么。
但是这不是你编写代码的方式。
这就是你编写你的代码的方式。
所以现在，我想告诉你
做一个更新的艰难方法。
那么什么是更新？ 让我们来看看代码。
因此，让我们来看看视图制作。
更新是当
我们到这里时发生的事情，
这将转到 MakeUpdate。
所以这里是制作更新，这里是 urls.py。 就是这个
我的意思是，查找主键更新
，然后如果你看这里，
它将是自动查找一个更新。
所以我要去更新雪佛兰的一个。
它必须读取旧数据，
必须向你展示它，
然后让我们更新它，然后提交它检查，
当然，是否有任何验证错误。
然后将我们重定向回一个成功的网址。
所以，如果我们看看这些观点
，我们将再次
预示，有一个更简单的方法来做到这一点。
因此，我们设置了这些变量或成功的 url
，我们想要的模板和模型。
然后我们有一个获取请求。
因为在 urls.py 中有这个整体：pk，
被传递给这个 pk 值。
现在，这个对象或 404 真的很酷。
这个获取对象或 404（自我模型 pk = pk）。
这就是我们传递
pk 等于的这
个参数，它们是相同的名称很常见，但这是 get_object_or_404 的参数。
第二个是
被调用到我们 get 的参数。
自我。模型，当然，是制造。
Get_Object_or_404 基本上检查是否，
我会做这个更新，
让我们去制作，让我们做一个更新。
它正在做的是使用这个数字，
这三个在这里，自动/查找/3/更新，
并且它正在检索旧数据。
现在，如果我
无意中有一个数字
不存在于数据库中，
比如 9,999，并且我对该数据库做了一个 get 请求，会发生什么？
我得到 “页面未找到 404。”
所以这里发生的事情是不知何故你会说，“嘿，
加载这
个对象，然后把它交给我和变量，制作，或者只是炸毁并发送 404 错误。”
所以这告诉你发生了什么，
哪个看法你只是，“No Make 匹配给定的查询。”
现在，通常你不应该手输入这些。
三个它的工作原理，所以它不会炸毁。
所以 get_object_or_404 是加载
旧数据然后
使用该数据进行保护的一种方法，或者只是炸毁。
所以不要在这一点上进一步。
现在，然后我们要做
一个表单，我们将用旧的数据填充它。
所以实例，实例是什么。
所以这就是对象。
做一个化妆形式。 这是一个化妆形式。 模型
中的所有字段都
从模型 Make 继承。
然后将其传递给
我们刚才看到的模板 make_form.html。
这种形式来了，这就是我们所需要的。
这是非常通用的外观。
它真的不在乎太多。
它几乎都以这种形式编码，
这是从模型派生的。
然后，当然，我们输入了一堆东
西，我们点击 “提交”。
它做的完全相同的事情创建,
并且它做得很好.
首先，它必须做一个 get 或 404，因为
我们用主键发布到事情。
我们加载它以确保我们有一个要更新的对象。
然后我们
从该数据库创建一个新的 make 表单，然后对其进行更改。
所以这就像起始数据
，但是它会改变它的数据。
所以在这种特殊情况下，
雪佛兰是数据库中的旧值。
如果我说 Bowtie，
请求后实验室 Bowtie，
这将启动雪佛兰，但在这种形式的
对象，那么它将是 Bowtie。
当然，如果它无效，
我们将在这里返回一条错误消息。
如果它是有效的，我们将保存
它，所以这个新的 Bowtie
将被保存在那里。
所以，如果我们查
看我们的品牌，我们看到它现在是 Bowtie
，我们将重定向到成功的 URL。
现在，在这一点上，
我希望你能预测
接下来会发生什么。
自动更新，扩展更新视图，
即通用编辑视图。
它说明它是哪个模型，
你想要的字段，
以及成功时该去哪里。
然后它做的一切，在这里。
从字面上看，我可以去说
完全相同的单词，
这是当你进入这里，你
删除，然后你有一个取消，
有一个确认删除会发生什么。
这个模板的名称不是随机选择
的，它必须被称为确认 .delete，
模型确认 .delete。
你去那里 你必须得到 CSRF 令牌。
你被交给化妆作为一个对象在这。
所以产生这个输出。
这里没有任何形式
只有由
对象或 404 加载的 make，然后传递并渲染它。
然后当帖子发生时，它会检索它。
如果它在那里，404 再次
检查错误的数据
并删除它，然后跳转到成功 URL。
猜测我接下来要做什么不需要太多的东西，也就
是说，如果你扩展删除视图，
你可以免费获得所有代码。
你只需告诉哪些模型领域
和去哪里取得成功。
所以关键的是，当
你做家庭作业时，
我相信你们中的一些人只是要复制和
粘贴所有这些东西。 这是错误的。
“ 生成”、“生成更新” 和 “生
成删除” 应与 “
自动创建”、“自动更新” 和 “自动删除” 一样短。
因为你要做
很多通用的编辑视图，
我们将一遍又一遍地执行 CRUD，而
且你真的不想写 15 行代码。
这是不必要的重复，不必要的剪切和
粘贴和更改代码，如果
你可以保持它真正的简单。
所以我基本上可以构建一套完整的
CRUD 表单和 CRUD 功能
，
并对模型进行验证，然后我甚至不必有一个 forms.py，
我只有一个 models.py。
所以如果你正在做你的汽车，
你会认为我犯了
一个错误，如果我正在制作一个 forms.py。
因为如果我只是这样使用这
个 views.py，而不是让它们看起来像 MakeUpdate，那么你将节省自己大量的
时间和精力，我们必须修改这些东西。
找到
所有更改然后修改它们要容易得多。
所以这是 Auto 的示例代码的演练。
你要做一个任务，
但不要只是复制一切。
我已经设置了这个，以便
你花时间了解发生了什么，
特别是在视图中。
URL 是你的骄傲只是复制，
模型你只是复制，
你只是复制的 URL，
但视
图不仅仅是复制它，找出真正发生的事情，并提出更简
单，更简洁的方法来完成所有这些事情。
Django
在这一点上开始看起来非常漂亮。
所以我希望你觉得这有帮助。 干杯