Django 简明教程

Django - Generic Views

在某些情况下,编写视图(如前面看到的那样)确实很繁琐。想象您需要一个静态页面或列表页面。Django 提供了一种设置这些简易视图的简单方法,该方法称为通用视图。

与经典视图不同,通用视图是类而不是函数。Django 在 django.views.generic 中提供了一组通用视图类,而每个通用视图都是这些类之一或从其中一个类继承的类。

共有 10+ 个通用类:

>>> 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']

您可以将其用于您的通用视图。让我们看一些示例以了解其工作原理。

Static Pages

让我们从“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'),)

最好的方法是使用通用视图。为此,我们的 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 时,您会获得:

static page

对于相同的结果,我们还可以执行以下操作:

  1. views.py 中没有任何更改

  2. 将 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 文件。

List and Display Data from DB

我们将列出 Dreamreal 模型中的所有条目。使用 ListView 通用视图类可以轻松做到这一点。编辑 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")),
)

此时需要注意的是,通用视图传递给模板的变量是 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/ 将生成以下页面 −

list display data from db