gpt4 book ai didi

python - django 默认上下文变量

转载 作者:太空宇宙 更新时间:2023-11-04 09:32:50 26 4
gpt4 key购买 nike

我是 Django 网络开发的新手,设法按照 this tutorial 设置了一个玩具项目.

但是我发现 Django 官方文档以及本教程非常困惑,我很难理解,尤其是模板上下文变量

比如在xxapp/views.py中我们定义了几个 View 如下,

from django.views.generic.edit import CreateView, UpdateView, DeleteView
from django.urls import reverse_lazy

from catalog.models import Author

class AuthorCreate(CreateView):
model = Author
fields = '__all__'
initial = {'date_of_death': '05/01/2018'}

class AuthorUpdate(UpdateView):
model = Author
fields = ['first_name', 'last_name', 'date_of_birth', 'date_of_death']

class AuthorDelete(DeleteView):
model = Author
success_url = reverse_lazy('authors')

然后在模板中,我们有这个

{% extends "base_generic.html" %}

{% block content %}
<form action="" method="post">
{% csrf_token %}
<table>
{{ form.as_table }} <!-- WHERE IS THIS "FORM" FROM? -->
</table>
<input type="submit" value="Submit">
</form>
{% endblock %}

我理解这个模板文件,除了一件事,form.as_table 是从哪里来的,它是什么??

我知道,如果我们使用一些内置的类 View 或模型,我们可能有一些免费的上下文数据,但我在哪里查找它们,我在 Django 上搜索但一无所获。

最佳答案

您使用的是通用的基于类的 View ,它们内置了很多功能。查找它们的最佳来源是 this one .

如果您查看 CreateView例如(编辑 -> CreateView),你会看到 get()方法,这是您使用 GET 获取页面时调用的第一个方法,只需调用 render_to_response()使用从 get_context_data() 获取的上下文数据.

里面get_context_data() ,我们添加一个 form上下文变量,分配给get_form() .等等……

post() 相同方法,首先是 form被获取,检查有效性,如果无效,则 form_invalid()方法使用 form 呈现模板在其上下文中。

您可以按照相同的方式使用 UpdateViewDeleteView ,它们非常相似。大多数表单处理代码实际上来自 FormMixin类。

当创建自己的 View 时,子类化 Django 的通用 View ,您会发现有时您不能使用 View ,但可以使用混合宏(例如 FormMixinModelFormMixin)。

所以 form在你的模板中是 ModelForm对于 Author您在通用 View 中指定的模型。该 View 使用 modelform_factory 从模型自动生成该表单, 以及您用 fields 指定的字段.因为它被添加为 'form'用于呈现模板的上下文的关键,您可以使用 {{ form }} 访问它. {{ form.as_table }}将在 <table> 中呈现此表单的 HTML ,如所述here .

如果您不喜欢表单的外观并希望自定义某些字段(并且不能仅通过更改模板来做到这一点),您将需要创建自己的表单,并表达您的看法通过设置 form_class属性并删除 fields属性(字段将在您的表单中指定),如@drew 在其回复中所述。

关于python - django 默认上下文变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55027876/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com