Django视图类

为Django内置的视图类,能极大简化开发流程,本文为学习官方文档时所做笔记,较为全面,方便复习和开发时迅速查询

基础视图

以下三个类视图提供了创建Django视图所需的大部分功能,可以将它们视为父视图,可以自己单独使用,也可以作为父视图被继承。它们可能不能提供项目所需的所有功能,在这种情况下,可以配合mixin和其他类视图一起使用

View

基础视图,根据请求方法进行处理

  • 导入:

    from django.views.generic.base import View
    
  • 属性

    • http_method_names (属性)可接受的HTTP方法名称列表 :

      ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']
      
  • 方法:

    • dispatch(request,*args,**kwargs)(方法):接受一个带参数的请求,并将请求分配给视图类中对应的方法中,默认情况下,HEAD请求将被委托给get()。如果需要以与GET不同的方式处理HEAD请求,可以重写HEAD()方法。
    • http_method_not_allowed(*request*, **args*, **\*kwargs*)(方法):如果http方法是通过属性http_method_names规定以外的方法请求而来时调用此方法

TemplateView

返回模板和模板所需的上下文

  • 导入

    from django.views.generic.base import TemplateView
    
  • 继承自

    • django.views.generic.base.TemplateResponseMixin
    • django.views.generic.base.ContextMixin
    • django.views.generic.base.View
  • 属性:

    • template_name:返回模板

      template_name='index.html'
      
  • 方法:

    • get_context_data(self, **kwargs)::提供模板上下文内容并返回给对应的模板
  • 示例:

    from django.views.generic.base import TemplateView
    
    from articles.models import Article
    
    class HomePageView(TemplateView):
    
        template_name = "home.html"
    
        def get_context_data(self, **kwargs):
            context = super().get_context_data(**kwargs)
            context['latest_articles'] = Article.objects.all()[:5]
            return context
    

RedirectView

重定向到指定的URL

  • 导入

    from django.views.generic.base import RediectView
    
  • 继承自:

    • django.views.generic.base.View
  • 属性:

    • url:要重定向到的地址,字符串形式。如果为None则引发410错误响应
    • pattern_name:要重定向到的URL地址的名称
    • permanent:是否永久重定向,默认为False
    • query_string:是否将请求所带的查询字符串添加到响应的URL地址中,默认为False
  • 方法:

    • get_redirect_url(*args,**kwargs):构建用于重定向的目标URL,args和kwargs参数分别是从请求URL中捕获的位置参数和/或关键字参数 。根据属性urlpettern_name来返回重定向的URL
  • 示例:

    from django.shortcuts import get_object_or_404
    from django.views.generic.base import RedirectView
    
    from articles.models import Article
    
    class ArticleCounterRedirectView(RedirectView):
    
        permanent = False
        query_string = True
        pattern_name = 'article-detail'
    
        def get_redirect_url(self, *args, **kwargs):
            article = get_object_or_404(Article, pk=kwargs['pk'])
            article.update_counter()
            return super().get_redirect_url(*args, **kwargs)
    

通用显示视图

用于显示数据,是项目中最常用的视图类

DetailView

self.object包含视图正在操作的单个对象,本例中指的是Article对应的object

  • 导入

    from django.views.generic.detail import DetailView
    
  • 继承自

    • django.views.generic.detail.SingleObjectTemplateResponseMixin
    • django.views.generic.base.TemplateResponseMixin
    • django.views.generic.detail.BaseDetailView
    • django.views.generic.detail.SingleObjectMixin
    • django.views.generic.base.View
  • 方法

    • setup
    • dispatch
    • http_method_not_allowed
    • get_template_names:返回一个列表,包含所有可用的模板的名称,默认使用第一个,如果指定了template_name属性template_name一定在第一个
    • get_slug_field():返回要查找的slug_field字段对应的值
    • get_queryset()
    • get_object()
    • get_context_data
    • get_context_object_name():返回context_object_name设定的值,默认为object
    • get
    • render_to_response()
  • 示例

    from django.utils import timezone
    from django.views.generic.detail import DetailView
    
    from articles.models import Article
    
    class ArticleDetailView(DetailView):
    
        model = Article
        context_object_name = 'article'
    
        def get_context_data(self, **kwargs):
            context = super().get_context_data(**kwargs)
            context['now'] = timezone.now()
            return context
    

    模板中:

    <h1>{{ article.headline }}</h1>
    <p>{{ article.content }}</p>
    <p>Reporter: {{ article.reporter }}</p>
    <p>Published: {{ article.pub_date|date }}</p>
    <p>Date: {{ now|date }}</p>ListView
    

