zoukankan      html  css  js  c++  java
  • django通用视图之TemplateView和ListView简单介绍

    django支持类视图,与此同时django为我们提供了许多非常好用的通用视图供我们使用,这其中TemplateView、ListView和DetailView是我们经常使用到的,这里就对TemplateView和ListView做一个简单的介绍

    TemplateView:模板视图
    在Django项目中,我们经常会使用到静态页面,也就是这个页面内的内容是写死的,不需要其他数据的渲染,完成这个任务的时候TemplateView就是一个非常好的选择,例如我们做一个网站肯定需要写一个‘关于本网站’的页面,这时候我们只需要将这个页面的HTML文件写在django项目的templates文件夹之中,然后在url映射时在as_view()中传递template_name参数把写好的模板名称传递进去就好,示例代码如下:

    'about.html'中代码
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Title</title>
    </head>
    <body>
      <h2>这是网站详情</h2>
    </body>
    </html>

    'url.py'中代码
    from django.views.generic import TemplateView
    path('about/', TemplateView.as_view(template_name='about.html'), name='about')

    其实在使用TemplateView时,我们也可以为它传递数据,这时候我们就可以编写自己的试图类,让它继承TemplateView,我们在定义一个template_name的静态字段来指定模板,同时我们需要定义一个get_context_data的类方法,来向模板传递数据(其实在模板中发送ajax请求也可以用来请求数据)。示例代码如下:
    'about.html'中代码:
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Title</title>
    </head>
    <body>
      <h2>这是网站详情</h2>
      <h2>{{ phone }}</h2>
    </body>
    </html>

    'url.py'中代码:
    path('about/', AboutView.as_view(), name='about')

    'views.py'中代码:
    from django.views.generic import TemplateView

    class AboutView(TemplateView):
      template_name = 'about.html'

      def get_context_data(self):
        context = Super(AboutView, self).get_context_data()
        context['phone'] = '021-8888888'
        return context

     

    ListView:列表视图
    在网站开发中,经常会出现需要列出某个表中的一些数据作为列表展示出来。比如文章列表,图书列表等等。在Django中可以使用ListView来帮我们快速实现这种需求。示例代码如下:

    class ArticleListView(ListView):
      # 定义要展示的数据模型
      model = Article
      # 定义要展示在哪个模板上
      template_name = 'article_list.html'
      # 定义每页要显示多少条数据
      paginate_by = 10
      # 定义这个列表集合在模板文件中的名称
      context_object_name = 'articles'
      # 定义排序规则
      ordering = 'create_time'
      # 定义分页的关键字,默认为'page'
      page_kwarg = 'page'

      # 自定义上下文内容,默认只显示模型中内容,在重写此方法时必须要重写父类的此方法
      def get_context_data(self, **kwargs):
        context = super(ArticleListView, self).get_context_data(**kwargs)
        print(context)
        return context

      # 默认显示模型的所有数据,若定义了,则显示返回的集合
      def get_queryset(self):
        return Article.objects.filter(id__lte=89)

    对以上代码进行解释:
    首先ArticleListView是继承自ListView。
    model:重写model类属性,指定这个列表是给哪个模型的。
    template_name:指定这个列表的模板。
    paginate_by:指定这个列表一页中展示多少条数据。
    context_object_name:指定这个列表模型在模板中的参数名称。
    ordering:指定这个列表的排序方式。
    page_kwarg:获取第几页的数据的参数名称。默认是page。
    get_context_data:获取上下文的数据。
    get_queryset:如果你提取数据的时候,并不是要把所有数据都返回,那么你可以重写这个方法。将一些不需要展示的数据给过滤掉。

     注意,其实和其他类视图一样,当http请求的时候,会先执行本身的dispatch方法,然后根据dispatch和请求方法的不同执行对应的方法,在使用ListView时一般会执行get方法。这样有些时候,我门就可以重写get方法来定义我们在get_queryset和get_context_data所能使用到的变量,例如需要按照某种方式排序,这时候需要先拿到这个排序关键词的值,显然拿到关键词的步骤可以写在get方法之中,然后根据排序值在get_queryset和get_context_data中使用已达到排序。

    def get(self, request, *args, **kwargs):

      self._sort = self.request.GET.get('sort')

      return super(ArticleListView, self).get(request, *args, **kwargs)

    这时候在写get_queryset的时候就可以使用self._sort来定义排序,其实类似的使用方式还有很多,这还需要根据需求来写自己的内容了

     

     

  • 相关阅读:
    Docker容器进入的4种方式
    Linux启动/停止/重启Mysql数据库的方法
    MySQL replace函数替换字符串语句的用法(mysql字符串替换)
    php从数组中随机筛选出指定个数的值
    Beyond Compare 4 30天试用期后,破解方法
    MYSQL:1213 Deadlock问题排查历程
    uniapp 屏幕高度
    如何系统学习Spring框架
    mysql 批量修改表前缀
    DHCP中继配置案例
  • 原文地址:https://www.cnblogs.com/limaomao/p/9497785.html
Copyright © 2011-2022 走看看