二十五岁时我们都一样愚蠢、多愁善感,喜欢故弄玄虚,可如果不那样的话,五十岁时也就不会如此明智。
标题:Django通用视图
在某些情况下,正如我们之前看到的那样,写观点真的很重要。想象一下,你需要一个静态页面或列表页面。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.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 /静态时,你会得到 -
对于同样的结果,我们也可以做到以下几点 -
- 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模型中的所有条目。这样做通过使用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 /将产生以下页面 -