overview.txt 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323
  1. ==================
  2. Django at a glance
  3. ==================
  4. Because Django was developed in a fast-paced newsroom environment, it was
  5. designed to make common Web-development tasks fast and easy. Here's an informal
  6. overview of how to write a database-driven Web app with Django.
  7. The goal of this document is to give you enough technical specifics to
  8. understand how Django works, but this isn't intended to be a tutorial or
  9. reference -- but we've got both! When you're ready to start a project, you can
  10. :doc:`start with the tutorial </intro/tutorial01>` or :doc:`dive right into more
  11. detailed documentation </topics/index>`.
  12. Design your model
  13. =================
  14. Although you can use Django without a database, it comes with an
  15. object-relational mapper in which you describe your database layout in Python
  16. code.
  17. The :doc:`data-model syntax </topics/db/models>` offers many rich ways of
  18. representing your models -- so far, it's been solving two years' worth of
  19. database-schema problems. Here's a quick example, which might be saved in
  20. the file ``mysite/news/models.py``::
  21. class Reporter(models.Model):
  22. full_name = models.CharField(max_length=70)
  23. def __unicode__(self):
  24. return self.full_name
  25. class Article(models.Model):
  26. pub_date = models.DateField()
  27. headline = models.CharField(max_length=200)
  28. content = models.TextField()
  29. reporter = models.ForeignKey(Reporter)
  30. def __unicode__(self):
  31. return self.headline
  32. Install it
  33. ==========
  34. Next, run the Django command-line utility to create the database tables
  35. automatically:
  36. .. code-block:: bash
  37. manage.py syncdb
  38. The :djadmin:`syncdb` command looks at all your available models and creates
  39. tables in your database for whichever tables don't already exist.
  40. Enjoy the free API
  41. ==================
  42. With that, you've got a free, and rich, :doc:`Python API </topics/db/queries>` to
  43. access your data. The API is created on the fly, no code generation necessary::
  44. # Import the models we created from our "news" app
  45. >>> from news.models import Reporter, Article
  46. # No reporters are in the system yet.
  47. >>> Reporter.objects.all()
  48. []
  49. # Create a new Reporter.
  50. >>> r = Reporter(full_name='John Smith')
  51. # Save the object into the database. You have to call save() explicitly.
  52. >>> r.save()
  53. # Now it has an ID.
  54. >>> r.id
  55. 1
  56. # Now the new reporter is in the database.
  57. >>> Reporter.objects.all()
  58. [<Reporter: John Smith>]
  59. # Fields are represented as attributes on the Python object.
  60. >>> r.full_name
  61. 'John Smith'
  62. # Django provides a rich database lookup API.
  63. >>> Reporter.objects.get(id=1)
  64. <Reporter: John Smith>
  65. >>> Reporter.objects.get(full_name__startswith='John')
  66. <Reporter: John Smith>
  67. >>> Reporter.objects.get(full_name__contains='mith')
  68. <Reporter: John Smith>
  69. >>> Reporter.objects.get(id=2)
  70. Traceback (most recent call last):
  71. ...
  72. DoesNotExist: Reporter matching query does not exist. Lookup parameters were {'id': 2}
  73. # Create an article.
  74. >>> from datetime import date
  75. >>> a = Article(pub_date=date.today(), headline='Django is cool',
  76. ... content='Yeah.', reporter=r)
  77. >>> a.save()
  78. # Now the article is in the database.
  79. >>> Article.objects.all()
  80. [<Article: Django is cool>]
  81. # Article objects get API access to related Reporter objects.
  82. >>> r = a.reporter
  83. >>> r.full_name
  84. 'John Smith'
  85. # And vice versa: Reporter objects get API access to Article objects.
  86. >>> r.article_set.all()
  87. [<Article: Django is cool>]
  88. # The API follows relationships as far as you need, performing efficient
  89. # JOINs for you behind the scenes.
  90. # This finds all articles by a reporter whose name starts with "John".
  91. >>> Article.objects.filter(reporter__full_name__startswith="John")
  92. [<Article: Django is cool>]
  93. # Change an object by altering its attributes and calling save().
  94. >>> r.full_name = 'Billy Goat'
  95. >>> r.save()
  96. # Delete an object with delete().
  97. >>> r.delete()
  98. A dynamic admin interface: it's not just scaffolding -- it's the whole house
  99. ============================================================================
  100. Once your models are defined, Django can automatically create a professional,
  101. production ready :doc:`administrative interface </ref/contrib/admin/index>` -- a Web
  102. site that lets authenticated users add, change and delete objects. It's as easy
  103. as registering your model in the admin site::
  104. # In models.py...
  105. from django.db import models
  106. class Article(models.Model):
  107. pub_date = models.DateField()
  108. headline = models.CharField(max_length=200)
  109. content = models.TextField()
  110. reporter = models.ForeignKey(Reporter)
  111. # In admin.py in the same directory...
  112. import models
  113. from django.contrib import admin
  114. admin.site.register(models.Article)
  115. The philosophy here is that your site is edited by a staff, or a client, or
  116. maybe just you -- and you don't want to have to deal with creating backend
  117. interfaces just to manage content.
  118. One typical workflow in creating Django apps is to create models and get the
  119. admin sites up and running as fast as possible, so your staff (or clients) can
  120. start populating data. Then, develop the way data is presented to the public.
  121. Design your URLs
  122. ================
  123. A clean, elegant URL scheme is an important detail in a high-quality Web
  124. application. Django encourages beautiful URL design and doesn't put any cruft
  125. in URLs, like ``.php`` or ``.asp``.
  126. To design URLs for an app, you create a Python module called a :doc:`URLconf
  127. </topics/http/urls>`. A table of contents for your app, it contains a simple mapping
  128. between URL patterns and Python callback functions. URLconfs also serve to
  129. decouple URLs from Python code.
  130. Here's what a URLconf might look like for the ``Reporter``/``Article``
  131. example above::
  132. from django.conf.urls import patterns, url, include
  133. urlpatterns = patterns('',
  134. (r'^articles/(\d{4})/$', 'news.views.year_archive'),
  135. (r'^articles/(\d{4})/(\d{2})/$', 'news.views.month_archive'),
  136. (r'^articles/(\d{4})/(\d{2})/(\d+)/$', 'news.views.article_detail'),
  137. )
  138. The code above maps URLs, as simple regular expressions, to the location of
  139. Python callback functions ("views"). The regular expressions use parenthesis to
  140. "capture" values from the URLs. When a user requests a page, Django runs
  141. through each pattern, in order, and stops at the first one that matches the
  142. requested URL. (If none of them matches, Django calls a special-case 404 view.)
  143. This is blazingly fast, because the regular expressions are compiled at load
  144. time.
  145. Once one of the regexes matches, Django imports and calls the given view, which
  146. is a simple Python function. Each view gets passed a request object --
  147. which contains request metadata -- and the values captured in the regex.
  148. For example, if a user requested the URL "/articles/2005/05/39323/", Django
  149. would call the function ``news.views.article_detail(request,
  150. '2005', '05', '39323')``.
  151. Write your views
  152. ================
  153. Each view is responsible for doing one of two things: Returning an
  154. :class:`~django.http.HttpResponse` object containing the content for the
  155. requested page, or raising an exception such as :class:`~django.http.Http404`.
  156. The rest is up to you.
  157. Generally, a view retrieves data according to the parameters, loads a template
  158. and renders the template with the retrieved data. Here's an example view for
  159. ``year_archive`` from above::
  160. def year_archive(request, year):
  161. a_list = Article.objects.filter(pub_date__year=year)
  162. return render_to_response('news/year_archive.html', {'year': year, 'article_list': a_list})
  163. This example uses Django's :doc:`template system </topics/templates>`, which has
  164. several powerful features but strives to stay simple enough for non-programmers
  165. to use.
  166. Design your templates
  167. =====================
  168. The code above loads the ``news/year_archive.html`` template.
  169. Django has a template search path, which allows you to minimize redundancy among
  170. templates. In your Django settings, you specify a list of directories to check
  171. for templates. If a template doesn't exist in the first directory, it checks the
  172. second, and so on.
  173. Let's say the ``news/year_archive.html`` template was found. Here's what that
  174. might look like:
  175. .. code-block:: html+django
  176. {% extends "base.html" %}
  177. {% block title %}Articles for {{ year }}{% endblock %}
  178. {% block content %}
  179. <h1>Articles for {{ year }}</h1>
  180. {% for article in article_list %}
  181. <p>{{ article.headline }}</p>
  182. <p>By {{ article.reporter.full_name }}</p>
  183. <p>Published {{ article.pub_date|date:"F j, Y" }}</p>
  184. {% endfor %}
  185. {% endblock %}
  186. Variables are surrounded by double-curly braces. ``{{ article.headline }}``
  187. means "Output the value of the article's headline attribute." But dots aren't
  188. used only for attribute lookup: They also can do dictionary-key lookup, index
  189. lookup and function calls.
  190. Note ``{{ article.pub_date|date:"F j, Y" }}`` uses a Unix-style "pipe" (the "|"
  191. character). This is called a template filter, and it's a way to filter the value
  192. of a variable. In this case, the date filter formats a Python datetime object in
  193. the given format (as found in PHP's date function).
  194. You can chain together as many filters as you'd like. You can write custom
  195. filters. You can write custom template tags, which run custom Python code behind
  196. the scenes.
  197. Finally, Django uses the concept of "template inheritance": That's what the
  198. ``{% extends "base.html" %}`` does. It means "First load the template called
  199. 'base', which has defined a bunch of blocks, and fill the blocks with the
  200. following blocks." In short, that lets you dramatically cut down on redundancy
  201. in templates: each template has to define only what's unique to that template.
  202. Here's what the "base.html" template might look like:
  203. .. code-block:: html+django
  204. <html>
  205. <head>
  206. <title>{% block title %}{% endblock %}</title>
  207. </head>
  208. <body>
  209. <img src="sitelogo.png" alt="Logo" />
  210. {% block content %}{% endblock %}
  211. </body>
  212. </html>
  213. Simplistically, it defines the look-and-feel of the site (with the site's logo),
  214. and provides "holes" for child templates to fill. This makes a site redesign as
  215. easy as changing a single file -- the base template.
  216. It also lets you create multiple versions of a site, with different base
  217. templates, while reusing child templates. Django's creators have used this
  218. technique to create strikingly different cell-phone editions of sites -- simply
  219. by creating a new base template.
  220. Note that you don't have to use Django's template system if you prefer another
  221. system. While Django's template system is particularly well-integrated with
  222. Django's model layer, nothing forces you to use it. For that matter, you don't
  223. have to use Django's database API, either. You can use another database
  224. abstraction layer, you can read XML files, you can read files off disk, or
  225. anything you want. Each piece of Django -- models, views, templates -- is
  226. decoupled from the next.
  227. This is just the surface
  228. ========================
  229. This has been only a quick overview of Django's functionality. Some more useful
  230. features:
  231. * A :doc:`caching framework </topics/cache>` that integrates with memcached
  232. or other backends.
  233. * A :doc:`syndication framework </ref/contrib/syndication>` that makes
  234. creating RSS and Atom feeds as easy as writing a small Python class.
  235. * More sexy automatically-generated admin features -- this overview barely
  236. scratched the surface.
  237. The next obvious steps are for you to `download Django`_, read :doc:`the
  238. tutorial </intro/tutorial01>` and join `the community`_. Thanks for your
  239. interest!
  240. .. _download Django: https://www.djangoproject.com/download/
  241. .. _the community: https://www.djangoproject.com/community/