mirror of
https://github.com/django/django.git
synced 2025-08-04 02:48:35 +00:00
parent
43efefae69
commit
aa85ccf8ce
5 changed files with 116 additions and 98 deletions
|
@ -39,7 +39,24 @@ In our poll application, we'll have the following four views:
|
|||
* Vote action -- handles voting for a particular choice in a particular
|
||||
poll.
|
||||
|
||||
In Django, each view is represented by a simple Python function.
|
||||
In Django, web pages and other content are delivered by views. Each view is
|
||||
represented by a simple Python function (or method, in the case of class-based
|
||||
views). Django will choose a view by examining the URL that's requested (to be
|
||||
precise, the part of the URL after the domain name).
|
||||
|
||||
Now in your time on the web you may have come across such beauties as
|
||||
"ME2/Sites/dirmod.asp?sid=&type=gen&mod=Core+Pages&gid=A6CD4967199A42D9B65B1B".
|
||||
You will be pleased to know that Django allows us much more elegant
|
||||
*URL patterns* than that.
|
||||
|
||||
A URL pattern is simply the general form of a URL - for example:
|
||||
``/newsarchive/<year>/<month>/``.
|
||||
|
||||
To get from a URL to a view, Django uses what are known as 'URLconfs'. A
|
||||
URLconf maps URL patterns (described as regular expressions) to views.
|
||||
|
||||
This tutorial provides basic instruction in the use of URLconfs, and you can
|
||||
refer to :mod:`django.core.urlresolvers` for more information.
|
||||
|
||||
Write your first view
|
||||
=====================
|
||||
|
@ -52,19 +69,8 @@ and put the following Python code in it::
|
|||
def index(request):
|
||||
return HttpResponse("Hello, world. You're at the poll index.")
|
||||
|
||||
This is the simplest view possible in Django. Now we have a problem, how does
|
||||
this view get called? For that we need to map it to a URL, in Django this is
|
||||
done in a configuration file called a URLconf.
|
||||
|
||||
.. admonition:: What is a URLconf?
|
||||
|
||||
In Django, web pages and other content are delivered by views and
|
||||
determining which view is called is done by Python modules informally
|
||||
titled 'URLconfs'. These modules are pure Python code and are a simple
|
||||
mapping between URL patterns (as simple regular expressions) to Python
|
||||
callback functions (your views). This tutorial provides basic instruction
|
||||
in their use, and you can refer to :mod:`django.core.urlresolvers` for
|
||||
more information.
|
||||
This is the simplest view possible in Django. To call the view, we need to map
|
||||
it to a URL - and for this we need a URLconf.
|
||||
|
||||
To create a URLconf in the polls directory, create a file called ``urls.py``.
|
||||
Your app directory should now look like::
|
||||
|
@ -274,10 +280,48 @@ commas, according to publication date::
|
|||
|
||||
There's a problem here, though: the page's design is hard-coded in the view. If
|
||||
you want to change the way the page looks, you'll have to edit this Python code.
|
||||
So let's use Django's template system to separate the design from Python.
|
||||
So let's use Django's template system to separate the design from Python by
|
||||
creating a template that the view can use.
|
||||
|
||||
First, create a directory called ``templates`` in your ``polls`` directory.
|
||||
Django will look for templates in there.
|
||||
|
||||
Django's :setting:`TEMPLATE_LOADERS` setting contains a list of callables that
|
||||
know how to import templates from various sources. One of the defaults is
|
||||
:class:`django.template.loaders.app_directories.Loader` which looks for a
|
||||
"templates" subdirectory in each of the :setting:`INSTALLED_APPS` - this is how
|
||||
Django knows to find the polls templates even though we didn't modify
|
||||
:setting:`TEMPLATE_DIRS`, as we did in :ref:`Tutorial 2
|
||||
<ref-customizing-your-projects-templates>`.
|
||||
|
||||
.. admonition:: Organizing templates
|
||||
|
||||
We *could* have all our templates together, in one big templates directory,
|
||||
and it would work perfectly well. However, this template belongs to the
|
||||
polls application, so unlike the admin template we created in the previous
|
||||
tutorial, we'll put this one in the application's template directory
|
||||
(``polls/templates``) rather than the project's (``mytemplates``). We'll
|
||||
discuss in more detail in the :doc:`reusable apps tutorial
|
||||
</intro/reusable-apps>` *why* we do this.
|
||||
|
||||
Within the ``templates`` directory you have just created, create another
|
||||
directory called ``polls``, and within that create a file called
|
||||
``index.html``. In other words, your template should be at
|
||||
``polls/templates/polls/index.html``. Because of how the ``app_directories``
|
||||
template loader works as described above, you can refer to this template within
|
||||
Django simply as ``polls/index.html``.
|
||||
|
||||
.. admonition:: Template namespacing
|
||||
|
||||
Now we *might* be able to get away with putting our templates directly in
|
||||
``polls/templates`` (rather than creating another ``polls`` subdirectory),
|
||||
but it would actually be a bad idea. Django will choose the first template
|
||||
it finds whose name matches, and if you had a template with the same name
|
||||
in a *different* application, Django would be unable to distinguish between
|
||||
them. We need to be able to point Django at the right one, and the easiest
|
||||
way to ensure this is by *namespacing* them. That is, by putting those
|
||||
templates inside *another* directory named for the application itself.
|
||||
|
||||
First, create a directory ``polls`` in your template directory you specified
|
||||
in :setting:`TEMPLATE_DIRS`. Within that, create a file called ``index.html``.
|
||||
Put the following code in that template:
|
||||
|
||||
.. code-block:: html+django
|
||||
|
@ -311,15 +355,9 @@ That code loads the template called ``polls/index.html`` and passes it a
|
|||
context. The context is a dictionary mapping template variable names to Python
|
||||
objects.
|
||||
|
||||
Load the page in your Web browser, and you should see a bulleted-list
|
||||
containing the "What's up" poll from Tutorial 1. The link points to the poll's
|
||||
detail page.
|
||||
|
||||
.. admonition:: Organizing Templates
|
||||
|
||||
Rather than one big templates directory, you can also store templates
|
||||
within each app. We'll discuss this in more detail in the :doc:`reusable
|
||||
apps tutorial</intro/reusable-apps>`.
|
||||
Load the page by pointing your browser at "/polls/", and you should see a
|
||||
bulleted-list containing the "What's up" poll from Tutorial 1. The link points
|
||||
to the poll's detail page.
|
||||
|
||||
A shortcut: :func:`~django.shortcuts.render`
|
||||
--------------------------------------------
|
||||
|
@ -536,8 +574,9 @@ view, and so might an app on the same project that is for a blog. How does one
|
|||
make it so that Django knows which app view to create for a url when using the
|
||||
``{% url %}`` template tag?
|
||||
|
||||
The answer is to add namespaces to your root URLconf. In the
|
||||
``mysite/urls.py`` file, go ahead and change it to include namespacing::
|
||||
The answer is to add namespaces to your root URLconf. In the ``mysite/urls.py``
|
||||
file (the project's ``urls.py``, not the application's), go ahead and change
|
||||
it to include namespacing::
|
||||
|
||||
from django.conf.urls import patterns, include, url
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue