使用generic views
很多的视图层(view)非常相似,像前面的代码中的detail() 跟results()方法.这些都是基本的web开发:从数据库拿到数据,加载模板,把数据呈现在网页上.Django提供了一个shortcut, "generic views" system
把前面部分的django代码进行转换到generic views system
需要3个步骤 1.Convert the URLconf : 转换URLconfig
2. Delete some of the old, unneeded views. :删除不需要的view函数代码
3. Introduce new views based on Django’s generic views :基于generic views编写新的views

把原先views.py中的各个view方法更改为继承generic.ListView或generic.DetailView
这里的2个generic view
generic.ListView : 'display a list of objects'
generic.DetailView: "display a detail page for a particular type of object
每一个generic view 需要知道它们需要的model是哪个。通过model 属性来传入 如model = Question 定义了DetailViews可以传递Question这个model(数据库的表?)
DetailView 这个generic view需要一个通过url传入pk这个值来作为主键去数据库寻找对应的数据
template_name 这个属性是用来告诉django 使用一个指定的html template 来代替django自己默认设置的模板(默认的模板<appname>/<model name>_detail.html)
对于ListView ,template_name的默认值是<appname>/<model name>_list.html
修改urls.py

这里需要注意,因为DetailView是通过pk来查数据的。以前的question_id要改为pk。
这里有个坑:
对于DetailView 。里面question 变量是自动通过Question 这个model来自动匹配。但是对于ListView 这里有一个context_object_name属性 :这个属性是用来对listview中返回的数据库数据列表进行命名。然后在对于的html页面上展示。

网友评论