base.txt 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. ==========
  2. Base views
  3. ==========
  4. The following three classes provide much of the functionality needed to create
  5. Django views. You may think of them as *parent* views, which can be used by
  6. themselves or inherited from. They may not provide all the capabilities
  7. required for projects, in which case there are Mixins and Generic class-based
  8. views.
  9. Many of Django's built-in class-based views inherit from other class-based
  10. views or various mixins. Because this inheritance chain is very important, the
  11. ancestor classes are documented under the section title of **Ancestors (MRO)**.
  12. MRO is an acronym for Method Resolution Order.
  13. View
  14. ----
  15. .. class:: django.views.generic.base.View
  16. The master class-based base view. All other class-based views inherit from
  17. this base class.
  18. **Method Flowchart**
  19. 1. :meth:`dispatch()`
  20. 2. :meth:`http_method_not_allowed()`
  21. 3. :meth:`options()`
  22. **Example views.py**::
  23. from django.http import HttpResponse
  24. from django.views.generic import View
  25. class MyView(View):
  26. def get(self, request, *args, **kwargs):
  27. return HttpResponse('Hello, World!')
  28. **Example urls.py**::
  29. from django.conf.urls import patterns, url
  30. from myapp.views import MyView
  31. urlpatterns = patterns('',
  32. url(r'^mine/$', MyView.as_view(), name='my-view'),
  33. )
  34. **Attributes**
  35. .. attribute:: http_method_names
  36. The list of HTTP method names that this view will accept.
  37. Default::
  38. ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']
  39. **Methods**
  40. .. classmethod:: as_view(**initkwargs)
  41. Returns a callable view that takes a request and returns a response::
  42. response = MyView.as_view()(request)
  43. .. method:: dispatch(request, *args, **kwargs)
  44. The ``view`` part of the view -- the method that accepts a ``request``
  45. argument plus arguments, and returns a HTTP response.
  46. The default implementation will inspect the HTTP method and attempt to
  47. delegate to a method that matches the HTTP method; a ``GET`` will be
  48. delegated to ``get()``, a ``POST`` to ``post()``, and so on.
  49. By default, a ``HEAD`` request will be delegated to ``get()``.
  50. If you need to handle ``HEAD`` requests in a different way than ``GET``,
  51. you can override the ``head()`` method. See
  52. :ref:`supporting-other-http-methods` for an example.
  53. The default implementation also sets ``request``, ``args`` and
  54. ``kwargs`` as instance variables, so any method on the view can know
  55. the full details of the request that was made to invoke the view.
  56. .. method:: http_method_not_allowed(request, *args, **kwargs)
  57. If the view was called with a HTTP method it doesn't support, this
  58. method is called instead.
  59. The default implementation returns ``HttpResponseNotAllowed`` with a
  60. list of allowed methods in plain text.
  61. .. method:: options(request, *args, **kwargs)
  62. Handles responding to requests for the OPTIONS HTTP verb. Returns a
  63. list of the allowed HTTP method names for the view.
  64. TemplateView
  65. ------------
  66. .. class:: django.views.generic.base.TemplateView
  67. Renders a given template, with the context containing parameters captured
  68. in the URL.
  69. **Ancestors (MRO)**
  70. This view inherits methods and attributes from the following views:
  71. * :class:`django.views.generic.base.TemplateResponseMixin`
  72. * :class:`django.views.generic.base.View`
  73. **Method Flowchart**
  74. 1. :meth:`~django.views.generic.base.View.dispatch()`
  75. 2. :meth:`~django.views.generic.base.View.http_method_not_allowed()`
  76. 3. :meth:`~django.views.generic.base.ContextMixin.get_context_data()`
  77. **Example views.py**::
  78. from django.views.generic.base import TemplateView
  79. from articles.models import Article
  80. class HomePageView(TemplateView):
  81. template_name = "home.html"
  82. def get_context_data(self, **kwargs):
  83. context = super(HomePageView, self).get_context_data(**kwargs)
  84. context['latest_articles'] = Article.objects.all()[:5]
  85. return context
  86. **Example urls.py**::
  87. from django.conf.urls import patterns, url
  88. from myapp.views import HomePageView
  89. urlpatterns = patterns('',
  90. url(r'^$', HomePageView.as_view(), name='home'),
  91. )
  92. **Context**
  93. * ``params``: The dictionary of keyword arguments captured from the URL
  94. pattern that served the view.
  95. RedirectView
  96. ------------
  97. .. class:: django.views.generic.base.RedirectView
  98. Redirects to a given URL.
  99. The given URL may contain dictionary-style string formatting, which will be
  100. interpolated against the parameters captured in the URL. Because keyword
  101. interpolation is *always* done (even if no arguments are passed in), any
  102. ``"%"`` characters in the URL must be written as ``"%%"`` so that Python
  103. will convert them to a single percent sign on output.
  104. If the given URL is ``None``, Django will return an ``HttpResponseGone``
  105. (410).
  106. **Ancestors (MRO)**
  107. This view inherits methods and attributes from the following view:
  108. * :class:`django.views.generic.base.View`
  109. **Method Flowchart**
  110. 1. :meth:`~django.views.generic.base.View.dispatch()`
  111. 2. :meth:`~django.views.generic.base.View.http_method_not_allowed()`
  112. 3. :meth:`get_redirect_url()`
  113. **Example views.py**::
  114. from django.shortcuts import get_object_or_404
  115. from django.views.generic.base import RedirectView
  116. from articles.models import Article
  117. class ArticleCounterRedirectView(RedirectView):
  118. permanent = False
  119. query_string = True
  120. pattern_name = 'article-detail'
  121. def get_redirect_url(self, *args, **kwargs):
  122. article = get_object_or_404(Article, pk=pk)
  123. article.update_counter()
  124. return super(ArticleCounterRedirectView, self).get_redirect_url(*args, **kwargs)
  125. **Example urls.py**::
  126. from django.conf.urls import patterns, url
  127. from django.views.generic.base import RedirectView
  128. from article.views import ArticleCounterRedirectView, ArticleDetail
  129. urlpatterns = patterns('',
  130. url(r'^counter/(?P<pk>\d+)/$', ArticleCounterRedirectView.as_view(), name='article-counter'),
  131. url(r'^details/(?P<pk>\d+)/$', ArticleDetail.as_view(), name='article-detail'),
  132. url(r'^go-to-django/$', RedirectView.as_view(url='http://djangoproject.com'), name='go-to-django'),
  133. )
  134. **Attributes**
  135. .. attribute:: url
  136. The URL to redirect to, as a string. Or ``None`` to raise a 410 (Gone)
  137. HTTP error.
  138. .. attribute:: pattern_name
  139. .. versionadded:: 1.6
  140. The name of the URL pattern to redirect to. Reversing will be done
  141. using the same args and kwargs as are passed in for this view.
  142. .. attribute:: permanent
  143. Whether the redirect should be permanent. The only difference here is
  144. the HTTP status code returned. If ``True``, then the redirect will use
  145. status code 301. If ``False``, then the redirect will use status code
  146. 302. By default, ``permanent`` is ``True``.
  147. .. attribute:: query_string
  148. Whether to pass along the GET query string to the new location. If
  149. ``True``, then the query string is appended to the URL. If ``False``,
  150. then the query string is discarded. By default, ``query_string`` is
  151. ``False``.
  152. **Methods**
  153. .. method:: get_redirect_url(**kwargs)
  154. Constructs the target URL for redirection.
  155. The default implementation uses :attr:`url` as a starting
  156. string, performs expansion of ``%`` parameters in that string, as well
  157. as the appending of query string if requested by :attr:`query_string`.
  158. Subclasses may implement any behavior they wish, as long as the method
  159. returns a redirect-ready URL string.