Sophie

Sophie

distrib > Fedora > 17 > x86_64 > by-pkgid > b6f82ea76d5134c5709ffcc9dc9e29c5 > files > 391

Django-doc-1.4.5-1.fc17.noarch.rpm


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">


<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    
    <title>Writing your first Django app, part 3 &mdash; Django 1.4.5 documentation</title>
    
    <link rel="stylesheet" href="../_static/default.css" type="text/css" />
    <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
    
    <script type="text/javascript">
      var DOCUMENTATION_OPTIONS = {
        URL_ROOT:    '../',
        VERSION:     '1.4.5',
        COLLAPSE_INDEX: false,
        FILE_SUFFIX: '.html',
        HAS_SOURCE:  true
      };
    </script>
    <script type="text/javascript" src="../_static/jquery.js"></script>
    <script type="text/javascript" src="../_static/underscore.js"></script>
    <script type="text/javascript" src="../_static/doctools.js"></script>
    <link rel="top" title="Django 1.4.5 documentation" href="../index.html" />
    <link rel="up" title="Getting started" href="index.html" />
    <link rel="next" title="Writing your first Django app, part 4" href="tutorial04.html" />
    <link rel="prev" title="Writing your first Django app, part 2" href="tutorial02.html" />
 
<script type="text/javascript" src="../templatebuiltins.js"></script>
<script type="text/javascript">
(function($) {
    if (!django_template_builtins) {
       // templatebuiltins.js missing, do nothing.
       return;
    }
    $(document).ready(function() {
        // Hyperlink Django template tags and filters
        var base = "../ref/templates/builtins.html";
        if (base == "#") {
            // Special case for builtins.html itself
            base = "";
        }
        // Tags are keywords, class '.k'
        $("div.highlight\\-html\\+django span.k").each(function(i, elem) {
             var tagname = $(elem).text();
             if ($.inArray(tagname, django_template_builtins.ttags) != -1) {
                 var fragment = tagname.replace(/_/, '-');
                 $(elem).html("<a href='" + base + "#" + fragment + "'>" + tagname + "</a>");
             }
        });
        // Filters are functions, class '.nf'
        $("div.highlight\\-html\\+django span.nf").each(function(i, elem) {
             var filtername = $(elem).text();
             if ($.inArray(filtername, django_template_builtins.tfilters) != -1) {
                 var fragment = filtername.replace(/_/, '-');
                 $(elem).html("<a href='" + base + "#" + fragment + "'>" + filtername + "</a>");
             }
        });
    });
})(jQuery);
</script>

  </head>
  <body>

    <div class="document">
  <div id="custom-doc" class="yui-t6">
    <div id="hd">
      <h1><a href="../index.html">Django 1.4.5 documentation</a></h1>
      <div id="global-nav">
        <a title="Home page" href="../index.html">Home</a>  |
        <a title="Table of contents" href="../contents.html">Table of contents</a>  |
        <a title="Global index" href="../genindex.html">Index</a>  |
        <a title="Module index" href="../py-modindex.html">Modules</a>
      </div>
      <div class="nav">
    &laquo; <a href="tutorial02.html" title="Writing your first Django app, part 2">previous</a> 
     |
    <a href="index.html" title="Getting started" accesskey="U">up</a>
   |
    <a href="tutorial04.html" title="Writing your first Django app, part 4">next</a> &raquo;</div>
    </div>
    
    <div id="bd">
      <div id="yui-main">
        <div class="yui-b">
          <div class="yui-g" id="intro-tutorial03">
            
  <div class="section" id="s-writing-your-first-django-app-part-3">
<span id="writing-your-first-django-app-part-3"></span><h1>Writing your first Django app, part 3<a class="headerlink" href="#writing-your-first-django-app-part-3" title="Permalink to this headline">¶</a></h1>
<p>This tutorial begins where <a class="reference internal" href="tutorial02.html"><em>Tutorial 2</em></a> left off. We&#8217;re
continuing the Web-poll application and will focus on creating the public
interface &#8211; &#8220;views.&#8221;</p>
<div class="section" id="s-philosophy">
<span id="philosophy"></span><h2>Philosophy<a class="headerlink" href="#philosophy" title="Permalink to this headline">¶</a></h2>
<p>A view is a &#8220;type&#8221; of Web page in your Django application that generally serves
a specific function and has a specific template. For example, in a Weblog
application, you might have the following views:</p>
<ul class="simple">
<li>Blog homepage &#8211; displays the latest few entries.</li>
<li>Entry &#8220;detail&#8221; page &#8211; permalink page for a single entry.</li>
<li>Year-based archive page &#8211; displays all months with entries in the
given year.</li>
<li>Month-based archive page &#8211; displays all days with entries in the
given month.</li>
<li>Day-based archive page &#8211; displays all entries in the given day.</li>
<li>Comment action &#8211; handles posting comments to a given entry.</li>
</ul>
<p>In our poll application, we&#8217;ll have the following four views:</p>
<ul class="simple">
<li>Poll &#8220;index&#8221; page &#8211; displays the latest few polls.</li>
<li>Poll &#8220;detail&#8221; page &#8211; displays a poll question, with no results but
with a form to vote.</li>
<li>Poll &#8220;results&#8221; page &#8211; displays results for a particular poll.</li>
<li>Vote action &#8211; handles voting for a particular choice in a particular
poll.</li>
</ul>
<p>In Django, each view is represented by a simple Python function.</p>
</div>
<div class="section" id="s-design-your-urls">
<span id="design-your-urls"></span><h2>Design your URLs<a class="headerlink" href="#design-your-urls" title="Permalink to this headline">¶</a></h2>
<p>The first step of writing views is to design your URL structure. You do this by
creating a Python module, called a URLconf. URLconfs are how Django associates
a given URL with given Python code.</p>
<p>When a user requests a Django-powered page, the system looks at the
<a class="reference internal" href="../ref/settings.html#std:setting-ROOT_URLCONF"><tt class="xref std std-setting docutils literal"><span class="pre">ROOT_URLCONF</span></tt></a> setting, which contains a string in Python dotted
syntax. Django loads that module and looks for a module-level variable called
<tt class="docutils literal"><span class="pre">urlpatterns</span></tt>, which is a sequence of tuples in the following format:</p>
<div class="highlight-python"><pre>(regular expression, Python callback function [, optional dictionary])</pre>
</div>
<p>Django starts at the first regular expression and makes its way down the list,
comparing the requested URL against each regular expression until it finds one
that matches.</p>
<p>When it finds a match, Django calls the Python callback function, with an
<a class="reference internal" href="../ref/request-response.html#django.http.HttpRequest" title="django.http.HttpRequest"><tt class="xref py py-class docutils literal"><span class="pre">HttpRequest</span></tt></a> object as the first argument, any &#8220;captured&#8221;
values from the regular expression as keyword arguments, and, optionally,
arbitrary keyword arguments from the dictionary (an optional third item in the
tuple).</p>
<p>For more on <a class="reference internal" href="../ref/request-response.html#django.http.HttpRequest" title="django.http.HttpRequest"><tt class="xref py py-class docutils literal"><span class="pre">HttpRequest</span></tt></a> objects, see the
<a class="reference internal" href="../ref/request-response.html"><em>Request and response objects</em></a>. For more details on URLconfs, see the
<a class="reference internal" href="../topics/http/urls.html"><em>URL dispatcher</em></a>.</p>
<p>When you ran <tt class="docutils literal"><span class="pre">django-admin.py</span> <span class="pre">startproject</span> <span class="pre">mysite</span></tt> at the beginning of
Tutorial 1, it created a default URLconf in <tt class="docutils literal"><span class="pre">mysite/urls.py</span></tt>. It also
automatically set your <a class="reference internal" href="../ref/settings.html#std:setting-ROOT_URLCONF"><tt class="xref std std-setting docutils literal"><span class="pre">ROOT_URLCONF</span></tt></a> setting (in <tt class="docutils literal"><span class="pre">settings.py</span></tt>) to
point at that file:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">ROOT_URLCONF</span> <span class="o">=</span> <span class="s">&#39;mysite.urls&#39;</span>
</pre></div>
</div>
<p>Time for an example. Edit <tt class="docutils literal"><span class="pre">mysite/urls.py</span></tt> so it looks like this:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">django.conf.urls</span> <span class="kn">import</span> <span class="n">patterns</span><span class="p">,</span> <span class="n">include</span><span class="p">,</span> <span class="n">url</span>

