【Django 笔记】Django快速入门 第4节: 表单和通用视图
笔记基于官方文档和技术博客,从中提取关键信息,和记录笔记,例程详见官方文档。
完整官方文档:Django documentation
博客推荐:Django2.2教程
Django快速入门官方文档:Part 4: Forms and generic views
目录
1. 表单form
对于模板文件,要点:
- form标签中,action表示你要发送的目的url,method表示提交数据的方式,一般分post和get。当需要创建一个改变服务器端数据的表单时,请使用 method="post"
forloop.counter
指示for
标签已经循环多少次。forloop.counter是DJango模板系统专门提供的一个变量,用来表示你当前循环的次数,一般用来给循环项目添加有序数标。- 当创建了一个 POST 表单(它具有修改数据的作用),就需要小心跨站点请求伪造,简称CSRF。Django 拥有一个用来防御它的非常容易使用的系统。 简而言之,所有针对内部 URL 的 POST 表单都应该使用
{% csrf_token %}
模板标签。(标签名不可更改,固定格式,位置任意,只要是在form表单内。这个方法对form表单的提交方式方便好使,但如果是用ajax的方式提交数据,那么就不能用这个方法了。)
提交过来的数据在视图中进行处理,视图中的要点:
-
request.POST
是一个类似字典对象,允许通过键名访问提交的数据。 比如request.POST['choice']
以字符串形式返回选择的 Choice 的 ID。注意:request.POST
的值永远是字符串。 -
Django 还以同样的方式提供
request.GET
用于访问 GET 数据 。 -
如果在
request.POST['choice']
数据中没有提供choice
, POST 将引发一个KeyError
。PS:通常我们会给个默认值,防止这种异常的产生,例如request.POST[’choice’,None]
,一个None解决所有问题。 -
HttpResponseRedirect
只接收一个参数:用户将要被重定向的 URL。注:当成功处理POST数据后,应当保持一个良好的习惯,始终返回一个HttpResponseRedirect。如:return HttpResponseRedirect(reverse('polls:results', args=(question.id,)))
-
reverse()
函数。这个函数避免了我们在视图函数中硬编码 URL。它需要我们给出 想要跳转的视图的名字 和 该视图所对应的 URL 模式中需要给该视图提供的参数(即传递的数据)。(如:上面的代码重定向后将进入polls:results
对应的视图,并将question.id
传递给它。白话来讲,就是把活扔给另外一个路由对应的视图去干。)
2. 使用通用视图:减少重复代码
Web 开发中的一个常见情况:
- 根据 URL 中的参数从数据库中获取数据、
- 载入模板文件、
- 利用刚才的数据渲染模板,返回这个模板。
由于这种情况特别常见,Django 提供一种快捷方式,叫做“通用视图”系统。
将原来的代码改为使用通用视图的方式,需要做以下几步来完成转换:
- 转换 URLconf。
- 删除一些旧的、不再需要的视图。
- 基于 Django 的通用视图引入新的视图。
(注:开发中一开始就应该确定是否使用通用视图,而不是中途进行重构)
使用通用视图需要导入:
from django.views import generic
通用视图:(它们是作为父类被继承的)
ListView
:代表“显示一个对象的列表”。ListView通用视图使用一个默认模板称为<app name>/<model name>_list.html。template_name
属性用来指定这个模板名。
DetailView
:代表 “显示一个特定类型对象的详细信息页面”。默认情况下,DetailView
通用视图使用一个称作<app name>/<model name>_detail.html
的模板(如:polls/detail.html)。template_name
属性就是用来指定这个模板名的,用于代替自动生成的默认模板名。
class DetailView(generic.DetailView):
model = Question
template_name = 'polls/detail.html'
- 每个通用视图需要知道它将作用于哪个模型。 这由
model
属性提供。 DetailView
期望从 URL 中捕获名为"pk"
的主键值。(所以例子中为通用视图把question_id
改成pk
) 。
类视图是Django比较高级的一种用法,先有个印象。更多关于通用视图的详细信息,请查看 通用视图的文档 。