1. =====================
    
  2. Generic display views
    
  3. =====================
    
  4. 
    
  5. The two following generic class-based views are designed to display data. On
    
  6. many projects they are typically the most commonly used views.
    
  7. 
    
  8. ``DetailView``
    
  9. ==============
    
  10. 
    
  11. .. class:: django.views.generic.detail.DetailView
    
  12. 
    
  13.     While this view is executing, ``self.object`` will contain the object that
    
  14.     the view is operating upon.
    
  15. 
    
  16.     **Ancestors (MRO)**
    
  17. 
    
  18.     This view inherits methods and attributes from the following views:
    
  19. 
    
  20.     * :class:`django.views.generic.detail.SingleObjectTemplateResponseMixin`
    
  21.     * :class:`django.views.generic.base.TemplateResponseMixin`
    
  22.     * :class:`django.views.generic.detail.BaseDetailView`
    
  23.     * :class:`django.views.generic.detail.SingleObjectMixin`
    
  24.     * :class:`django.views.generic.base.View`
    
  25. 
    
  26.     **Method Flowchart**
    
  27. 
    
  28.     #. :meth:`~django.views.generic.base.View.setup()`
    
  29.     #. :meth:`~django.views.generic.base.View.dispatch()`
    
  30.     #. :meth:`~django.views.generic.base.View.http_method_not_allowed()`
    
  31.     #. :meth:`~django.views.generic.base.TemplateResponseMixin.get_template_names()`
    
  32.     #. :meth:`~django.views.generic.detail.SingleObjectMixin.get_slug_field()`
    
  33.     #. :meth:`~django.views.generic.detail.SingleObjectMixin.get_queryset()`
    
  34.     #. :meth:`~django.views.generic.detail.SingleObjectMixin.get_object()`
    
  35.     #. :meth:`~django.views.generic.detail.SingleObjectMixin.get_context_object_name()`
    
  36.     #. :meth:`~django.views.generic.detail.SingleObjectMixin.get_context_data()`
    
  37.     #. :meth:`~django.views.generic.detail.BaseDetailView.get`
    
  38.     #. :meth:`~django.views.generic.base.TemplateResponseMixin.render_to_response()`
    
  39. 
    
  40.     **Example myapp/views.py**::
    
  41. 
    
  42.         from django.utils import timezone
    
  43.         from django.views.generic.detail import DetailView
    
  44. 
    
  45.         from articles.models import Article
    
  46. 
    
  47.         class ArticleDetailView(DetailView):
    
  48. 
    
  49.             model = Article
    
  50. 
    
  51.             def get_context_data(self, **kwargs):
    
  52.                 context = super().get_context_data(**kwargs)
    
  53.                 context['now'] = timezone.now()
    
  54.                 return context
    
  55. 
    
  56.     **Example myapp/urls.py**::
    
  57. 
    
  58.         from django.urls import path
    
  59. 
    
  60.         from article.views import ArticleDetailView
    
  61. 
    
  62.         urlpatterns = [
    
  63.             path('<slug:slug>/', ArticleDetailView.as_view(), name='article-detail'),
    
  64.         ]
    
  65. 
    
  66.     **Example myapp/article_detail.html**:
    
  67. 
    
  68.     .. code-block:: html+django
    
  69. 
    
  70.         <h1>{{ object.headline }}</h1>
    
  71.         <p>{{ object.content }}</p>
    
  72.         <p>Reporter: {{ object.reporter }}</p>
    
  73.         <p>Published: {{ object.pub_date|date }}</p>
    
  74.         <p>Date: {{ now|date }}</p>
    
  75. 
    
  76. .. class:: django.views.generic.detail.BaseDetailView
    
  77. 
    
  78.     A base view for displaying a single object. It is not intended to be used
    
  79.     directly, but rather as a parent class of the
    
  80.     :class:`django.views.generic.detail.DetailView` or other views representing
    
  81.     details of a single object.
    
  82. 
    
  83.     **Ancestors (MRO)**
    
  84. 
    
  85.     This view inherits methods and attributes from the following views:
    
  86. 
    
  87.     * :class:`django.views.generic.detail.SingleObjectMixin`
    
  88.     * :class:`django.views.generic.base.View`
    
  89. 
    
  90.     **Methods**
    
  91. 
    
  92.     .. method:: get(request, *args, **kwargs)
    
  93. 
    
  94.         Adds ``object`` to the context.
    
  95. 
    
  96. ``ListView``
    
  97. ============
    
  98. 
    
  99. .. class:: django.views.generic.list.ListView
    
  100. 
    
  101.     A page representing a list of objects.
    
  102. 
    
  103.     While this view is executing, ``self.object_list`` will contain the list of
    
  104.     objects (usually, but not necessarily a queryset) that the view is
    
  105.     operating upon.
    
  106. 
    
  107.     **Ancestors (MRO)**
    
  108. 
    
  109.     This view inherits methods and attributes from the following views:
    
  110. 
    
  111.     * :class:`django.views.generic.list.MultipleObjectTemplateResponseMixin`
    
  112.     * :class:`django.views.generic.base.TemplateResponseMixin`
    
  113.     * :class:`django.views.generic.list.BaseListView`
    
  114.     * :class:`django.views.generic.list.MultipleObjectMixin`
    
  115.     * :class:`django.views.generic.base.View`
    
  116. 
    
  117.     **Method Flowchart**
    
  118. 
    
  119.     #. :meth:`~django.views.generic.base.View.setup()`
    
  120.     #. :meth:`~django.views.generic.base.View.dispatch()`
    
  121.     #. :meth:`~django.views.generic.base.View.http_method_not_allowed()`
    
  122.     #. :meth:`~django.views.generic.base.TemplateResponseMixin.get_template_names()`
    
  123.     #. :meth:`~django.views.generic.list.MultipleObjectMixin.get_queryset()`
    
  124.     #. :meth:`~django.views.generic.list.MultipleObjectMixin.get_context_object_name()`
    
  125.     #. :meth:`~django.views.generic.list.MultipleObjectMixin.get_context_data()`
    
  126.     #. :meth:`~django.views.generic.list.BaseListView.get`
    
  127.     #. :meth:`~django.views.generic.base.TemplateResponseMixin.render_to_response()`
    
  128. 
    
  129.     **Example views.py**::
    
  130. 
    
  131.         from django.utils import timezone
    
  132.         from django.views.generic.list import ListView
    
  133. 
    
  134.         from articles.models import Article
    
  135. 
    
  136.         class ArticleListView(ListView):
    
  137. 
    
  138.             model = Article
    
  139.             paginate_by = 100  # if pagination is desired
    
  140. 
    
  141.             def get_context_data(self, **kwargs):
    
  142.                 context = super().get_context_data(**kwargs)
    
  143.                 context['now'] = timezone.now()
    
  144.                 return context
    
  145. 
    
  146.     **Example myapp/urls.py**::
    
  147. 
    
  148.         from django.urls import path
    
  149. 
    
  150.         from article.views import ArticleListView
    
  151. 
    
  152.         urlpatterns = [
    
  153.             path('', ArticleListView.as_view(), name='article-list'),
    
  154.         ]
    
  155. 
    
  156.     **Example myapp/article_list.html**:
    
  157. 
    
  158.     .. code-block:: html+django
    
  159. 
    
  160.         <h1>Articles</h1>
    
  161.         <ul>
    
  162.         {% for article in object_list %}
    
  163.             <li>{{ article.pub_date|date }} - {{ article.headline }}</li>
    
  164.         {% empty %}
    
  165.             <li>No articles yet.</li>
    
  166.         {% endfor %}
    
  167.         </ul>
    
  168. 
    
  169.     If you're using pagination, you can adapt the :ref:`example template from
    
  170.     the pagination docs <paginating-a-list-view>`.
    
  171. 
    
  172. .. class:: django.views.generic.list.BaseListView
    
  173. 
    
  174.     A base view for displaying a list of objects. It is not intended to be used
    
  175.     directly, but rather as a parent class of the
    
  176.     :class:`django.views.generic.list.ListView` or other views representing
    
  177.     lists of objects.
    
  178. 
    
  179.     **Ancestors (MRO)**
    
  180. 
    
  181.     This view inherits methods and attributes from the following views:
    
  182. 
    
  183.     * :class:`django.views.generic.list.MultipleObjectMixin`
    
  184.     * :class:`django.views.generic.base.View`
    
  185. 
    
  186.     **Methods**
    
  187. 
    
  188.     .. method:: get(request, *args, **kwargs)
    
  189. 
    
  190.         Adds ``object_list`` to the context. If
    
  191.         :attr:`~django.views.generic.list.MultipleObjectMixin.allow_empty`
    
  192.         is True then display an empty list. If
    
  193.         :attr:`~django.views.generic.list.MultipleObjectMixin.allow_empty` is
    
  194.         False then raise a 404 error.