Browse files

Fixed #18476 - Added use of {% url %} tag to tutorial.

Thanks Claude Paroz for the patch.
  • Loading branch information...
1 parent 07d70e9 commit 690ed5794672495e4cffca9a4a701008d254a4e7 @timgraham timgraham committed Jul 29, 2012
Showing with 33 additions and 7 deletions.
  1. +17 −0 docs/intro/tutorial03.txt
  2. +16 −7 docs/intro/tutorial04.txt
@@ -533,5 +533,22 @@ under "/content/polls/", or any other path root, and the app will still work.
All the poll app cares about is its relative path, not its absolute path.
+Removing hardcoded URLs in templates
+Remember, when we wrote the link to a poll in our template, the link was
+partially hardcoded like this:
+.. code-block:: html+django
+ <li><a href="/polls/{{ }}/">{{ poll.question }}</a></li>
+To use the decoupled URLs we've just introduced, replace the hardcoded link
+with the :ttag:`url` template tag:
+.. code-block:: html+django
+ <li><a href="{% url 'polls.views.detail' %}">{{ poll.question }}</a></li>
When you're comfortable with writing views, read :doc:`part 4 of this tutorial
</intro/tutorial04>` to learn about simple form processing and generic views.
@@ -18,7 +18,7 @@ tutorial, so that the template contains an HTML ``<form>`` element:
{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}
- <form action="/polls/{{ }}/vote/" method="post">
+ <form action="{% url '' %}" method="post">
{% csrf_token %}
{% for choice in poll.choice_set.all %}
<input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ }}" />
@@ -35,7 +35,7 @@ A quick rundown:
selects one of the radio buttons and submits the form, it'll send the
POST data ``choice=3``. This is HTML Forms 101.
-* We set the form's ``action`` to ``/polls/{{ }}/vote/``, and we
+* We set the form's ``action`` to ``{% url '' %}``, and we
set ``method="post"``. Using ``method="post"`` (as opposed to
``method="get"``) is very important, because the act of submitting this
form will alter data server-side. Whenever you create a form that alters
@@ -172,7 +172,7 @@ Now, create a ``results.html`` template:
{% endfor %}
- <a href="/polls/{{ }}/">Vote again?</a>
+ <a href="{% url 'polls.views.detail' %}">Vote again?</a>
Now, go to ``/polls/1/`` in your browser and vote in the poll. You should see a
results page that gets updated each time you vote. If you submit the form
@@ -238,11 +238,13 @@ Change it like so::
- template_name='polls/index.html')),
+ template_name='polls/index.html'),
+ name='poll_index'),
- template_name='polls/detail.html')),
+ template_name='polls/detail.html'),
+ name='poll_detail'),
@@ -265,8 +267,8 @@ two views abstract the concepts of "display a list of objects" and
``"pk"``, so we've changed ``poll_id`` to ``pk`` for the generic
-* We've added a name, ``poll_results``, to the results view so
- that we have a way to refer to its URL later on (see the
+* We've added the ``name`` argument to the views (e.g. ``name='poll_results'``)
+ so that we have a way to refer to their URL later on (see the
documentation about :ref:`naming URL patterns
<naming-url-patterns>` for information). We're also using the
:func:`~django.conf.urls.url` function from
@@ -317,6 +319,13 @@ function anymore -- generic views can be (and are) used multiple times
return HttpResponseRedirect(reverse('poll_results', args=(,)))
+The same rule apply for the :ttag:`url` template tag. For example in the
+``results.html`` template:
+.. code-block:: html+django
+ <a href="{% url 'poll_detail' %}">Vote again?</a>
Run the server, and use your new polling app based on generic views.
For full details on generic views, see the :doc:`generic views documentation

0 comments on commit 690ed57

Please sign in to comment.