Django -- Generic Views - Displa

2018-04-16  本文已影响0人  liaozb1996

Django 提供的 Generic Views

通用视图简介

通用视图包含的 属性,方法,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' 

其他重要属性:

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

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:

DetailView

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


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


重要属性:

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

# 当该页面被访问时,对 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
上一篇 下一篇

猜你喜欢

热点阅读