ListView

这个视图执行时,self.object_list将包含视图操作的对象列表(通常为Queryset,但也不一定是)

  • 导入

    from django.views.generic.list import ListView
    
  • 继承自

    • django.views.generic.list.MultipleObjectTemplateResponseMixin
    • django.views.generic.base.TemplateResponseMixin
    • django.views.generic.list.BaseListView
    • django.views.generic.list.MultipleObjectMixin
    • django.views.generic.base.View
  • 属性:

    • context_object_name

    • paginate_by :分页时每页所包含的数量

      paginate_by = settings.PAGINATE_BY #通常在settings中设置该属性
      
  • 方法

    • setup
    • dispatch
    • http_method_not_allowed
    • get_template_names:返回一个列表,包含所有可用的模板的名称,默认使用第一个,如果指定了template_name属性template_name一定在第一个
    • get_queryset()
    • get_context_data
    • get_context_object_name():返回context_object_name设定的值,默认为object
    • get
    • render_to_response()
  • 示例:

    from django.utils import timezone
    from django.views.generic.list import ListView
    
    from articles.models import Article
    
    class ArticleListView(ListView):
    
        model = Article
        paginate_by = 100  # if pagination is desired
    
        def get_context_data(self, **kwargs):
            context = super().get_context_data(**kwargs)
            context['now'] = timezone.now()
            return context
    

    模板中

    <h1>Articles</h1>
    <ul>
    {% for article in object_list %}
        <li>{{ article.pub_date|date }} - {{ article.headline }}</li>
    {% empty %}
        <li>No articles yet.</li>
    {% endfor %}
    </ul>
    

通用编辑视图

对数据进行各种操作

FormView

显示表单,对表单数据进行验证,该类视图解决以下三种路径的表单请求:

  1. 初始GET(空或者预填充表单)
  2. 具有无效数据的POST(通常重新显示带有错误的表单)
  3. 具有有效数据的POST(处理数据并通常重定向)
  • 导入

    From django.views.generic.edit import FormView
    
  • 继承

    • django.views.generic.base.TemplateResponseMixin
    • django.views.generic.edit.BaseFormView
    • django.views.generic.edit.FormMixin:所有的表单的额外功能都来自该Mixin所以主要讨论该mixin所带来的方法属性
      • initial:设置表单的初始值,字典形式
      • form_class:将某个需要的表单实例化
      • success_url:表单数据验证合法后跳转到的URL
      • prefix:生成表单的前缀
      • get_initial():检索initial,且可以给定一定逻辑,默认情况下返回initial值的副本
      • get_form_class():检索form_class,且可以给定一定逻辑,默认情况下即为form_class的值
      • get_form(form_class=None):使用get_form_kwargs()所给的参数实例化form_class所给的表单,如果form_class没有被设置,则使用get_form_class所给的值
      • get_form_kwargs:设置创建实例化表单所需的关键字参数。
      • get_success_url:确定表单成功验证时要重定向到的URL。默认情况下返回success_url
      • form_valid(form): 表单数据验证和验证成功后的行为,最终重定向到success_url
      • form_invalid(form):表单数据验证不成功后的行为,最终返回一个无效表单给上下文
      • get_context_data
    • django.views.generic.edit.ProcessFormView
      • get(request,*args,**kwargs)
      • post(request,*args,**kwargs)
      • put(*args,**kwargs)
    • django.views.generic.base.View
  • 示例

    from myapp.forms import ContactForm
    from django.views.generic.edit import FormView
    
    class ContactView(FormView):
        template_name = 'contact.html'
        form_class = ContactForm
        success_url = '/thanks/'
    
        def form_valid(self, form):
            # This method is called when valid form data has been POSTed.
            # It should return an HttpResponse.
            form.send_email()
            return super().form_valid(form)
    

    模板中

    <form method="post">{% csrf_token %}
        {{ form.as_p }}
        <input type="submit" value="Send message">
    </form>
    
  • 业务逻辑请参考FormView

CreateView

可以用来创建某个对象的表单的视图 ,重新显示带有验证错误的表单(如果有),无错误则保存对象 .即可直接与模型进行交互

  • 导入

    from django.views.generic.edit import CreateView
    
  • 继承自

    • django.views.generic.detail.SingleObjectTemplateResponseMixin
    • django.views.generic.base.TemplateResponseMixin
    • django.views.generic.edit.BaseCreateView
    • django.views.generic.edit.ModelFormMixin:该Mixin起主要作用,modelFroms类表单起主要作用
      • model:指定要表单实例化的模型,否则将通过self.objectqueryset来确定
      • fields:用来展示的字段,注意不能和form_class一起使用,但必须和model一起使用
      • success_url
      • get_form_class():默认情况下为form_class给定的值
      • get_form_kwargs()
      • get_success_url()
      • form_valid(form)
      • form_invalid(form)
    • django.views.generic.edit.FormMixin
    • django.views.generic.detail.SingleObjectMixin
    • django.views.generic.edit.ProcessFormView
    • django.views.generic.base.View
  • 属性

    • template_name_suffix:可以设置模板后缀,通常配合get_template_name使用,在没有设置template_name时起很大作用,默认为全小写的模型名_form
    • object:被创建的对象,还未创建时为None
  • 示例

    from django.views.generic.edit import CreateView
    from myapp.models import Author
    
    class AuthorCreate(CreateView):
        model = Author
        fields = ['name']
    

UpdateView

一个用于编辑现有对象、重新显示带有验证错误的表单(如果存在验证错误)和保存对对象的更改的表单的视图。这将使用从对象的模型类自动生成的表单(除非手动指定了表单类)。

  • 导入

    from django.views.generic.edit import UpdateView
    
  • 继承自

    • django.views.generic.detail.SingleObjectTemplateResponseMixin
    • django.views.generic.base.TemplateResponseMixin
    • django.views.generic.edit.BaseUpdateView
    • django.views.generic.edit.ModelFormMixin
    • django.views.generic.edit.FormMixin
    • django.views.generic.detail.SingleObjectMixin
    • django.views.generic.edit.ProcessFormView
    • django.views.generic.base.View

DeleteView

一个显示确认页或者删除现有对象的视图。只有当请求方法为POST时,才会删除给定的对象。如果这个视图是通过GET获取的,它将显示一个确认页面,其中应该包含一个发送到相同URL的表单。

  • 继承自
    • django.views.generic.detail.SingleObjectTemplateResponseMixin
    • django.views.generic.base.TemplateResponseMixin
    • django.views.generic.edit.BaseDeleteView
    • django.views.generic.edit.DeletionMixin
    • django.views.generic.detail.baseDetailView
      • success_url:当删除成功后跳转的路径
      • delete(request,*args,**kwargs):重写此方法,可以在删除的同时给与一定逻辑或其他功能
      • get_success_url():返回指定对象已被成功删除时要重定向到的URL。默认情况下返回success_url
    • django.views.generic.edit.SingleObjectMinxn
    • django.views.generic.base.View

通用日期视图

ArchiveIndexView

