Django - 通用视图
在某些情况下,编写视图(如我们之前所见)真的很繁重。想象一下,你需要一个静态页面或列表页面。Django 提供了一种简单的方法来设置这些简单的视图,这种方法称为 generic views。
与经典视图不同,generic views 是 class 而不是 function。Django 在 django.views.generic 中提供了一组用于 generic views 的 class,每个 generic view 都是这些 class 之一,或者是从它们继承的 class。
有 10+ 个 generic class −
>>> import django.views.generic >>> dir(django.views.generic) ['ArchiveIndexView', 'CreateView', 'DateDetailView', 'DayArchiveView', 'DeleteView', 'DetailView', 'FormView', 'GenericViewError', 'ListView', 'MonthArchiveView', 'RedirectView', 'TemplateView', 'TodayArchiveView', 'UpdateView', 'View', 'WeekArchiveView', 'YearArchiveView', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'base', 'dates', 'detail', 'edit', 'list']
这些是你可以用于 generic view 的。让我们看一些示例来了解它是如何工作的。
静态页面
让我们从 static.html 模板发布一个静态页面。
我们的 static.html −
<html>
<body>
This is a static page!!!
</body>
</html>
如果我们按照之前学到的方法来做,我们需要将 myapp/views.py 修改为 −
from django.shortcuts import render
def static(request):
return render(request, 'static.html', {})
并将 myapp/urls.py 修改为 −
from django.conf.urls import patterns, url
urlpatterns = patterns("myapp.views", url(r'^static/', 'static', name = 'static'),)
最好的方法是使用 generic views。为此,我们的 myapp/views.py 将变为 −
from django.views.generic import TemplateView class StaticView(TemplateView): template_name = "static.html"
我们的 myapp/urls.py 将变为 −
from myapp.views import StaticView
from django.conf.urls import patterns
urlpatterns = patterns("myapp.views", (r'^static/$', StaticView.as_view()),)
访问 /myapp/static 时,你会得到 −
要获得相同的结果,我们还可以这样做 −
- views.py 无需更改
- 将 url.py 文件修改为 −
from django.views.generic import TemplateView
from django.conf.urls import patterns, url
urlpatterns = patterns("myapp.views",
url(r'^static/',TemplateView.as_view(template_name = 'static.html')),)
如你所见,在第二种方法中,你只需要修改 url.py 文件。
列出并显示数据库中的数据
我们将列出 Dreamreal model 中的所有条目。使用 ListView generic view class 可以轻松实现这一点。编辑 url.py 文件并更新为 −
from django.views.generic import ListView
from django.conf.urls import patterns, url
urlpatterns = patterns(
"myapp.views", url(r'^dreamreals/', ListView.as_view(model = Dreamreal,
template_name = "dreamreal_list.html")),
)
此时需要注意的是,generic view 传递给模板的变量是 object_list。如果你想自己命名它,你需要在 as_view 方法中添加 context_object_name 参数。然后 url.py 将变为 −
from django.views.generic import ListView
from django.conf.urls import patterns, url
urlpatterns = patterns("myapp.views",
url(r'^dreamreals/', ListView.as_view(
template_name = "dreamreal_list.html")),
model = Dreamreal, context_object_name = dreamreals_objects ,)
相关的模板将是 −
{% extends "main_template.html" %}
{% block content %}
Dreamreals:<p>
{% for dr in object_list %}
{{dr.name}}</p>
{% endfor %}
{% endblock %}
访问 /myapp/dreamreals/ 将生成以下页面 −
