Django 基于类的视图是不是自动为模板分配表单值

Posted

技术标签:

【中文标题】Django 基于类的视图是不是自动为模板分配表单值【英文标题】:Does Django Class Based Views automatically assign form value for templatesDjango 基于类的视图是否自动为模板分配表单值 【发布时间】:2020-04-15 06:44:37 【问题描述】:

我使用 Django 2

这是我的 view.py 包含的内容

class SchoolCreateView(CreateView):
     fields = ("name","principal","location")
     model = models.School

此视图使用的模板(html文件)包含代码:

form.instance.pk

而且它有效。它返回正确的主键。我不明白为什么。 当我没有在我的视图中定义表单对象时,为什么这会起作用? Django中使用CBV时form的值是否自动赋值?

跟进问题。我知道 form.instance 代表模型中的一行,但是 form 本身代表什么?我目前对表单的理解是它代表 view.py 中的 request.POST(基于我从函数视图中获得的知识)。但这没有任何意义,因为客户端尚未发出 POST 请求,因为他仍将创建将要发布但尚未发布的数据条目。

【问题讨论】:

【参考方案1】:

Pk 是主键字段,默认为id。如果将其他字段定义为主键,调用 pk 将返回 this。

来自文档:

默认情况下,Django 为每个模型提供以下字段:

id = models.AutoField(primary_key=True)

这是一个自动递增的主键。

如果您想指定自定义主键,请在其中一个字段上指定 primary_key=True。如果 Django 看到你明确设置了 Field.primary_key,它不会添加自动 id 列。

每个模型只需要一个字段来具有primary_key=True(显式声明或自动添加)。

【讨论】:

我了解 pk 在处理模型实例中的列时的工作原理。我不明白的是 CBV 如何自动为模板声明表单。在我的模板中,我有 form.instance.pk。当我没有在 SchoolCreateView 中明确声明时,模板如何知道与表单关联的值(来自 form.instance.pk)? 当你从CreateView继承并声明模型时,即model = models.School form 成为你模型的一个类型并且拥有模型的id字段。

以上是关于Django 基于类的视图是不是自动为模板分配表单值的主要内容,如果未能解决你的问题,请参考以下文章

如何为其他模板的表单显示和提交编写基于 Django 类的视图?

Django 基于类的视图:覆盖表单名称

Django 基础知识:如何使用基于类的视图呈现上下文

Django:在基于类的视图中包含媒体(css/js)

Django:基于类的视图无法呈现清晰的表单

基于 Django 类的视图加载另一个带有数据的表单