diff options
| author | Tim Graham <timograham@gmail.com> | 2013-05-11 19:08:57 -0400 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2013-05-11 19:08:57 -0400 |
| commit | 679a2ac843567d32c95ccc46a215bc453ccfa2d0 (patch) | |
| tree | feb266d4d6eb65d3f4e960efc5d53d63da5a0b6c /docs/intro/tutorial05.txt | |
| parent | a6edde326057c0bf2e7cf8929ba8f238a7fd2b41 (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.txt | 77 |
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 |
