美文网首页
Django -- Generic Views - Displa

Django -- Generic Views - Displa

作者: liaozb1996 | 来源:发表于2018-04-16 21:09 被阅读0次

Django 提供的 Generic Views

  • Display Views: ListView, DetailView
  • date-based Views: year/month/day achive page
  • Edit Views: CreateView, UpdateView, DeleteView

通用视图简介

通用视图包含的 属性,方法,context

Display Views

ListView

ListView 展示一系列对象(用于展示一个 Model 里面的所有对象,也可以是其子集 (queryset) ),支持分页

from django.views.generic import ListView
from books.models import Publisher

class PublisherList(ListView):
    model = Publisher  # 指明要操作的Model(展示 Publisher 的所有对象)
    context_object_name = 'publisher_list'  # 在模板 context 中 model 的变量名,默认是 object_list
    template_name = 'app/publisher_list.html'  # 要渲染的模板,默认是 '<app_name>/<model_name>_list.html' 

其他重要属性:

  • context_object_name [get_context_object_name()]
  • extra_context
  • model
  • queryset: 用来代替 model, 比如: Publisher.objects.all()[:10] # 模板 context 中的变量名会有 object_list, <model_name>_list (publisher_list),拥有相同数据
  • ordering: 一个字符串或数组,传给 queryset; 相当于:queryset.objects.order_by()
  • allow_empty
  • paginate_by [get_paginate_by()]:每页的 object 的数量,页数用 request.GET (?page=1) 或 path('<int:page>\', PublisherList.as_view()) 指明; (第一页是: ?page=1, 最后一页是:?page=last)
  • paginate_orphans:指明最后一页最多可以有几个 object (正常+溢出)
  • template_name [get_template_names()]
  • template_name_suffix:默认为 '_list'
  • allow_empty: 默认为 True (False 表示 object_list 为 空时,显示 404)

其他重要方法:[get(), head()]

  • get_context_data(): 可以添加额外的模板 context , 默认将 model / queryset 指定的 objects 添加到模板 context
  • get_queryset():默认返回属性 queryset
def get_context_data(self, **kwargs):
    # Call the base implementation first to get a context
    context = super().get_context_data(**kwargs)
    # Add in a QuerySet of all the books
    context['book_list'] = Book.objects.all()
    return context

使用方法的好处:self 中存储了许多有用的变量:self.request.user , URLConf: self.args, self.kwargs

class PublisherBookList(ListView):

    template_name = 'books/books_by_publisher.html'

    def get_queryset(self):
        self.publisher = get_object_or_404(Publisher, name=self.kwargs['publisher']) # 根据链接提取除publisher
        return Book.objects.filter(publisher=self.publisher)  # 筛选出该出版社的所有书籍

    def get_context_data(self, **kwargs):
        # Call the base implementation first to get a context
        context = super().get_context_data(**kwargs)
        # Add in the publisher
        context['publisher'] = self.publisher  # 将 publisher 添加到 模板 context
        return context

Context:

  • object_listcontext_object_name
  • is_paginated
  • paginator
  • page_obj: 该页包含的 objects

DetailView

DetailView 用于显示某一 Model 中的一个 object 的详细信息


  • ListView 一样,用属性 modelqueryset 指定要操作的 Model 或 queryset
  • DetailView 会根据 URLConf 中的 <int:pk><slug:slug> 筛选出一个 object

slug 默认只支持 ASCII 字符中的字母、数字、下划线、连字符
可以在 Model 设置 SlugField.allow_unicode = True , 使其支持 Unicode; 不过,还需要另外实现 <slug:slug> 中的转换器


重要属性:

  • context_object_name [get_context_object_name()]
  • extra_context
  • model
  • pk_url_kwarg : 指定 URLConf 捕捉 pk 的变量名,默认使 'pk' (<int:pk>)
  • queryset [get_queryset()]
  • response_class [render_to_response()]
  • slug_field [get_slug_field()] : 该 Model 中包含 slug 的项名,默认使 slug
  • slug_url_kwarg:默认是 'slug' (<slug:slug>)
  • template_name [get_template_names()]
  • template_name_suffix

重要方法:[.get(), .head()]

  • get_query()
  • get_context_data()
  • get_object()
# 当该页面被访问时,对 Model 做出额外的工作
class AuthorDetailView(DetailView):

    queryset = Author.objects.all()

    def get_object(self):
        # get_object() 默认时返回通过 pk 或 slug 筛选出的对象(该视图需要操作的对象)
        # Call the superclass
        object = super().get_object()
        # Record the last accessed date
        object.last_accessed = timezone.now()  # 当有人访问该页面时,更新最后访问时间
        object.save()
        # Return the object
        return object

相关文章