展示一个按日期显示最新对象到顶部的索引页 。带有未来日期的对象默认不会展示在索引页除非设置allow_future=True

  • 导入

    import ArchiveIndexView
    
  • 继承自

    • django.views.generic.list.MultipleObjectTemplateResponseMixin
    • django.views.generic.base.TemplateResponseMixin
    • django.views.generic.dates.BaseArchiveIndexView
    • django.views.generic.dates.BaseDateListView
    • django.views.generic.list.MultipleObjectMixin
    • django.views.generic.dates.DateMixin:为所有基于日期的视图提供公共行为的mixin类
      • date_field:根据模型中带有DateField或者DateTimeField的字段来决定对象索引页的展示顺序,注意如果开启了时区支持且选择了DateTimeField类型的字段则有可能带来时区问题导致每个不同时区的用户得到不同的排列结果,所以应该尽可能选择DateField类型的字段
      • allow_future
      • get_date_field()
      • get_allow_future()
    • django.views.generic.base.View
  • 注意:

    • context将包含一个根据可用年份进行降序排列的QuerySet对象 ,表示为datetime.datetime对象,默认名为date_list
    • 默认使用context_object_name将完整对象列表更改为latest
    • 默认template_name_suffix:_archive
    • 默认根据年份排列,但也可以使用属性date_list_period来改变为根据月份或天
  • 示例:

    from django.urls import path
    from django.views.generic.dates import ArchiveIndexView
    
    from myapp.models import Article
    
    urlpatterns = [
        path('archive/',
             ArchiveIndexView.as_view(model=Article, date_field="pub_date"),
             name="article_archive"),
    ]
    

    模板中

    <ul>
        {% for article in latest %}
            <li>{{ article.pub_date }}: {{ article.title }}</li>
        {% endfor %}
    </ul>
    

YearArchiveView

根据给定年份中中所有对象的可用月份进行归档的视图。带有未来日期的对象默认不会展示在索引页除非设置allow_future=True

  • 继承自

    • django.views.generic.list.MultipleObjectTemplateResponseMixin
    • django.views.generic.base.TemplateResponseMixin
    • django.views.generic.dates.BaseYearArchiveView
    • django.views.generic.dates.YearMixin:给日期的年份组件提供解析信息的Mixin
      • year_format:解析年份时所需的strftime()格式,默认情况下为%Y
      • year:选择一个年份,字符串形式,默认情况下为None,这意味着将通过其他方式确认年份
      • get_year_format():默认情况下即返回year_format的值,可重写
      • get_year():返回识图所选择的年份,字符串形式,将根据三个来源:year、URL pattern中捕获到的年份参数、GET方法查询字符串中所带的year关键字。若都没有找到则引起404错误
      • get_next_year(date):返回一个date对象,该对象为给定年份后一年的第一天,并且将根据allow_emptyallow_future的值返回404错误或None
      • get_previous_year(date):返回一个date对象,该对象为给定年份前一年的第一天,并且将根据allow_emptyallow_future的值返回404错误或None
    • django.views.generic.dates.BaseDateListView
    • django.views.generic.list.MultipleObjectMixin
    • django.views.generic.dates.DateMixin
    • django.views.generic.base.View
  • 属性或方法

    • make_object_list:布尔值,将根据值来决定是否检索给定年的完整对象列表并将其传递给模板。若为True将把完整对象列表传递给模板上下文,若为False则会传递一个None。默认情况下,将为False
    • get_make_object_list:决定对象列表是否作为上下文的一部分返回。默认情况下返回make_object_list
    • context:出来默认列表识图默认传递的上下文,还将包含:
      • date_list:根据Queryset的所有可用月份进行升序排列的Queryset对象,表示为datetime.datetime对象
      • Year:date对象,为给定的年份
      • next_year:date对象,给定年份后一年的第一天
      • previous_year:date对象,给定年份前一年的第一天
  • 注意:

    • 默认template_name_suffix:_archive_year
  • 示例:

    URL pattern:

    from django.urls import path
    
    from myapp.views import ArticleYearArchiveView
    
    urlpatterns = [
        path('<int:year>/',
             ArticleYearArchiveView.as_view(),
             name="article_year_archive"),
    ]
    

    视图中:

    from django.views.generic.dates import YearArchiveView
    
    from myapp.models import Article
    
    class ArticleYearArchiveView(YearArchiveView):
        queryset = Article.objects.all()
        date_field = "pub_date"
        make_object_list = True
        allow_future = True
    

    模板中:注意·date_listobject_list是两个完全不同的对象,object_list是根据make_object_list的值生成的完整对象列表,

    <ul>
        {% for date in date_list %}
            <li>{{ date|date }}</li>
        {% endfor %}
    </ul>
    
    <div>
        <h1>All Articles for {{ year|date:"Y" }}</h1>
        {% for obj in object_list %}
            <p>
                {{ obj.title }} - {{ obj.pub_date|date:"F j, Y" }}
            </p>
        {% endfor %}
    </div>
    

