summaryrefslogtreecommitdiff
path: root/docs/intro/tutorial05.txt
diff options
context:
space:
mode:
authorTim Graham <timograham@gmail.com>2013-05-11 19:08:57 -0400
committerTim Graham <timograham@gmail.com>2013-05-11 19:08:57 -0400
commit679a2ac843567d32c95ccc46a215bc453ccfa2d0 (patch)
treefeb266d4d6eb65d3f4e960efc5d53d63da5a0b6c /docs/intro/tutorial05.txt
parenta6edde326057c0bf2e7cf8929ba8f238a7fd2b41 (diff)
Fixed #20249 - Removed a "feature" in the tutorial that doesn't actually work.
Thanks bmispelon for the report and draft patch.
Diffstat (limited to 'docs/intro/tutorial05.txt')
-rw-r--r--docs/intro/tutorial05.txt77
1 files changed, 35 insertions, 42 deletions
diff --git a/docs/intro/tutorial05.txt b/docs/intro/tutorial05.txt
index 67a40aba40..a276763d67 100644
--- a/docs/intro/tutorial05.txt
+++ b/docs/intro/tutorial05.txt
@@ -378,45 +378,40 @@ Improving our view
The list of polls shows polls that aren't published yet (i.e. those that have a
``pub_date`` in the future). Let's fix that.
-In :doc:`Tutorial 4 </intro/tutorial04>` we deleted the view functions from
-``views.py`` in favor of a :class:`~django.views.generic.list.ListView` in
-``urls.py``::
+In :doc:`Tutorial 4 </intro/tutorial04>` we introduced a class-based view,
+based on :class:`~django.views.generic.list.ListView`::
- url(r'^$',
- ListView.as_view(
- queryset=Poll.objects.order_by('-pub_date')[:5],
- context_object_name='latest_poll_list',
- template_name='polls/index.html'),
- name='index'),
+ class IndexView(generic.ListView):
+ template_name = 'polls/index.html'
+ context_object_name = 'latest_poll_list'
+
+ def get_queryset(self):
+ """Return the last five published polls."""
+ return Poll.objects.order_by('-pub_date')[:5]
``response.context_data['latest_poll_list']`` extracts the data this view
places into the context.
-We need to amend the line that gives us the ``queryset``::
-
- queryset=Poll.objects.order_by('-pub_date')[:5],
-
-Let's change the queryset so that it also checks the date by comparing it with
-``timezone.now()``. First we need to add an import::
+We need to amend the ``get_queryset`` method and change it so that it also
+checks the date by comparing it with ``timezone.now()``. First we need to add
+an import::
from django.utils import timezone
-and then we must amend the existing ``url`` function to::
+and then we must amend the ``get_queryset`` method like so::
- url(r'^$',
- ListView.as_view(
- queryset=Poll.objects.filter(pub_date__lte=timezone.now) \
- .order_by('-pub_date')[:5],
- context_object_name='latest_poll_list',
- template_name='polls/index.html'),
- name='index'),
+ def get_queryset(self):
+ """
+ Return the last five published polls (not including those set to be
+ published in the future).
+ """
+ return Poll.objects.filter(
+ pub_date__lte=timezone.now()
+ ).order_by('-pub_date')[:5]
-``Poll.objects.filter(pub_date__lte=timezone.now)`` returns a queryset
+``Poll.objects.filter(pub_date__lte=timezone.now())`` returns a queryset
containing Polls whose ``pub_date`` is less than or equal to - that is, earlier
-than or equal to - ``timezone.now``. Notice that we use a callable queryset
-argument, ``timezone.now``, which will be evaluated at request time. If we had
-included the parentheses, ``timezone.now()`` would be evaluated just once when
-the web server is started.
+than or equal to - ``timezone.now``.
Testing our new view
--------------------
@@ -527,20 +522,18 @@ Testing the ``DetailView``
What we have works well; however, even though future polls don't appear in the
*index*, users can still reach them if they know or guess the right URL. So we
-need similar constraints in the ``DetailViews``, by adding::
-
- queryset=Poll.objects.filter(pub_date__lte=timezone.now)
+need to add a similar constraint to ``DetailView``::
-to them - for example::
- url(r'^(?P<pk>\d+)/$',
- DetailView.as_view(
- queryset=Poll.objects.filter(pub_date__lte=timezone.now),
- model=Poll,
- template_name='polls/detail.html'),
- name='detail'),
+ class DetailView(generic.DetailView):
+ ...
+ def get_queryset(self):
+ """
+ Excludes any polls that aren't published yet.
+ """
+ return Poll.objects.filter(pub_date__lte=timezone.now())
-and of course, we will add some tests, to check that a ``Poll`` whose
+And of course, we will add some tests, to check that a ``Poll`` whose
``pub_date`` is in the past can be displayed, and that one with a ``pub_date``
in the future is not::
@@ -566,9 +559,9 @@ in the future is not::
Ideas for more tests
--------------------
-We ought to add similar ``queryset`` arguments to the other ``DetailView``
-URLs, and create a new test class for each view. They'll be very similar to
-what we have just created; in fact there will be a lot of repetition.
+We ought to add a similar ``get_queryset`` method to ``ResultsView`` and
+create a new test class for that view. It'll be very similar to what we have
+just created; in fact there will be a lot of repetition.
We could also improve our application in other ways, adding tests along the
way. For example, it's silly that ``Polls`` can be published on the site that