<span class="kn">from</span> <span class="nn">django.contrib</span> <span class="kn">import</span> <span class="n">admin</span>
<span class="n">admin</span><span class="o">.</span><span class="n">autodiscover</span><span class="p">()</span>

<span class="n">urlpatterns</span> <span class="o">=</span> <span class="n">patterns</span><span class="p">(</span><span class="s">&#39;&#39;</span><span class="p">,</span>
    <span class="n">url</span><span class="p">(</span><span class="s">r&#39;^polls/$&#39;</span><span class="p">,</span> <span class="s">&#39;polls.views.index&#39;</span><span class="p">),</span>
    <span class="n">url</span><span class="p">(</span><span class="s">r&#39;^polls/(?P&lt;poll_id&gt;\d+)/$&#39;</span><span class="p">,</span> <span class="s">&#39;polls.views.detail&#39;</span><span class="p">),</span>
    <span class="n">url</span><span class="p">(</span><span class="s">r&#39;^polls/(?P&lt;poll_id&gt;\d+)/results/$&#39;</span><span class="p">,</span> <span class="s">&#39;polls.views.results&#39;</span><span class="p">),</span>
    <span class="n">url</span><span class="p">(</span><span class="s">r&#39;^polls/(?P&lt;poll_id&gt;\d+)/vote/$&#39;</span><span class="p">,</span> <span class="s">&#39;polls.views.vote&#39;</span><span class="p">),</span>
    <span class="n">url</span><span class="p">(</span><span class="s">r&#39;^admin/&#39;</span><span class="p">,</span> <span class="n">include</span><span class="p">(</span><span class="n">admin</span><span class="o">.</span><span class="n">site</span><span class="o">.</span><span class="n">urls</span><span class="p">)),</span>
<span class="p">)</span>
</pre></div>
</div>
<p>This is worth a review. When somebody requests a page from your Web site &#8211; say,
&#8220;/polls/23/&#8221;, Django will load this Python module, because it&#8217;s pointed to by
the <a class="reference internal" href="../ref/settings.html#std:setting-ROOT_URLCONF"><tt class="xref std std-setting docutils literal"><span class="pre">ROOT_URLCONF</span></tt></a> setting. It finds the variable named <tt class="docutils literal"><span class="pre">urlpatterns</span></tt>
and traverses the regular expressions in order. When it finds a regular
expression that matches &#8211; <tt class="docutils literal"><span class="pre">r'^polls/(?P&lt;poll_id&gt;\d+)/$'</span></tt> &#8211; it loads the
function <tt class="docutils literal"><span class="pre">detail()</span></tt> from <tt class="docutils literal"><span class="pre">polls/views.py</span></tt>. Finally, it calls that
<tt class="docutils literal"><span class="pre">detail()</span></tt> function like so:</p>
<div class="highlight-python"><pre>detail(request=&lt;HttpRequest object&gt;, poll_id='23')</pre>
</div>
<p>The <tt class="docutils literal"><span class="pre">poll_id='23'</span></tt> part comes from <tt class="docutils literal"><span class="pre">(?P&lt;poll_id&gt;\d+)</span></tt>. Using parentheses
around a pattern &#8220;captures&#8221; the text matched by that pattern and sends it as an
argument to the view function; the <tt class="docutils literal"><span class="pre">?P&lt;poll_id&gt;</span></tt> defines the name that will be
used to identify the matched pattern; and <tt class="docutils literal"><span class="pre">\d+</span></tt> is a regular expression to
match a sequence of digits (i.e., a number).</p>
<p>Because the URL patterns are regular expressions, there really is no limit on
what you can do with them. And there&#8217;s no need to add URL cruft such as <tt class="docutils literal"><span class="pre">.php</span></tt>
&#8211; unless you have a sick sense of humor, in which case you can do something
like this:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="p">(</span><span class="s">r&#39;^polls/latest\.php$&#39;</span><span class="p">,</span> <span class="s">&#39;polls.views.index&#39;</span><span class="p">),</span>
</pre></div>
</div>
<p>But, don&#8217;t do that. It&#8217;s silly.</p>
<p>Note that these regular expressions do not search GET and POST parameters, or
the domain name. For example, in a request to <tt class="docutils literal"><span class="pre">http://www.example.com/myapp/</span></tt>,
the URLconf will look for <tt class="docutils literal"><span class="pre">myapp/</span></tt>. In a request to
<tt class="docutils literal"><span class="pre">http://www.example.com/myapp/?page=3</span></tt>, the URLconf will look for <tt class="docutils literal"><span class="pre">myapp/</span></tt>.</p>
<p>If you need help with regular expressions, see <a class="reference external" href="http://en.wikipedia.org/wiki/Regular_expression">Wikipedia&#8217;s entry</a> and the
documentation of the <tt class="xref py py-mod docutils literal"><span class="pre">re</span></tt> module. Also, the O&#8217;Reilly book &#8220;Mastering
Regular Expressions&#8221; by Jeffrey Friedl is fantastic.</p>
<p>Finally, a performance note: these regular expressions are compiled the first
time the URLconf module is loaded. They&#8217;re super fast.</p>
</div>
<div class="section" id="s-write-your-first-view">
<span id="write-your-first-view"></span><h2>Write your first view<a class="headerlink" href="#write-your-first-view" title="Permalink to this headline">¶</a></h2>
<p>Well, we haven&#8217;t created any views yet &#8211; we just have the URLconf. But let&#8217;s
make sure Django is following the URLconf properly.</p>
<p>Fire up the Django development Web server:</p>
<div class="highlight-bash"><div class="highlight"><pre>python manage.py runserver
</pre></div>
</div>
<p>Now go to &#8220;<a class="reference external" href="http://localhost:8000/polls/">http://localhost:8000/polls/</a>&#8221; on your domain in your Web browser.
You should get a pleasantly-colored error page with the following message:</p>
<div class="highlight-python"><pre>ViewDoesNotExist at /polls/

Could not import polls.views.index. View does not exist in module polls.views.</pre>
</div>
<p>This error happened because you haven&#8217;t written a function <tt class="docutils literal"><span class="pre">index()</span></tt> in the
module <tt class="docutils literal"><span class="pre">polls/views.py</span></tt>.</p>
<p>Try &#8220;/polls/23/&#8221;, &#8220;/polls/23/results/&#8221; and &#8220;/polls/23/vote/&#8221;. The error
messages tell you which view Django tried (and failed to find, because you
haven&#8217;t written any views yet).</p>
<p>Time to write the first view. Open the file <tt class="docutils literal"><span class="pre">polls/views.py</span></tt>
and put the following Python code in it:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">django.http</span> <span class="kn">import</span> <span class="n">HttpResponse</span>

<span class="k">def</span> <span class="nf">index</span><span class="p">(</span><span class="n">request</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">HttpResponse</span><span class="p">(</span><span class="s">&quot;Hello, world. You&#39;re at the poll index.&quot;</span><span class="p">)</span>
</pre></div>
</div>
<p>This is the simplest view possible. Go to &#8220;/polls/&#8221; in your browser, and you
should see your text.</p>
<p>Now lets add a few more views. These views are slightly different, because
they take an argument (which, remember, is passed in from whatever was
captured by the regular expression in the URLconf):</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">def</span> <span class="nf">detail</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">poll_id</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">HttpResponse</span><span class="p">(</span><span class="s">&quot;You&#39;re looking at poll </span><span class="si">%s</span><span class="s">.&quot;</span> <span class="o">%</span> <span class="n">poll_id</span><span class="p">)</span>

<span class="k">def</span> <span class="nf">results</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">poll_id</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">HttpResponse</span><span class="p">(</span><span class="s">&quot;You&#39;re looking at the results of poll </span><span class="si">%s</span><span class="s">.&quot;</span> <span class="o">%</span> <span class="n">poll_id</span><span class="p">)</span>

<span class="k">def</span> <span class="nf">vote</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">poll_id</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">HttpResponse</span><span class="p">(</span><span class="s">&quot;You&#39;re voting on poll </span><span class="si">%s</span><span class="s">.&quot;</span> <span class="o">%</span> <span class="n">poll_id</span><span class="p">)</span>
</pre></div>
</div>
<p>Take a look in your browser, at &#8220;/polls/34/&#8221;. It&#8217;ll run the <cite>detail()</cite> method
and display whatever ID you provide in the URL. Try &#8220;/polls/34/results/&#8221; and
&#8220;/polls/34/vote/&#8221; too &#8211; these will display the placeholder results and voting
pages.</p>
</div>
<div class="section" id="s-write-views-that-actually-do-something">
<span id="write-views-that-actually-do-something"></span><h2>Write views that actually do something<a class="headerlink" href="#write-views-that-actually-do-something" title="Permalink to this headline">¶</a></h2>
<p>Each view is responsible for doing one of two things: Returning an
<a class="reference internal" href="../ref/request-response.html#django.http.HttpResponse" title="django.http.HttpResponse"><tt class="xref py py-class docutils literal"><span class="pre">HttpResponse</span></tt></a> object containing the content for the
requested page, or raising an exception such as <a class="reference internal" href="../topics/http/views.html#django.http.Http404" title="django.http.Http404"><tt class="xref py py-exc docutils literal"><span class="pre">Http404</span></tt></a>. The
rest is up to you.</p>
<p>Your view can read records from a database, or not. It can use a template
system such as Django&#8217;s &#8211; or a third-party Python template system &#8211; or not.
It can generate a PDF file, output XML, create a ZIP file on the fly, anything
you want, using whatever Python libraries you want.</p>
<p>All Django wants is that <a class="reference internal" href="../ref/request-response.html#django.http.HttpResponse" title="django.http.HttpResponse"><tt class="xref py py-class docutils literal"><span class="pre">HttpResponse</span></tt></a>. Or an exception.</p>
<p>Because it&#8217;s convenient, let&#8217;s use Django&#8217;s own database API, which we covered
in <a class="reference internal" href="tutorial01.html"><em>Tutorial 1</em></a>. Here&#8217;s one stab at the <tt class="docutils literal"><span class="pre">index()</span></tt>
view, which displays the latest 5 poll questions in the system, separated by
commas, according to publication date:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">polls.models</span> <span class="kn">import</span> <span class="n">Poll</span>
<span class="kn">from</span> <span class="nn">django.http</span> <span class="kn">import</span> <span class="n">HttpResponse</span>

<span class="k">def</span> <span class="nf">index</span><span class="p">(</span><span class="n">request</span><span class="p">):</span>
    <span class="n">latest_poll_list</span> <span class="o">=</span> <span class="n">Poll</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">all</span><span class="p">()</span><span class="o">.</span><span class="n">order_by</span><span class="p">(</span><span class="s">&#39;-pub_date&#39;</span><span class="p">)[:</span><span class="mi">5</span><span class="p">]</span>
    <span class="n">output</span> <span class="o">=</span> <span class="s">&#39;, &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="n">p</span><span class="o">.</span><span class="n">question</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">latest_poll_list</span><span class="p">])</span>
    <span class="k">return</span> <span class="n">HttpResponse</span><span class="p">(</span><span class="n">output</span><span class="p">)</span>
</pre></div>
</div>
<p>There&#8217;s a problem here, though: The page&#8217;s design is hard-coded in the view. If
you want to change the way the page looks, you&#8217;ll have to edit this Python code.
So let&#8217;s use Django&#8217;s template system to separate the design from Python:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">django.template</span> <span class="kn">import</span> <span class="n">Context</span><span class="p">,</span> <span class="n">loader</span>
<span class="kn">from</span> <span class="nn">polls.models</span> <span class="kn">import</span> <span class="n">Poll</span>
<span class="kn">from</span> <span class="nn">django.http</span> <span class="kn">import</span> <span class="n">HttpResponse</span>

<span class="k">def</span> <span class="nf">index</span><span class="p">(</span><span class="n">request</span><span class="p">):</span>
    <span class="n">latest_poll_list</span> <span class="o">=</span> <span class="n">Poll</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">all</span><span class="p">()</span><span class="o">.</span><span class="n">order_by</span><span class="p">(</span><span class="s">&#39;-pub_date&#39;</span><span class="p">)[:</span><span class="mi">5</span><span class="p">]</span>
    <span class="n">t</span> <span class="o">=</span> <span class="n">loader</span><span class="o">.</span><span class="n">get_template</span><span class="p">(</span><span class="s">&#39;polls/index.html&#39;</span><span class="p">)</span>
    <span class="n">c</span> <span class="o">=</span> <span class="n">Context</span><span class="p">({</span>
        <span class="s">&#39;latest_poll_list&#39;</span><span class="p">:</span> <span class="n">latest_poll_list</span><span class="p">,</span>
    <span class="p">})</span>
    <span class="k">return</span> <span class="n">HttpResponse</span><span class="p">(</span><span class="n">t</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="n">c</span><span class="p">))</span>
</pre></div>
</div>
<p>That code loads the template called &#8220;polls/index.html&#8221; and passes it a context.
The context is a dictionary mapping template variable names to Python objects.</p>
<p>Reload the page. Now you&#8217;ll see an error:</p>
<div class="highlight-python"><pre>TemplateDoesNotExist at /polls/
polls/index.html</pre>
</div>
<p>Ah. There&#8217;s no template yet. First, create a directory, somewhere on your
filesystem, whose contents Django can access. (Django runs as whatever user your
server runs.) Don&#8217;t put them under your document root, though. You probably
shouldn&#8217;t make them public, just for security&#8217;s sake.
Then edit <a class="reference internal" href="../ref/settings.html#std:setting-TEMPLATE_DIRS"><tt class="xref std std-setting docutils literal"><span class="pre">TEMPLATE_DIRS</span></tt></a> in your <tt class="docutils literal"><span class="pre">settings.py</span></tt> to tell Django where
it can find templates &#8211; just as you did in the &#8220;Customize the admin look and
feel&#8221; section of Tutorial 2.</p>
<p>When you&#8217;ve done that, create a directory <tt class="docutils literal"><span class="pre">polls</span></tt> in your template directory.
Within that, create a file called <tt class="docutils literal"><span class="pre">index.html</span></tt>. Note that our
<tt class="docutils literal"><span class="pre">loader.get_template('polls/index.html')</span></tt> code from above maps to
&#8220;[template_directory]/polls/index.html&#8221; on the filesystem.</p>
<p>Put the following code in that template:</p>
<div class="highlight-html+django"><div class="highlight"><pre><span class="cp">{%</span> <span class="k">if</span> <span class="nv">latest_poll_list</span> <span class="cp">%}</span>
    <span class="nt">&lt;ul&gt;</span>
    <span class="cp">{%</span> <span class="k">for</span> <span class="nv">poll</span> <span class="k">in</span> <span class="nv">latest_poll_list</span> <span class="cp">%}</span>
        <span class="nt">&lt;li&gt;&lt;a</span> <span class="na">href=</span><span class="s">&quot;/polls/</span><span class="cp">{{</span> <span class="nv">poll.id</span> <span class="cp">}}</span><span class="s">/&quot;</span><span class="nt">&gt;</span><span class="cp">{{</span> <span class="nv">poll.question</span> <span class="cp">}}</span><span class="nt">&lt;/a&gt;&lt;/li&gt;</span>
    <span class="cp">{%</span> <span class="k">endfor</span> <span class="cp">%}</span>
    <span class="nt">&lt;/ul&gt;</span>
<span class="cp">{%</span> <span class="k">else</span> <span class="cp">%}</span>
    <span class="nt">&lt;p&gt;</span>No polls are available.<span class="nt">&lt;/p&gt;</span>
<span class="cp">{%</span> <span class="k">endif</span> <span class="cp">%}</span>
</pre></div>
</div>
<p>Load the page in your Web browser, and you should see a bulleted-list
containing the &#8220;What&#8217;s up&#8221; poll from Tutorial 1. The link points to the poll&#8217;s
detail page.</p>
<div class="section" id="s-a-shortcut-render-to-response">
<span id="a-shortcut-render-to-response"></span><h3>A shortcut: render_to_response()<a class="headerlink" href="#a-shortcut-render-to-response" title="Permalink to this headline">¶</a></h3>
<p>It&#8217;s a very common idiom to load a template, fill a context and return an
<a class="reference internal" href="../ref/request-response.html#django.http.HttpResponse" title="django.http.HttpResponse"><tt class="xref py py-class docutils literal"><span class="pre">HttpResponse</span></tt></a> object with the result of the rendered
template. Django provides a shortcut. Here&#8217;s the full <tt class="docutils literal"><span class="pre">index()</span></tt> view,
rewritten:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">django.shortcuts</span> <span class="kn">import</span> <span class="n">render_to_response</span>
<span class="kn">from</span> <span class="nn">polls.models</span> <span class="kn">import</span> <span class="n">Poll</span>

<span class="k">def</span> <span class="nf">index</span><span class="p">(</span><span class="n">request</span><span class="p">):</span>
    <span class="n">latest_poll_list</span> <span class="o">=</span> <span class="n">Poll</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">all</span><span class="p">()</span><span class="o">.</span><span class="n">order_by</span><span class="p">(</span><span class="s">&#39;-pub_date&#39;</span><span class="p">)[:</span><span class="mi">5</span><span class="p">]</span>
    <span class="k">return</span> <span class="n">render_to_response</span><span class="p">(</span><span class="s">&#39;polls/index.html&#39;</span><span class="p">,</span> <span class="p">{</span><span class="s">&#39;latest_poll_list&#39;</span><span class="p">:</span> <span class="n">latest_poll_list</span><span class="p">})</span>
</pre></div>
</div>
<p>Note that once we&#8217;ve done this in all these views, we no longer need to import
<tt class="xref py py-mod docutils literal"><span class="pre">loader</span></tt>, <a class="reference internal" href="../ref/templates/api.html#django.template.Context" title="django.template.Context"><tt class="xref py py-class docutils literal"><span class="pre">Context</span></tt></a> and
<a class="reference internal" href="../ref/request-response.html#django.http.HttpResponse" title="django.http.HttpResponse"><tt class="xref py py-class docutils literal"><span class="pre">HttpResponse</span></tt></a>.</p>
<p>The <a class="reference internal" href="../topics/http/shortcuts.html#django.shortcuts.render_to_response" title="django.shortcuts.render_to_response"><tt class="xref py py-func docutils literal"><span class="pre">render_to_response()</span></tt></a> function takes a template name
as its first argument and a dictionary as its optional second argument. It
returns an <a class="reference internal" href="../ref/request-response.html#django.http.HttpResponse" title="django.http.HttpResponse"><tt class="xref py py-class docutils literal"><span class="pre">HttpResponse</span></tt></a> object of the given template
rendered with the given context.</p>
</div>
</div>
<div class="section" id="s-raising-404">
<span id="raising-404"></span><h2>Raising 404<a class="headerlink" href="#raising-404" title="Permalink to this headline">¶</a></h2>
<p>Now, let&#8217;s tackle the poll detail view &#8211; the page that displays the question
for a given poll. Here&#8217;s the view:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">django.http</span> <span class="kn">import</span> <span class="n">Http404</span>
<span class="c"># ...</span>
<span class="k">def</span> <span class="nf">detail</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">poll_id</span><span class="p">):</span>
    <span class="k">try</span><span class="p">:</span>
        <span class="n">p</span> <span class="o">=</span> <span class="n">Poll</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">pk</span><span class="o">=</span><span class="n">poll_id</span><span class="p">)</span>
    <span class="k">except</span> <span class="n">Poll</span><span class="o">.</span><span class="n">DoesNotExist</span><span class="p">:</span>
        <span class="k">raise</span> <span class="n">Http404</span>
    <span class="k">return</span> <span class="n">render_to_response</span><span class="p">(</span><span class="s">&#39;polls/detail.html&#39;</span><span class="p">,</span> <span class="p">{</span><span class="s">&#39;poll&#39;</span><span class="p">:</span> <span class="n">p</span><span class="p">})</span>
</pre></div>
</div>
<p>The new concept here: The view raises the <a class="reference internal" href="../topics/http/views.html#django.http.Http404" title="django.http.Http404"><tt class="xref py py-exc docutils literal"><span class="pre">Http404</span></tt></a> exception
if a poll with the requested ID doesn&#8217;t exist.</p>
<p>We&#8217;ll discuss what you could put in that <tt class="docutils literal"><span class="pre">polls/detail.html</span></tt> template a bit
later, but if you&#8217;d like to quickly get the above example working, just:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="p">{{</span> <span class="n">poll</span> <span class="p">}}</span>
</pre></div>
</div>
<p>will get you started for now.</p>
<div class="section" id="s-a-shortcut-get-object-or-404">
<span id="a-shortcut-get-object-or-404"></span><h3>A shortcut: get_object_or_404()<a class="headerlink" href="#a-shortcut-get-object-or-404" title="Permalink to this headline">¶</a></h3>
<p>It&#8217;s a very common idiom to use <a class="reference internal" href="../ref/models/querysets.html#django.db.models.query.QuerySet.get" title="django.db.models.query.QuerySet.get"><tt class="xref py py-meth docutils literal"><span class="pre">get()</span></tt></a>
and raise <a class="reference internal" href="../topics/http/views.html#django.http.Http404" title="django.http.Http404"><tt class="xref py py-exc docutils literal"><span class="pre">Http404</span></tt></a> if the object doesn&#8217;t exist. Django
provides a shortcut. Here&#8217;s the <tt class="docutils literal"><span class="pre">detail()</span></tt> view, rewritten:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">django.shortcuts</span> <span class="kn">import</span> <span class="n">render_to_response</span><span class="p">,</span> <span class="n">get_object_or_404</span>
<span class="c"># ...</span>
<span class="k">def</span> <span class="nf">detail</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">poll_id</span><span class="p">):</span>
    <span class="n">p</span> <span class="o">=</span> <span class="n">get_object_or_404</span><span class="p">(</span><span class="n">Poll</span><span class="p">,</span> <span class="n">pk</span><span class="o">=</span><span class="n">poll_id</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">render_to_response</span><span class="p">(</span><span class="s">&#39;polls/detail.html&#39;</span><span class="p">,</span> <span class="p">{</span><span class="s">&#39;poll&#39;</span><span class="p">:</span> <span class="n">p</span><span class="p">})</span>
</pre></div>
</div>
<p>The <a class="reference internal" href="../topics/http/shortcuts.html#django.shortcuts.get_object_or_404" title="django.shortcuts.get_object_or_404"><tt class="xref py py-func docutils literal"><span class="pre">get_object_or_404()</span></tt></a> function takes a Django model
as its first argument and an arbitrary number of keyword arguments, which it
passes to the module&#8217;s <a class="reference internal" href="../ref/models/querysets.html#django.db.models.query.QuerySet.get" title="django.db.models.query.QuerySet.get"><tt class="xref py py-meth docutils literal"><span class="pre">get()</span></tt></a> function.
It raises <a class="reference internal" href="../topics/http/views.html#django.http.Http404" title="django.http.Http404"><tt class="xref py py-exc docutils literal"><span class="pre">Http404</span></tt></a> if the object doesn&#8217;t exist.</p>
<div class="admonition-philosophy admonition">
<p class="first admonition-title">Philosophy</p>
<p>Why do we use a helper function <a class="reference internal" href="../topics/http/shortcuts.html#django.shortcuts.get_object_or_404" title="django.shortcuts.get_object_or_404"><tt class="xref py py-func docutils literal"><span class="pre">get_object_or_404()</span></tt></a>
instead of automatically catching the
<a class="reference internal" href="../ref/exceptions.html#django.core.exceptions.ObjectDoesNotExist" title="django.core.exceptions.ObjectDoesNotExist"><tt class="xref py py-exc docutils literal"><span class="pre">ObjectDoesNotExist</span></tt></a> exceptions at a higher
level, or having the model API raise <a class="reference internal" href="../topics/http/views.html#django.http.Http404" title="django.http.Http404"><tt class="xref py py-exc docutils literal"><span class="pre">Http404</span></tt></a> instead of
<a class="reference internal" href="../ref/exceptions.html#django.core.exceptions.ObjectDoesNotExist" title="django.core.exceptions.ObjectDoesNotExist"><tt class="xref py py-exc docutils literal"><span class="pre">ObjectDoesNotExist</span></tt></a>?</p>
<p class="last">Because that would couple the model layer to the view layer. One of the
foremost design goals of Django is to maintain loose coupling.</p>
</div>
<p>There&#8217;s also a <a class="reference internal" href="../topics/http/shortcuts.html#django.shortcuts.get_list_or_404" title="django.shortcuts.get_list_or_404"><tt class="xref py py-func docutils literal"><span class="pre">get_list_or_404()</span></tt></a> function, which works
just as <a class="reference internal" href="../topics/http/shortcuts.html#django.shortcuts.get_object_or_404" title="django.shortcuts.get_object_or_404"><tt class="xref py py-func docutils literal"><span class="pre">get_object_or_404()</span></tt></a> &#8211; except using
<a class="reference internal" href="../ref/models/querysets.html#django.db.models.query.QuerySet.filter" title="django.db.models.query.QuerySet.filter"><tt class="xref py py-meth docutils literal"><span class="pre">filter()</span></tt></a> instead of
<a class="reference internal" href="../ref/models/querysets.html#django.db.models.query.QuerySet.get" title="django.db.models.query.QuerySet.get"><tt class="xref py py-meth docutils literal"><span class="pre">get()</span></tt></a>. It raises
<a class="reference internal" href="../topics/http/views.html#django.http.Http404" title="django.http.Http404"><tt class="xref py py-exc docutils literal"><span class="pre">Http404</span></tt></a> if the list is empty.</p>
</div>
</div>
<div class="section" id="s-write-a-404-page-not-found-view">
<span id="write-a-404-page-not-found-view"></span><h2>Write a 404 (page not found) view<a class="headerlink" href="#write-a-404-page-not-found-view" title="Permalink to this headline">¶</a></h2>
<p>When you raise <a class="reference internal" href="../topics/http/views.html#django.http.Http404" title="django.http.Http404"><tt class="xref py py-exc docutils literal"><span class="pre">Http404</span></tt></a> from within a view, Django
will load a special view devoted to handling 404 errors. It finds it
by looking for the variable <tt class="docutils literal"><span class="pre">handler404</span></tt> in your root URLconf (and
only in your root URLconf; setting <tt class="docutils literal"><span class="pre">handler404</span></tt> anywhere else will
have no effect), which is a string in Python dotted syntax &#8211; the same
format the normal URLconf callbacks use. A 404 view itself has nothing
special: It&#8217;s just a normal view.</p>
<p>You normally won&#8217;t have to bother with writing 404 views. If you don&#8217;t set
<tt class="docutils literal"><span class="pre">handler404</span></tt>, the built-in view <tt class="xref py py-func docutils literal"><span class="pre">django.views.defaults.page_not_found()</span></tt>
is used by default. In this case, you still have one obligation: create a
<tt class="docutils literal"><span class="pre">404.html</span></tt> template in the root of your template directory. The default 404
view will use that template for all 404 errors. If <a class="reference internal" href="../ref/settings.html#std:setting-DEBUG"><tt class="xref std std-setting docutils literal"><span class="pre">DEBUG</span></tt></a> is set to
<tt class="docutils literal"><span class="pre">False</span></tt> (in your settings module) and if you didn&#8217;t create a <tt class="docutils literal"><span class="pre">404.html</span></tt>
file, an <tt class="docutils literal"><span class="pre">Http500</span></tt> is raised instead. So remember to create a <tt class="docutils literal"><span class="pre">404.html</span></tt>.</p>
<p>A couple more things to note about 404 views:</p>
<ul class="simple">
<li>If <a class="reference internal" href="../ref/settings.html#std:setting-DEBUG"><tt class="xref std std-setting docutils literal"><span class="pre">DEBUG</span></tt></a> is set to <tt class="docutils literal"><span class="pre">True</span></tt> (in your settings module) then your
404 view will never be used (and thus the <tt class="docutils literal"><span class="pre">404.html</span></tt> template will never
be rendered) because the traceback will be displayed instead.</li>
<li>The 404 view is also called if Django doesn&#8217;t find a match after checking
every regular expression in the URLconf.</li>
</ul>
</div>
<div class="section" id="s-write-a-500-server-error-view">
<span id="write-a-500-server-error-view"></span><h2>Write a 500 (server error) view<a class="headerlink" href="#write-a-500-server-error-view" title="Permalink to this headline">¶</a></h2>
<p>Similarly, your root URLconf may define a <tt class="docutils literal"><span class="pre">handler500</span></tt>, which points
to a view to call in case of server errors. Server errors happen when
you have runtime errors in view code.</p>
</div>
<div class="section" id="s-use-the-template-system">
<span id="use-the-template-system"></span><h2>Use the template system<a class="headerlink" href="#use-the-template-system" title="Permalink to this headline">¶</a></h2>
<p>Back to the <tt class="docutils literal"><span class="pre">detail()</span></tt> view for our poll application. Given the context
variable <tt class="docutils literal"><span class="pre">poll</span></tt>, here&#8217;s what the &#8220;polls/detail.html&#8221; template might look
like:</p>
<div class="highlight-html+django"><div class="highlight"><pre><span class="nt">&lt;h1&gt;</span><span class="cp">{{</span> <span class="nv">poll.question</span> <span class="cp">}}</span><span class="nt">&lt;/h1&gt;</span>
<span class="nt">&lt;ul&gt;</span>
<span class="cp">{%</span> <span class="k">for</span> <span class="nv">choice</span> <span class="k">in</span> <span class="nv">poll.choice_set.all</span> <span class="cp">%}</span>
    <span class="nt">&lt;li&gt;</span><span class="cp">{{</span> <span class="nv">choice.choice</span> <span class="cp">}}</span><span class="nt">&lt;/li&gt;</span>
<span class="cp">{%</span> <span class="k">endfor</span> <span class="cp">%}</span>
<span class="nt">&lt;/ul&gt;</span>
</pre></div>
</div>
<p>The template system uses dot-lookup syntax to access variable attributes. In
the example of <tt class="docutils literal"><span class="pre">{{</span> <span class="pre">poll.question</span> <span class="pre">}}</span></tt>, first Django does a dictionary lookup
on the object <tt class="docutils literal"><span class="pre">poll</span></tt>. Failing that, it tries an attribute lookup &#8211; which
works, in this case. If attribute lookup had failed, it would&#8217;ve tried a
list-index lookup.</p>
<p>Method-calling happens in the <a class="reference internal" href="../ref/templates/builtins.html#std:templatetag-for"><tt class="xref std std-ttag docutils literal"><span class="pre">{%</span> <span class="pre">for</span> <span class="pre">%}</span></tt></a> loop:
<tt class="docutils literal"><span class="pre">poll.choice_set.all</span></tt> is interpreted as the Python code
<tt class="docutils literal"><span class="pre">poll.choice_set.all()</span></tt>, which returns an iterable of Choice objects and is
suitable for use in the <a class="reference internal" href="../ref/templates/builtins.html#std:templatetag-for"><tt class="xref std std-ttag docutils literal"><span class="pre">{%</span> <span class="pre">for</span> <span class="pre">%}</span></tt></a> tag.</p>
<p>See the <a class="reference internal" href="../topics/templates.html"><em>template guide</em></a> for more about templates.</p>
</div>
<div class="section" id="s-simplifying-the-urlconfs">
<span id="simplifying-the-urlconfs"></span><h2>Simplifying the URLconfs<a class="headerlink" href="#simplifying-the-urlconfs" title="Permalink to this headline">¶</a></h2>
<p>Take some time to play around with the views and template system. As you edit
the URLconf, you may notice there&#8217;s a fair bit of redundancy in it:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">urlpatterns</span> <span class="o">=</span> <span class="n">patterns</span><span class="p">(</span><span class="s">&#39;&#39;</span><span class="p">,</span>
    <span class="n">url</span><span class="p">(</span><span class="s">r&#39;^polls/$&#39;</span><span class="p">,</span> <span class="s">&#39;polls.views.index&#39;</span><span class="p">),</span>
    <span class="n">url</span><span class="p">(</span><span class="s">r&#39;^polls/(?P&lt;poll_id&gt;\d+)/$&#39;</span><span class="p">,</span> <span class="s">&#39;polls.views.detail&#39;</span><span class="p">),</span>
    <span class="n">url</span><span class="p">(</span><span class="s">r&#39;^polls/(?P&lt;poll_id&gt;\d+)/results/$&#39;</span><span class="p">,</span> <span class="s">&#39;polls.views.results&#39;</span><span class="p">),</span>
    <span class="n">url</span><span class="p">(</span><span class="s">r&#39;^polls/(?P&lt;poll_id&gt;\d+)/vote/$&#39;</span><span class="p">,</span> <span class="s">&#39;polls.views.vote&#39;</span><span class="p">),</span>
<span class="p">)</span>
</pre></div>
</div>
<p>Namely, <tt class="docutils literal"><span class="pre">polls.views</span></tt> is in every callback.</p>
<p>Because this is a common case, the URLconf framework provides a shortcut for
common prefixes. You can factor out the common prefixes and add them as the
first argument to <a class="reference internal" href="../topics/http/urls.html#django.conf.urls.patterns" title="django.conf.urls.patterns"><tt class="xref py py-func docutils literal"><span class="pre">patterns()</span></tt></a>, like so:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">urlpatterns</span> <span class="o">=</span> <span class="n">patterns</span><span class="p">(</span><span class="s">&#39;polls.views&#39;</span><span class="p">,</span>
    <span class="n">url</span><span class="p">(</span><span class="s">r&#39;^polls/$&#39;</span><span class="p">,</span> <span class="s">&#39;index&#39;</span><span class="p">),</span>
    <span class="n">url</span><span class="p">(</span><span class="s">r&#39;^polls/(?P&lt;poll_id&gt;\d+)/$&#39;</span><span class="p">,</span> <span class="s">&#39;detail&#39;</span><span class="p">),</span>
    <span class="n">url</span><span class="p">(</span><span class="s">r&#39;^polls/(?P&lt;poll_id&gt;\d+)/results/$&#39;</span><span class="p">,</span> <span class="s">&#39;results&#39;</span><span class="p">),</span>
    <span class="n">url</span><span class="p">(</span><span class="s">r&#39;^polls/(?P&lt;poll_id&gt;\d+)/vote/$&#39;</span><span class="p">,</span> <span class="s">&#39;vote&#39;</span><span class="p">),</span>
<span class="p">)</span>
</pre></div>
</div>
<p>This is functionally identical to the previous formatting. It&#8217;s just a bit
tidier.</p>
<p>Since you generally don&#8217;t want the prefix for one app to be applied to every
callback in your URLconf, you can concatenate multiple
<a class="reference internal" href="../topics/http/urls.html#django.conf.urls.patterns" title="django.conf.urls.patterns"><tt class="xref py py-func docutils literal"><span class="pre">patterns()</span></tt></a>. Your full <tt class="docutils literal"><span class="pre">mysite/urls.py</span></tt> might
now look like this:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">django.conf.urls</span> <span class="kn">import</span> <span class="n">patterns</span><span class="p">,</span> <span class="n">include</span><span class="p">,</span> <span class="n">url</span>

<span class="kn">from</span> <span class="nn">django.contrib</span> <span class="kn">import</span> <span class="n">admin</span>
<span class="n">admin</span><span class="o">.</span><span class="n">autodiscover</span><span class="p">()</span>

<span class="n">urlpatterns</span> <span class="o">=</span> <span class="n">patterns</span><span class="p">(</span><span class="s">&#39;polls.views&#39;</span><span class="p">,</span>
    <span class="n">url</span><span class="p">(</span><span class="s">r&#39;^polls/$&#39;</span><span class="p">,</span> <span class="s">&#39;index&#39;</span><span class="p">),</span>
    <span class="n">url</span><span class="p">(</span><span class="s">r&#39;^polls/(?P&lt;poll_id&gt;\d+)/$&#39;</span><span class="p">,</span> <span class="s">&#39;detail&#39;</span><span class="p">),</span>
    <span class="n">url</span><span class="p">(</span><span class="s">r&#39;^polls/(?P&lt;poll_id&gt;\d+)/results/$&#39;</span><span class="p">,</span> <span class="s">&#39;results&#39;</span><span class="p">),</span>
    <span class="n">url</span><span class="p">(</span><span class="s">r&#39;^polls/(?P&lt;poll_id&gt;\d+)/vote/$&#39;</span><span class="p">,</span> <span class="s">&#39;vote&#39;</span><span class="p">),</span>
<span class="p">)</span>

<span class="n">urlpatterns</span> <span class="o">+=</span> <span class="n">patterns</span><span class="p">(</span><span class="s">&#39;&#39;</span><span class="p">,</span>
    <span class="n">url</span><span class="p">(</span><span class="s">r&#39;^admin/&#39;</span><span class="p">,</span> <span class="n">include</span><span class="p">(</span><span class="n">admin</span><span class="o">.</span><span class="n">site</span><span class="o">.</span><span class="n">urls</span><span class="p">)),</span>
<span class="p">)</span>
</pre></div>
</div>
</div>
<div class="section" id="s-decoupling-the-urlconfs">
<span id="decoupling-the-urlconfs"></span><h2>Decoupling the URLconfs<a class="headerlink" href="#decoupling-the-urlconfs" title="Permalink to this headline">¶</a></h2>
<p>While we&#8217;re at it, we should take the time to decouple our poll-app URLs from
our Django project configuration. Django apps are meant to be pluggable &#8211; that
is, each particular app should be transferable to another Django installation
with minimal fuss.</p>
<p>Our poll app is pretty decoupled at this point, thanks to the strict directory
structure that <tt class="docutils literal"><span class="pre">python</span> <span class="pre">manage.py</span> <span class="pre">startapp</span></tt> created, but one part of it is
coupled to the Django settings: The URLconf.</p>
<p>We&#8217;ve been editing the URLs in <tt class="docutils literal"><span class="pre">mysite/urls.py</span></tt>, but the URL design of an
app is specific to the app, not to the Django installation &#8211; so let&#8217;s move the
URLs within the app directory.</p>
<p>Copy the file <tt class="docutils literal"><span class="pre">mysite/urls.py</span></tt> to <tt class="docutils literal"><span class="pre">polls/urls.py</span></tt>. Then, change
<tt class="docutils literal"><span class="pre">mysite/urls.py</span></tt> to remove the poll-specific URLs and insert an
<a class="reference internal" href="../topics/http/urls.html#django.conf.urls.include" title="django.conf.urls.include"><tt class="xref py py-func docutils literal"><span class="pre">include()</span></tt></a>, leaving you with:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">django.conf.urls</span> <span class="kn">import</span> <span class="n">patterns</span><span class="p">,</span> <span class="n">include</span><span class="p">,</span> <span class="n">url</span>

<span class="kn">from</span> <span class="nn">django.contrib</span> <span class="kn">import</span> <span class="n">admin</span>
<span class="n">admin</span><span class="o">.</span><span class="n">autodiscover</span><span class="p">()</span>

<span class="n">urlpatterns</span> <span class="o">=</span> <span class="n">patterns</span><span class="p">(</span><span class="s">&#39;&#39;</span><span class="p">,</span>
    <span class="n">url</span><span class="p">(</span><span class="s">r&#39;^polls/&#39;</span><span class="p">,</span> <span class="n">include</span><span class="p">(</span><span class="s">&#39;polls.urls&#39;</span><span class="p">)),</span>
    <span class="n">url</span><span class="p">(</span><span class="s">r&#39;^admin/&#39;</span><span class="p">,</span> <span class="n">include</span><span class="p">(</span><span class="n">admin</span><span class="o">.</span><span class="n">site</span><span class="o">.</span><span class="n">urls</span><span class="p">)),</span>
<span class="p">)</span>
</pre></div>
</div>
<p><a class="reference internal" href="../topics/http/urls.html#django.conf.urls.include" title="django.conf.urls.include"><tt class="xref py py-func docutils literal"><span class="pre">include()</span></tt></a> simply references another URLconf.
Note that the regular expression doesn&#8217;t have a <tt class="docutils literal"><span class="pre">$</span></tt> (end-of-string match
character) but has the trailing slash. Whenever Django encounters
<a class="reference internal" href="../topics/http/urls.html#django.conf.urls.include" title="django.conf.urls.include"><tt class="xref py py-func docutils literal"><span class="pre">include()</span></tt></a>, it chops off whatever part of the
URL matched up to that point and sends the remaining string to the included
URLconf for further processing.</p>
<p>Here&#8217;s what happens if a user goes to &#8220;/polls/34/&#8221; in this system:</p>
<ul class="simple">
<li>Django will find the match at <tt class="docutils literal"><span class="pre">'^polls/'</span></tt></li>
<li>Then, Django will strip off the matching text (<tt class="docutils literal"><span class="pre">&quot;polls/&quot;</span></tt>) and send the
remaining text &#8211; <tt class="docutils literal"><span class="pre">&quot;34/&quot;</span></tt> &#8211; to the &#8216;polls.urls&#8217; URLconf for
further processing.</li>
</ul>
<p>Now that we&#8217;ve decoupled that, we need to decouple the <tt class="docutils literal"><span class="pre">polls.urls</span></tt>
URLconf by removing the leading &#8220;polls/&#8221; from each line, and removing the
lines registering the admin site. Your <tt class="docutils literal"><span class="pre">polls/urls.py</span></tt> file should now look like
this:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">django.conf.urls</span> <span class="kn">import</span> <span class="n">patterns</span><span class="p">,</span> <span class="n">url</span>

<span class="n">urlpatterns</span> <span class="o">=</span> <span class="n">patterns</span><span class="p">(</span><span class="s">&#39;polls.views&#39;</span><span class="p">,</span>
    <span class="n">url</span><span class="p">(</span><span class="s">r&#39;^$&#39;</span><span class="p">,</span> <span class="s">&#39;index&#39;</span><span class="p">),</span>
    <span class="n">url</span><span class="p">(</span><span class="s">r&#39;^(?P&lt;poll_id&gt;\d+)/$&#39;</span><span class="p">,</span> <span class="s">&#39;detail&#39;</span><span class="p">),</span>
    <span class="n">url</span><span class="p">(</span><span class="s">r&#39;^(?P&lt;poll_id&gt;\d+)/results/$&#39;</span><span class="p">,</span> <span class="s">&#39;results&#39;</span><span class="p">),</span>
    <span class="n">url</span><span class="p">(</span><span class="s">r&#39;^(?P&lt;poll_id&gt;\d+)/vote/$&#39;</span><span class="p">,</span> <span class="s">&#39;vote&#39;</span><span class="p">),</span>
<span class="p">)</span>
</pre></div>
</div>
<p>The idea behind <a class="reference internal" href="../topics/http/urls.html#django.conf.urls.include" title="django.conf.urls.include"><tt class="xref py py-func docutils literal"><span class="pre">include()</span></tt></a> and URLconf
decoupling is to make it easy to plug-and-play URLs. Now that polls are in their
own URLconf, they can be placed under &#8220;/polls/&#8221;, or under &#8220;/fun_polls/&#8221;, or
under &#8220;/content/polls/&#8221;, or any other path root, and the app will still work.</p>
<p>All the poll app cares about is its relative path, not its absolute path.</p>
<p>When you&#8217;re comfortable with writing views, read <a class="reference internal" href="tutorial04.html"><em>part 4 of this tutorial</em></a> to learn about simple form processing and generic views.</p>
</div>
</div>


          </div>         
        </div>
      </div>
      
        
          <div class="yui-b" id="sidebar">
            
      <div class="sphinxsidebar">
        <div class="sphinxsidebarwrapper">
  <h3><a href="../contents.html">Table Of Contents</a></h3>
  <ul>
<li><a class="reference internal" href="#">Writing your first Django app, part 3</a><ul>
<li><a class="reference internal" href="#philosophy">Philosophy</a></li>
<li><a class="reference internal" href="#design-your-urls">Design your URLs</a></li>
<li><a class="reference internal" href="#write-your-first-view">Write your first view</a></li>
<li><a class="reference internal" href="#write-views-that-actually-do-something">Write views that actually do something</a><ul>
<li><a class="reference internal" href="#a-shortcut-render-to-response">A shortcut: render_to_response()</a></li>
</ul>
</li>
<li><a class="reference internal" href="#raising-404">Raising 404</a><ul>
<li><a class="reference internal" href="#a-shortcut-get-object-or-404">A shortcut: get_object_or_404()</a></li>
</ul>
</li>
<li><a class="reference internal" href="#write-a-404-page-not-found-view">Write a 404 (page not found) view</a></li>
<li><a class="reference internal" href="#write-a-500-server-error-view">Write a 500 (server error) view</a></li>
<li><a class="reference internal" href="#use-the-template-system">Use the template system</a></li>
<li><a class="reference internal" href="#simplifying-the-urlconfs">Simplifying the URLconfs</a></li>
<li><a class="reference internal" href="#decoupling-the-urlconfs">Decoupling the URLconfs</a></li>
</ul>
</li>
</ul>

  <h3>Browse</h3>
  <ul>
    
      <li>Prev: <a href="tutorial02.html">Writing your first Django app, part 2</a></li>
    
    
      <li>Next: <a href="tutorial04.html">Writing your first Django app, part 4</a></li>
    
  </ul>
  <h3>You are here:</h3>
  <ul>
      <li>
        <a href="../index.html">Django 1.4.5 documentation</a>
        
          <ul><li><a href="index.html">Getting started</a>
        
        <ul><li>Writing your first Django app, part 3</li></ul>
        </li></ul>
      </li>
  </ul>  

  <h3>This Page</h3>
  <ul class="this-page-menu">
    <li><a href="../_sources/intro/tutorial03.txt"
           rel="nofollow">Show Source</a></li>
  </ul>
<div id="searchbox" style="display: none">
  <h3>Quick search</h3>
    <form class="search" action="../search.html" method="get">
      <input type="text" name="q" />
      <input type="submit" value="Go" />
      <input type="hidden" name="check_keywords" value="yes" />
      <input type="hidden" name="area" value="default" />
    </form>
    <p class="searchtip" style="font-size: 90%">
    Enter search terms or a module, class or function name.
    </p>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
        </div>
      </div>
              <h3>Last update:</h3>
              <p class="topless">Feb 21, 2013</p>
          </div> 
        
      
    </div>
    
    <div id="ft">
      <div class="nav">
    &laquo; <a href="tutorial02.html" title="Writing your first Django app, part 2">previous</a> 
     |
    <a href="index.html" title="Getting started" accesskey="U">up</a>
   |
    <a href="tutorial04.html" title="Writing your first Django app, part 4">next</a> &raquo;</div>
    </div>
  </div>

      <div class="clearer"></div>
    </div>
  </body>
</html>