MonthArchiveView

显示给定月份中所有对象的月归档页面。 带有未来日期的对象默认不会展示在索引页除非设置allow_future=True

  • 继承自:

    • django.views.generic.list.MultipleObjectTemplateResponseMixin
    • django.views.generic.base.TemplateResponseMixin
    • django.views.generic.dates.BaseMonthArchiveView
    • django.views.generic.dates.YearMixin
    • django.views.generic.dates.MonthMixin:给日期的年份组件提供解析信息的Mixin
      • month_format:%b
      • month
      • get_month_format()
      • get_month()
      • get_next_month(date):返回一个date对象,为后一个月份的第一天
      • get_previous_month(date)
    • django.views.generic.dates.BaseDateListView
    • django.views.generic.list.MultipleObjectMixin
    • django.views.generic.dates.DateMixin
    • django.views.generic.base.View
  • context:除了BaseDateListView提供的常规上下文,还将有

    • date_list
    • month
    • next_month
    • previous_month
  • 注意:

    • 默认template_name_suffix:_archive_month
  • 示例:

    URL pattern中

    from django.urls import path
    
    from myapp.views import ArticleMonthArchiveView
    
    urlpatterns = [
        # Example: /2012/08/
        path('<int:year>/<int:month>/',
             ArticleMonthArchiveView.as_view(month_format='%m'),
             name="archive_month_numeric"),
        # Example: /2012/aug/
        path('<int:year>/<str:month>/',
             ArticleMonthArchiveView.as_view(),
             name="archive_month"),
    ]
    

    视图中

    from django.views.generic.dates import MonthArchiveView
    
    from myapp.models import Article
    
    class ArticleMonthArchiveView(MonthArchiveView):
        queryset = Article.objects.all()
        date_field = "pub_date"
        allow_future = True
    

    模板中

    <ul>
        {% for article in object_list %}
            <li>{{ article.pub_date|date:"F j, Y" }}: {{ article.title }}</li>
        {% endfor %}
    </ul>
    
    <p>
        {% if previous_month %}
            Previous Month: {{ previous_month|date:"F Y" }}
        {% endif %}
        {% if next_month %}
            Next Month: {{ next_month|date:"F Y" }}
        {% endif %}
    </p>
    

WeekArchiveView

显示给定周中所有对象的归档页面。 带有未来日期的对象默认不会展示在索引页除非设置allow_future=True

  • 继承自:

    • django.views.generic.list.MultipleObjectTemplateResponseMixin
    • django.views.generic.base.TemplateResponseMixin
    • django.views.generic.dates.BaseWeekArchiveView
    • django.views.generic.dates.YearMixin
    • django.views.generic.dates.WeekMixin:可用于检索和提供日期的星期解析组件mixin
      • week_format:默认为%U,这意味着一周从周日开始;如果从周一开始,请设置为%W
      • week
      • get_week_format()
      • get_week()
      • get_next_week(date):返回一个date对象,为后一个星期的第一天
      • get_previous_week(date)
    • django.views.generic.dates.BaseDateListView
    • django.views.generic.list.MultipleObjectMixin
    • django.views.generic.dates.DateMixin
    • django.views.generic.base.View
  • context:除了BaseDateListView提供的常规上下文,还将有

    • date_list
    • week
    • next_week
    • previous_week
  • 注意:

    • 默认template_name_suffix:_archive_week
    • 使用date模板日期解析器输出的周数不总是和strftime()strpttime()输出的周数相同,如2015年,前者就总是比后者解析出的周数多1,因此避免使用前者在模板中生成URL传递给WeekArchiveView
  • 示例:

    URL pattern中:

    from django.urls import path
    
    from myapp.views import ArticleWeekArchiveView
    
    urlpatterns = [
        # Example: /2012/week/23/
        path('<int:year>/week/<int:week>/',
             ArticleWeekArchiveView.as_view(),
             name="archive_week"),
    ]
    

    视图中:

    from django.views.generic.dates import WeekArchiveView
    
    from myapp.models import Article
    
    class ArticleWeekArchiveView(WeekArchiveView):
        queryset = Article.objects.all()
        date_field = "pub_date"
        week_format = "%W"
        allow_future = True
    

    模板中:

    <h1>Week {{ week|date:'W' }}</h1>
    
    <ul>
        {% for article in object_list %}
            <li>{{ article.pub_date|date:"F j, Y" }}: {{ article.title }}</li>
        {% endfor %}
    </ul>
    
    <p>
        {% if previous_week %}
            Previous Week: {{ previous_week|date:"W" }} of year {{ previous_week|date:"Y" }}
        {% endif %}
        {% if previous_week and next_week %}--{% endif %}
        {% if next_week %}
            Next week: {{ next_week|date:"W" }} of year {{ next_week|date:"Y" }}
        {% endif %}
    </p>
    

