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/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 模型中的所有条目。使用 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。如果您想自己命名,则需要将 context_object_name 参数添加到 as_view 方法。然后 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/ 将产生以下页面 -
    列出并显示数据库中的数据