DayArchiveView

显示给定日中所有对象的日归档页面。 带有未来日期的对象默认不会展示在索引页除非设置allow_future=True,并且若设为False,不管将来是否有对象存在,都会抛出404错误。

  • 继承自:

    • django.views.generic.list.MultipleObjectTemplateResponseMixin
    • django.views.generic.base.TemplateResponseMixin
    • django.views.generic.dates.BaseDayArchiveView
    • django.views.generic.dates.YearMixin
    • django.views.generic.dates.MonthMixin
    • django.views.generic.dates.DayMixin:可用于检索和提供日期的日解析组件mixin
      • day_format:%d
      • day
      • get_day_format()
      • get_day()
      • get_next_day(date):返回一个date对象,为后一天
      • get_previous_day(date)
    • django.views.generic.dates.BaseDateListView
    • django.views.generic.list.MultipleObjectMixin
    • django.views.generic.dates.DateMixin
    • django.views.generic.base.View
  • context:除了BaseDateListView提供的常规上下文,还将有

    • date_list
    • day
    • next_day
    • previous_day
  • 注意:

    • 默认template_name_suffix:_archive_day
  • 示例

    URL pattern中:

    from django.urls import path
    
    from myapp.views import ArticleDayArchiveView
    
    urlpatterns = [
        # Example: /2012/nov/10/
        path('<int:year>/<str:month>/<int:day>/',
             ArticleDayArchiveView.as_view(),
             name="archive_day"),
    ]
    

    视图中:

    from django.views.generic.dates import DayArchiveView
    
    from myapp.models import Article
    
    class ArticleDayArchiveView(DayArchiveView):
        queryset = Article.objects.all()
        date_field = "pub_date"
        allow_future = True
    

    模板中

    <h1>{{ day }}</h1>
    
    <ul>
        {% for article in object_list %}
            <li>{{ article.pub_date|date:"F j, Y" }}: {{ article.title }}</li>
        {% endfor %}
    </ul>
    
    <p>
        {% if previous_day %}
            Previous Day: {{ previous_day }}
        {% endif %}
        {% if previous_day and next_day %}--{% endif %}
        {% if next_day %}
            Next Day: {{ next_day }}
        {% endif %}
    </p>
    

TodayArchiveView

显示今天所有对象的日归档页面。本视图基本与DayArchiveView相同,除了用今天的日期代替了 year/month/day 参数.

  • 继承自:

    • django.views.generic.list.MultipleObjectTemplateResponseMixin
    • django.views.generic.base.TemplateResponseMixin
    • django.views.generic.dates.BaseTodayArchiveView
    • django.views.generic.dates.BaseDayArchiveView
    • django.views.generic.dates.YearMixin
    • django.views.generic.dates.MonthMixin
    • django.views.generic.dates.DayMixin
    • django.views.generic.dates.BaseDateListView
    • django.views.generic.list.MultipleObjectMixin
    • django.views.generic.dates.DateMixin
    • django.views.generic.base.View
  • 注意:

    • 默认template_name_suffix:_archive_today
  • 示例

    URL pattern中

    from django.urls import path
    
    from myapp.views import ArticleTodayArchiveView
    
    urlpatterns = [
        path('today/',
             ArticleTodayArchiveView.as_view(),
             name="archive_today"),
    ]
    

    视图中

    from django.views.generic.dates import TodayArchiveView
    
    from myapp.models import Article
    
    class ArticleTodayArchiveView(TodayArchiveView):
        queryset = Article.objects.all()
        date_field = "pub_date"
        allow_future = True
    

    模板与DayArchiveDay相同

DateDatailView

表示单个对象的视图类,如果该对象的日期位于将来将抛出404错误,除非设置allow_future=True

  • 继承自:

    • django.views.generic.list.SingleObjectTemplateResponseMixin:与前面归档的视图类的不同
    • django.views.generic.base.TemplateResponseMixin
    • django.views.generic.dates.BaseDateDetailView
    • django.views.generic.dates.YearMixin
    • django.views.generic.dates.MonthMixin
    • django.views.generic.dates.DayMixin
    • django.views.generic.dates.BaseDetailView
    • django.views.generic.list.SingleObjectMixin
    • django.views.generic.dates.DateMixin
    • django.views.generic.base.View
  • context中将包含model中的单个对象

  • 注意:

    • 默认template_name_suffix:_detail
  • 示例:

    URL pattern中

    from django.urls import path
    from django.views.generic.dates import DateDetailView
    
    urlpatterns = [
        path('<int:year>/<str:month>/<int:day>/<int:pk>/',
             DateDetailView.as_view(model=Article, date_field="pub_date"),
             name="archive_date_detail"),
    ]
    

    模板中

    <h1>{{ object.title }}</h1>
    

比较

  • 上面列出的所有通用视图都有匹配的Base的基本视图,它们唯一的区别在于它们是否包括MultipleObjectTemplateResponseMixin类(用于归档视图)或SingleObjectTemplateResponseMixin(用于详细识图):

    BaseArchiveIndexView

    BaseYearArchiveView

    BaseMonthArchiveView

    BaseWeekArchiveView

    BaseDayArchiveView

    BaseTodayArchiveView

    BaseDateDetailView

BaseDateListView基础类详解

为所有基于日期的归档类视图提供公共行为的基类,上述日期类除了DateDatailView类都继承了此类。通常不会实例化BaseDateListView而是实例化其一个子类。

当这个视图(及其子类)执行时,self.object_list将包含视图正在操作的对象列表,self.date_list将包含数据可用的日期列表。一般配合·make_object_list一起使用 。

  • 继承自:
    • DateMixin
    • MultipleObjectMixin
  • 方法和属性:
    • allow_empty:布尔值,指定在没有对象可用时是否显示页面。若为的且没有对象可用,视图将显示一个空页面,而不是引发404,默认为False
    • date_list_period:为date_list选择一个聚合期,字符串类型,必须为year/month/day中的一种
    • date_list_items():返回一个包含(date_list、object_list、extra_context)的三元组,extra_context是一个上下文数据字典,它将被添加到MultipleObjectMixin提供的任何上下文数据中。
    • get_dated_queryset(**lookup):返回一个queryset,使用lookup可利用自定义的查询参数进行二次筛选,可对queryset执行任何限制。
    • get_date_list_period():返回date_list的聚合周期。默认情况下返回date_list_period的值。
    • get_date_list(queryset,date_type=None,ordering='ASC'):返回querysetdate_type类型的可用的日期列表。比如get_date_list(qs,'year')将返回qs中以年份为聚合期的日期列表。如果date_type没有被提供,则使用get_date_list_period所设置的值。ordering可设置排序方式。最终date_typeording都将被传递给QuerySet.dates()
posted @ 2020-05-14 11:48  言兴  阅读(140)  评论(0)    收藏  举报