From 97cb07c3a10ff0e584a260a7ee1001614691eb1d Mon Sep 17 00:00:00 2001 From: Jacob Kaplan-Moss <jacob@jacobian.org> Date: Sat, 23 Aug 2008 22:25:40 +0000 Subject: [PATCH] Massive reorganization of the docs. See the new docs online at http://docs.djangoproject.com/. git-svn-id: http://code.djangoproject.com/svn/django/trunk@8506 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- AUTHORS | 1 + docs/Makefile | 18 +- docs/_ext/applyxrefs.py | 88 + docs/_ext/djangodocs.py | 146 + docs/_ext/literals_to_xrefs.py | 171 ++ docs/_static/default.css | 3 + docs/_static/djangodocs.css | 126 + docs/_static/docicons-behindscenes.gif | Bin 0 -> 1024 bytes docs/_static/docicons-note.gif | Bin 0 -> 632 bytes docs/_static/docicons-philosophy.gif | Bin 0 -> 799 bytes docs/_static/homepage.css | 22 + docs/_static/reset-fonts-grids.css | 8 + docs/_templates/genindex.html | 4 + docs/_templates/layout.html | 87 + docs/_templates/modindex.html | 3 + docs/_templates/search.html | 3 + docs/api_stability.txt | 119 - docs/authentication.txt | 1173 -------- docs/conf.py | 31 +- docs/contents.txt | 36 + docs/contenttypes.txt | 297 -- docs/db-api.txt | 2421 ---------------- docs/documentation.txt | 138 - docs/faq.txt | 744 ----- docs/faq/admin.txt | 103 + docs/faq/contributing.txt | 30 + docs/faq/general.txt | 256 ++ docs/faq/help.txt | 75 + docs/faq/index.txt | 16 + docs/faq/install.txt | 108 + docs/faq/models.txt | 94 + docs/faq/usage.txt | 65 + docs/files.txt | 388 --- docs/form_preview.txt | 95 - docs/form_wizard.txt | 304 -- docs/forms.txt | 2468 ----------------- docs/generic_views.txt | 1273 --------- docs/glossary.txt | 80 + .../apache-auth.txt} | 24 +- docs/howto/custom-file-storage.txt | 78 + docs/howto/custom-management-commands.txt | 33 + .../custom-model-fields.txt} | 366 +-- .../custom-template-tags.txt} | 742 +---- docs/{ => howto/deployment}/fastcgi.txt | 83 +- docs/howto/deployment/index.txt | 33 + docs/{ => howto/deployment}/modpython.txt | 92 +- docs/howto/error-reporting.txt | 65 + docs/howto/index.txt | 33 + docs/howto/initial-data.txt | 140 + docs/howto/legacy-databases.txt | 67 + .../outputting-csv.txt} | 57 +- .../outputting-pdf.txt} | 36 +- .../static-files.txt} | 52 +- docs/index.txt | 264 +- docs/internals/_images/djangotickets.png | Bin 0 -> 52003 bytes docs/{ => internals}/contributing.txt | 62 +- docs/internals/documentation.txt | 204 ++ docs/internals/index.txt | 22 + docs/intro/_images/admin01.png | Bin 0 -> 120593 bytes docs/intro/_images/admin02.png | Bin 0 -> 355419 bytes docs/intro/_images/admin02t.png | Bin 0 -> 24726 bytes docs/intro/_images/admin03.png | Bin 0 -> 415869 bytes docs/intro/_images/admin03t.png | Bin 0 -> 28131 bytes docs/intro/_images/admin04.png | Bin 0 -> 397310 bytes docs/intro/_images/admin04t.png | Bin 0 -> 22806 bytes docs/intro/_images/admin05.png | Bin 0 -> 28875 bytes docs/intro/_images/admin05t.png | Bin 0 -> 22754 bytes docs/intro/_images/admin06.png | Bin 0 -> 22780 bytes docs/intro/_images/admin06t.png | Bin 0 -> 18156 bytes docs/intro/_images/admin07.png | Bin 0 -> 19804 bytes docs/intro/_images/admin08.png | Bin 0 -> 31552 bytes docs/intro/_images/admin08t.png | Bin 0 -> 23883 bytes docs/intro/_images/admin09.png | Bin 0 -> 16318 bytes docs/intro/_images/admin10.png | Bin 0 -> 5486 bytes docs/intro/_images/admin11.png | Bin 0 -> 33563 bytes docs/intro/_images/admin11t.png | Bin 0 -> 26365 bytes docs/intro/_images/admin12.png | Bin 0 -> 12682 bytes docs/intro/_images/admin13.png | Bin 0 -> 22062 bytes docs/intro/_images/admin13t.png | Bin 0 -> 18690 bytes docs/intro/_images/admin14.png | Bin 0 -> 28987 bytes docs/intro/_images/admin14t.png | Bin 0 -> 23460 bytes docs/intro/index.txt | 38 + docs/intro/install.txt | 75 + docs/{ => intro}/overview.txt | 77 +- docs/{ => intro}/tutorial01.txt | 450 +-- docs/{ => intro}/tutorial02.txt | 176 +- docs/{ => intro}/tutorial03.txt | 244 +- docs/{ => intro}/tutorial04.txt | 217 +- docs/intro/whatsnext.txt | 235 ++ docs/legacy_databases.txt | 69 - docs/localflavor.txt | 733 ----- docs/man/django-admin.1 | 3 +- docs/middleware.txt | 288 -- docs/misc/api-stability.txt | 95 + .../design-philosophies.txt} | 41 +- docs/{ => misc}/distributions.txt | 8 +- docs/misc/index.txt | 14 + docs/model-api.txt | 2145 -------------- docs/obsolete/_images/formrow.gif | Bin 0 -> 9156 bytes docs/obsolete/_images/module.gif | Bin 0 -> 5786 bytes docs/obsolete/_images/objecttools_01.gif | Bin 0 -> 1473 bytes docs/obsolete/_images/objecttools_02.gif | Bin 0 -> 1874 bytes .../{admin_css.txt => obsolete/admin-css.txt} | 31 +- docs/{oldforms.txt => obsolete/forms.txt} | 30 +- docs/obsolete/index.txt | 16 + docs/obsolete/newforms-migration.txt | 48 + docs/ref/contrib/_images/flatfiles_admin.png | Bin 0 -> 42243 bytes docs/ref/contrib/_images/users_changelist.png | Bin 0 -> 59355 bytes docs/{ => ref/contrib}/admin.txt | 55 +- docs/ref/contrib/auth.txt | 6 + docs/ref/contrib/contenttypes.txt | 347 +++ docs/{ => ref/contrib}/csrf.txt | 11 +- docs/{ => ref/contrib}/databrowse.txt | 46 +- docs/{ => ref/contrib}/flatpages.txt | 104 +- docs/ref/contrib/formtools/form-preview.txt | 110 + docs/ref/contrib/formtools/form-wizard.txt | 316 +++ docs/ref/contrib/formtools/index.txt | 12 + docs/ref/contrib/humanize.txt | 91 + docs/{add_ons.txt => ref/contrib/index.txt} | 164 +- docs/ref/contrib/localflavor.txt | 651 +++++ docs/{ => ref/contrib}/redirects.txt | 41 +- docs/ref/contrib/sitemaps.txt | 343 +++ docs/{ => ref/contrib}/sites.txt | 189 +- .../contrib/syndication.txt} | 357 +-- docs/{ => ref/contrib}/webdesign.txt | 21 +- docs/{ => ref}/databases.txt | 52 +- docs/{ => ref}/django-admin.txt | 225 +- docs/ref/files/file.txt | 117 + docs/ref/files/index.txt | 13 + docs/ref/files/storage.txt | 50 + docs/ref/forms/api.txt | 688 +++++ docs/ref/forms/fields.txt | 751 +++++ docs/ref/forms/index.txt | 14 + docs/ref/forms/validation.txt | 109 + docs/ref/forms/widgets.txt | 156 ++ docs/ref/generic-views.txt | 1106 ++++++++ docs/ref/index.txt | 21 + docs/ref/middleware.txt | 200 ++ docs/ref/models/fields.txt | 902 ++++++ docs/ref/models/index.txt | 15 + docs/ref/models/instances.txt | 430 +++ docs/ref/models/options.txt | 175 ++ docs/ref/models/querysets.txt | 1060 +++++++ docs/ref/models/relations.txt | 77 + .../request-response.txt} | 481 ++-- docs/{ => ref}/settings.txt | 603 ++-- docs/ref/templates/api.txt | 612 ++++ .../templates/builtins.txt} | 777 ++---- docs/ref/templates/index.txt | 20 + docs/{ => ref}/unicode.txt | 42 +- .../0.95.txt} | 12 +- .../0.96.txt} | 14 +- .../1.0-alpha-1.txt} | 2 + .../1.0-alpha-2.txt} | 39 +- .../1.0-beta.txt} | 30 +- docs/releases/index.txt | 26 + docs/sitemaps.txt | 334 --- docs/topics/auth.txt | 1334 +++++++++ docs/{ => topics}/cache.txt | 16 +- docs/topics/db/index.txt | 17 + docs/topics/db/managers.txt | 191 ++ docs/topics/db/models.txt | 746 +++++ docs/topics/db/queries.txt | 968 +++++++ docs/topics/db/sql.txt | 35 + docs/{ => topics/db}/transactions.txt | 2 + docs/{ => topics}/email.txt | 75 +- docs/topics/files.txt | 146 + docs/topics/forms/formsets.txt | 329 +++ docs/topics/forms/index.txt | 260 ++ docs/topics/forms/media.txt | 311 +++ docs/{ => topics/forms}/modelforms.txt | 29 +- docs/topics/http/_images/middleware.png | Bin 0 -> 56301 bytes .../http/file-uploads.txt} | 31 +- docs/topics/http/generic-views.txt | 7 + docs/topics/http/index.txt | 17 + docs/topics/http/middleware.txt | 169 ++ docs/{ => topics/http}/sessions.txt | 12 +- docs/{ => topics/http}/shortcuts.txt | 31 +- .../http/urls.txt} | 64 +- docs/topics/http/views.txt | 186 ++ docs/{ => topics}/i18n.txt | 90 +- docs/topics/index.txt | 25 + docs/{ => topics}/install.txt | 62 +- docs/{ => topics}/pagination.txt | 120 +- docs/{ => topics}/serialization.txt | 28 +- docs/topics/settings.txt | 253 ++ docs/topics/templates.txt | 644 +++++ docs/{ => topics}/testing.txt | 277 +- 188 files changed, 19913 insertions(+), 17059 deletions(-) create mode 100644 docs/_ext/applyxrefs.py create mode 100644 docs/_ext/djangodocs.py create mode 100644 docs/_ext/literals_to_xrefs.py create mode 100644 docs/_static/default.css create mode 100644 docs/_static/djangodocs.css create mode 100644 docs/_static/docicons-behindscenes.gif create mode 100644 docs/_static/docicons-note.gif create mode 100644 docs/_static/docicons-philosophy.gif create mode 100644 docs/_static/homepage.css create mode 100644 docs/_static/reset-fonts-grids.css create mode 100644 docs/_templates/genindex.html create mode 100644 docs/_templates/layout.html create mode 100644 docs/_templates/modindex.html create mode 100644 docs/_templates/search.html delete mode 100644 docs/api_stability.txt delete mode 100644 docs/authentication.txt create mode 100644 docs/contents.txt delete mode 100644 docs/contenttypes.txt delete mode 100644 docs/db-api.txt delete mode 100644 docs/documentation.txt delete mode 100644 docs/faq.txt create mode 100644 docs/faq/admin.txt create mode 100644 docs/faq/contributing.txt create mode 100644 docs/faq/general.txt create mode 100644 docs/faq/help.txt create mode 100644 docs/faq/index.txt create mode 100644 docs/faq/install.txt create mode 100644 docs/faq/models.txt create mode 100644 docs/faq/usage.txt delete mode 100644 docs/files.txt delete mode 100644 docs/form_preview.txt delete mode 100644 docs/form_wizard.txt delete mode 100644 docs/forms.txt delete mode 100644 docs/generic_views.txt create mode 100644 docs/glossary.txt rename docs/{apache_auth.txt => howto/apache-auth.txt} (91%) create mode 100644 docs/howto/custom-file-storage.txt create mode 100644 docs/howto/custom-management-commands.txt rename docs/{custom_model_fields.txt => howto/custom-model-fields.txt} (65%) rename docs/{templates_python.txt => howto/custom-template-tags.txt} (55%) rename docs/{ => howto/deployment}/fastcgi.txt (86%) create mode 100644 docs/howto/deployment/index.txt rename docs/{ => howto/deployment}/modpython.txt (83%) create mode 100644 docs/howto/error-reporting.txt create mode 100644 docs/howto/index.txt create mode 100644 docs/howto/initial-data.txt create mode 100644 docs/howto/legacy-databases.txt rename docs/{outputting_csv.txt => howto/outputting-csv.txt} (72%) rename docs/{outputting_pdf.txt => howto/outputting-pdf.txt} (85%) rename docs/{static_files.txt => howto/static-files.txt} (72%) create mode 100644 docs/internals/_images/djangotickets.png rename docs/{ => internals}/contributing.txt (97%) create mode 100644 docs/internals/documentation.txt create mode 100644 docs/internals/index.txt create mode 100644 docs/intro/_images/admin01.png create mode 100644 docs/intro/_images/admin02.png create mode 100644 docs/intro/_images/admin02t.png create mode 100644 docs/intro/_images/admin03.png create mode 100644 docs/intro/_images/admin03t.png create mode 100644 docs/intro/_images/admin04.png create mode 100644 docs/intro/_images/admin04t.png create mode 100644 docs/intro/_images/admin05.png create mode 100644 docs/intro/_images/admin05t.png create mode 100644 docs/intro/_images/admin06.png create mode 100644 docs/intro/_images/admin06t.png create mode 100644 docs/intro/_images/admin07.png create mode 100644 docs/intro/_images/admin08.png create mode 100644 docs/intro/_images/admin08t.png create mode 100644 docs/intro/_images/admin09.png create mode 100644 docs/intro/_images/admin10.png create mode 100644 docs/intro/_images/admin11.png create mode 100644 docs/intro/_images/admin11t.png create mode 100644 docs/intro/_images/admin12.png create mode 100644 docs/intro/_images/admin13.png create mode 100644 docs/intro/_images/admin13t.png create mode 100644 docs/intro/_images/admin14.png create mode 100644 docs/intro/_images/admin14t.png create mode 100644 docs/intro/index.txt create mode 100644 docs/intro/install.txt rename docs/{ => intro}/overview.txt (81%) rename docs/{ => intro}/tutorial01.txt (51%) rename docs/{ => intro}/tutorial02.txt (72%) rename docs/{ => intro}/tutorial03.txt (65%) rename docs/{ => intro}/tutorial04.txt (52%) create mode 100644 docs/intro/whatsnext.txt delete mode 100644 docs/legacy_databases.txt delete mode 100644 docs/localflavor.txt delete mode 100644 docs/middleware.txt create mode 100644 docs/misc/api-stability.txt rename docs/{design_philosophies.txt => misc/design-philosophies.txt} (93%) rename docs/{ => misc}/distributions.txt (95%) create mode 100644 docs/misc/index.txt delete mode 100644 docs/model-api.txt create mode 100644 docs/obsolete/_images/formrow.gif create mode 100644 docs/obsolete/_images/module.gif create mode 100644 docs/obsolete/_images/objecttools_01.gif create mode 100644 docs/obsolete/_images/objecttools_02.gif rename docs/{admin_css.txt => obsolete/admin-css.txt} (89%) rename docs/{oldforms.txt => obsolete/forms.txt} (97%) create mode 100644 docs/obsolete/index.txt create mode 100644 docs/obsolete/newforms-migration.txt create mode 100644 docs/ref/contrib/_images/flatfiles_admin.png create mode 100644 docs/ref/contrib/_images/users_changelist.png rename docs/{ => ref/contrib}/admin.txt (95%) create mode 100644 docs/ref/contrib/auth.txt create mode 100644 docs/ref/contrib/contenttypes.txt rename docs/{ => ref/contrib}/csrf.txt (90%) rename docs/{ => ref/contrib}/databrowse.txt (58%) rename docs/{ => ref/contrib}/flatpages.txt (51%) create mode 100644 docs/ref/contrib/formtools/form-preview.txt create mode 100644 docs/ref/contrib/formtools/form-wizard.txt create mode 100644 docs/ref/contrib/formtools/index.txt create mode 100644 docs/ref/contrib/humanize.txt rename docs/{add_ons.txt => ref/contrib/index.txt} (53%) create mode 100644 docs/ref/contrib/localflavor.txt rename docs/{ => ref/contrib}/redirects.txt (66%) create mode 100644 docs/ref/contrib/sitemaps.txt rename docs/{ => ref/contrib}/sites.txt (60%) rename docs/{syndication_feeds.txt => ref/contrib/syndication.txt} (72%) rename docs/{ => ref/contrib}/webdesign.txt (74%) rename docs/{ => ref}/databases.txt (91%) rename docs/{ => ref}/django-admin.txt (85%) create mode 100644 docs/ref/files/file.txt create mode 100644 docs/ref/files/index.txt create mode 100644 docs/ref/files/storage.txt create mode 100644 docs/ref/forms/api.txt create mode 100644 docs/ref/forms/fields.txt create mode 100644 docs/ref/forms/index.txt create mode 100644 docs/ref/forms/validation.txt create mode 100644 docs/ref/forms/widgets.txt create mode 100644 docs/ref/generic-views.txt create mode 100644 docs/ref/index.txt create mode 100644 docs/ref/middleware.txt create mode 100644 docs/ref/models/fields.txt create mode 100644 docs/ref/models/index.txt create mode 100644 docs/ref/models/instances.txt create mode 100644 docs/ref/models/options.txt create mode 100644 docs/ref/models/querysets.txt create mode 100644 docs/ref/models/relations.txt rename docs/{request_response.txt => ref/request-response.txt} (51%) rename docs/{ => ref}/settings.txt (65%) create mode 100644 docs/ref/templates/api.txt rename docs/{templates.txt => ref/templates/builtins.txt} (63%) create mode 100644 docs/ref/templates/index.txt rename docs/{ => ref}/unicode.txt (92%) rename docs/{release_notes_0.95.txt => releases/0.95.txt} (97%) rename docs/{release_notes_0.96.txt => releases/0.96.txt} (95%) rename docs/{release_notes_1.0_alpha.txt => releases/1.0-alpha-1.txt} (99%) rename docs/{release_notes_1.0_alpha_2.txt => releases/1.0-alpha-2.txt} (81%) rename docs/{release_notes_1.0_beta_1.txt => releases/1.0-beta.txt} (86%) create mode 100644 docs/releases/index.txt delete mode 100644 docs/sitemaps.txt create mode 100644 docs/topics/auth.txt rename docs/{ => topics}/cache.txt (98%) create mode 100644 docs/topics/db/index.txt create mode 100644 docs/topics/db/managers.txt create mode 100644 docs/topics/db/models.txt create mode 100644 docs/topics/db/queries.txt create mode 100644 docs/topics/db/sql.txt rename docs/{ => topics/db}/transactions.txt (99%) rename docs/{ => topics}/email.txt (88%) create mode 100644 docs/topics/files.txt create mode 100644 docs/topics/forms/formsets.txt create mode 100644 docs/topics/forms/index.txt create mode 100644 docs/topics/forms/media.txt rename docs/{ => topics/forms}/modelforms.txt (97%) create mode 100644 docs/topics/http/_images/middleware.png rename docs/{upload_handling.txt => topics/http/file-uploads.txt} (94%) create mode 100644 docs/topics/http/generic-views.txt create mode 100644 docs/topics/http/index.txt create mode 100644 docs/topics/http/middleware.txt rename docs/{ => topics/http}/sessions.txt (97%) rename docs/{ => topics/http}/shortcuts.txt (82%) rename docs/{url_dispatch.txt => topics/http/urls.txt} (92%) create mode 100644 docs/topics/http/views.txt rename docs/{ => topics}/i18n.txt (94%) create mode 100644 docs/topics/index.txt rename docs/{ => topics}/install.txt (88%) rename docs/{ => topics}/pagination.txt (62%) rename docs/{ => topics}/serialization.txt (91%) create mode 100644 docs/topics/settings.txt create mode 100644 docs/topics/templates.txt rename docs/{ => topics}/testing.txt (82%) diff --git a/AUTHORS b/AUTHORS index ea83eb92db..1137b7cb8e 100644 --- a/AUTHORS +++ b/AUTHORS @@ -67,6 +67,7 @@ answer newbie questions, and generally made Django that much better: Jiri Barton Ned Batchelder <http://www.nedbatchelder.com/> batiste@dosimple.ch + Batman Shannon -jj Behrens <http://jjinux.blogspot.com/> Esdras Beleza <linux@esdrasbeleza.com> Chris Bennett <chrisrbennett@yahoo.com> diff --git a/docs/Makefile b/docs/Makefile index f79d4299d5..e9c11d0676 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -11,12 +11,12 @@ PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d _build/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . -.PHONY: help clean html web htmlhelp latex changes linkcheck +.PHONY: help clean html web pickle htmlhelp latex changes linkcheck help: @echo "Please use \`make <target>' where <target> is one of" @echo " html to make standalone HTML files" - @echo " web to make files usable by Sphinx.web" + @echo " pickle to make pickle files (usable by e.g. sphinx-web)" @echo " htmlhelp to make HTML files and a HTML help project" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " changes to make an overview over all changed/added/deprecated items" @@ -31,13 +31,15 @@ html: @echo @echo "Build finished. The HTML pages are in _build/html." -web: - mkdir -p _build/web _build/doctrees - $(SPHINXBUILD) -b web $(ALLSPHINXOPTS) _build/web +pickle: + mkdir -p _build/pickle _build/doctrees + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) _build/pickle @echo - @echo "Build finished; now you can run" - @echo " python -m sphinx.web _build/web" - @echo "to start the server." + @echo "Build finished; now you can process the pickle files or run" + @echo " sphinx-web _build/pickle" + @echo "to start the sphinx-web server." + +web: pickle htmlhelp: mkdir -p _build/htmlhelp _build/doctrees diff --git a/docs/_ext/applyxrefs.py b/docs/_ext/applyxrefs.py new file mode 100644 index 0000000000..3809088c1f --- /dev/null +++ b/docs/_ext/applyxrefs.py @@ -0,0 +1,88 @@ +"""Adds xref targets to the top of files.""" + +import sys +import os + +testing = False + +DONT_TOUCH = ( + './index.txt', + ) + +def target_name(fn): + if fn.endswith('.txt'): + fn = fn[:-4] + return '_' + fn.lstrip('./').replace('/', '-') + +def process_file(fn, lines): + lines.insert(0, '\n') + lines.insert(0, '.. %s:\n' % target_name(fn)) + try: + f = open(fn, 'w') + except IOError: + print("Can't open %s for writing. Not touching it." % fn) + return + try: + f.writelines(lines) + except IOError: + print("Can't write to %s. Not touching it." % fn) + finally: + f.close() + +def has_target(fn): + try: + f = open(fn, 'r') + except IOError: + print("Can't open %s. Not touching it." % fn) + return (True, None) + readok = True + try: + lines = f.readlines() + except IOError: + print("Can't read %s. Not touching it." % fn) + readok = False + finally: + f.close() + if not readok: + return (True, None) + + #print fn, len(lines) + if len(lines) < 1: + print("Not touching empty file %s." % fn) + return (True, None) + if lines[0].startswith('.. _'): + return (True, None) + return (False, lines) + +def main(argv=None): + if argv is None: + argv = sys.argv + + if len(argv) == 1: + argv.extend('.') + + files = [] + for root in argv[1:]: + for (dirpath, dirnames, filenames) in os.walk(root): + files.extend([(dirpath, f) for f in filenames]) + files.sort() + files = [os.path.join(p, fn) for p, fn in files if fn.endswith('.txt')] + #print files + + for fn in files: + if fn in DONT_TOUCH: + print("Skipping blacklisted file %s." % fn) + continue + + target_found, lines = has_target(fn) + if not target_found: + if testing: + print '%s: %s' % (fn, lines[0]), + else: + print "Adding xref to %s" % fn + process_file(fn, lines) + else: + print "Skipping %s: already has a xref" % fn + +if __name__ == '__main__': + sys.exit(main()) \ No newline at end of file diff --git a/docs/_ext/djangodocs.py b/docs/_ext/djangodocs.py new file mode 100644 index 0000000000..2375be481d --- /dev/null +++ b/docs/_ext/djangodocs.py @@ -0,0 +1,146 @@ +""" +Sphinx plugins for Django documentation. +""" + +import docutils.nodes +import docutils.transforms +import sphinx +import sphinx.addnodes +import sphinx.builder +import sphinx.directives +import sphinx.environment +import sphinx.htmlwriter + +def setup(app): + app.add_crossref_type( + directivename = "setting", + rolename = "setting", + indextemplate = "pair: %s; setting", + ) + app.add_crossref_type( + directivename = "templatetag", + rolename = "ttag", + indextemplate = "pair: %s; template tag" + ) + app.add_crossref_type( + directivename = "templatefilter", + rolename = "tfilter", + indextemplate = "pair: %s; template filter" + ) + app.add_crossref_type( + directivename = "fieldlookup", + rolename = "lookup", + indextemplate = "pair: %s, field lookup type", + ) + app.add_description_unit( + directivename = "django-admin", + rolename = "djadmin", + indextemplate = "pair: %s; django-admin command", + parse_node = parse_django_admin_node, + ) + app.add_description_unit( + directivename = "django-admin-option", + rolename = "djadminopt", + indextemplate = "pair: %s; django-admin command-line option", + parse_node = lambda env, sig, signode: sphinx.directives.parse_option_desc(signode, sig), + ) + app.add_transform(SuppressBlockquotes) + + # Monkeypatch PickleHTMLBuilder so that it doesn't die in Sphinx 0.4.2 + if sphinx.__version__ == '0.4.2': + monkeypatch_pickle_builder() + +class SuppressBlockquotes(docutils.transforms.Transform): + """ + Remove the default blockquotes that encase indented list, tables, etc. + """ + default_priority = 300 + + suppress_blockquote_child_nodes = ( + docutils.nodes.bullet_list, + docutils.nodes.enumerated_list, + docutils.nodes.definition_list, + docutils.nodes.literal_block, + docutils.nodes.doctest_block, + docutils.nodes.line_block, + docutils.nodes.table + ) + + def apply(self): + for node in self.document.traverse(docutils.nodes.block_quote): + if len(node.children) == 1 and isinstance(node.children[0], self.suppress_blockquote_child_nodes): + node.replace_self(node.children[0]) + +class DjangoHTMLTranslator(sphinx.htmlwriter.SmartyPantsHTMLTranslator): + """ + Django-specific reST to HTML tweaks. + """ + + # Don't use border=1, which docutils does by default. + def visit_table(self, node): + self.body.append(self.starttag(node, 'table', CLASS='docutils')) + + # Give each section a unique ID -- nice for custom CSS hooks + # This is different on docutils 0.5 vs. 0.4... + + # The docutils 0.4 override. + if hasattr(sphinx.htmlwriter.SmartyPantsHTMLTranslator, 'start_tag_with_title'): + def start_tag_with_title(self, node, tagname, **atts): + node = { + 'classes': node.get('classes', []), + 'ids': ['s-%s' % i for i in node.get('ids', [])] + } + return self.starttag(node, tagname, **atts) + + # The docutils 0.5 override. + else: + def visit_section(self, node): + old_ids = node.get('ids', []) + node['ids'] = ['s-' + i for i in old_ids] + sphinx.htmlwriter.SmartyPantsHTMLTranslator.visit_section(self, node) + node['ids'] = old_ids + +def parse_django_admin_node(env, sig, signode): + command = sig.split(' ')[0] + env._django_curr_admin_command = command + title = "django-admin.py %s" % sig + signode += sphinx.addnodes.desc_name(title, title) + return sig + +def monkeypatch_pickle_builder(): + import shutil + from os import path + try: + import cPickle as pickle + except ImportError: + import pickle + from sphinx.util.console import bold + + def handle_finish(self): + # dump the global context + outfilename = path.join(self.outdir, 'globalcontext.pickle') + f = open(outfilename, 'wb') + try: + pickle.dump(self.globalcontext, f, 2) + finally: + f.close() + + self.info(bold('dumping search index...')) + self.indexer.prune(self.env.all_docs) + f = open(path.join(self.outdir, 'searchindex.pickle'), 'wb') + try: + self.indexer.dump(f, 'pickle') + finally: + f.close() + + # copy the environment file from the doctree dir to the output dir + # as needed by the web app + shutil.copyfile(path.join(self.doctreedir, sphinx.builder.ENV_PICKLE_FILENAME), + path.join(self.outdir, sphinx.builder.ENV_PICKLE_FILENAME)) + + # touch 'last build' file, used by the web application to determine + # when to reload its environment and clear the cache + open(path.join(self.outdir, sphinx.builder.LAST_BUILD_FILENAME), 'w').close() + + sphinx.builder.PickleHTMLBuilder.handle_finish = handle_finish + diff --git a/docs/_ext/literals_to_xrefs.py b/docs/_ext/literals_to_xrefs.py new file mode 100644 index 0000000000..569193c72d --- /dev/null +++ b/docs/_ext/literals_to_xrefs.py @@ -0,0 +1,171 @@ +""" +Runs through a reST file looking for old-style literals, and helps replace them +with new-style references. +""" + +import re +import sys +import shelve + +refre = re.compile(r'``([^`\s]+?)``') + +ROLES = ( + 'attr', + 'class', + "djadmin", + 'data', + 'exc', + 'file', + 'func', + 'lookup', + 'meth', + 'mod' , + "djadminopt", + "ref", + "setting", + "term", + "tfilter", + "ttag", + + # special + "skip" +) + +ALWAYS_SKIP = [ + "NULL", + "True", + "False", +] + +def fixliterals(fname): + data = open(fname).read() + + last = 0 + new = [] + storage = shelve.open("/tmp/literals_to_xref.shelve") + lastvalues = storage.get("lastvalues", {}) + + for m in refre.finditer(data): + + new.append(data[last:m.start()]) + last = m.end() + + line_start = data.rfind("\n", 0, m.start()) + line_end = data.find("\n", m.end()) + prev_start = data.rfind("\n", 0, line_start) + next_end = data.find("\n", line_end + 1) + + # Skip always-skip stuff + if m.group(1) in ALWAYS_SKIP: + new.append(m.group(0)) + continue + + # skip when the next line is a title + next_line = data[m.end():next_end].strip() + if next_line[0] in "!-/:-@[-`{-~" and all(c == next_line[0] for c in next_line): + new.append(m.group(0)) + continue + + sys.stdout.write("\n"+"-"*80+"\n") + sys.stdout.write(data[prev_start+1:m.start()]) + sys.stdout.write(colorize(m.group(0), fg="red")) + sys.stdout.write(data[m.end():next_end]) + sys.stdout.write("\n\n") + + replace_type = None + while replace_type is None: + replace_type = raw_input( + colorize("Replace role: ", fg="yellow") + ).strip().lower() + if replace_type and replace_type not in ROLES: + replace_type = None + + if replace_type == "": + new.append(m.group(0)) + continue + + if replace_type == "skip": + new.append(m.group(0)) + ALWAYS_SKIP.append(m.group(1)) + continue + + default = lastvalues.get(m.group(1), m.group(1)) + if default.endswith("()") and replace_type in ("class", "func", "meth"): + default = default[:-2] + replace_value = raw_input( + colorize("Text <target> [", fg="yellow") + default + colorize("]: ", fg="yellow") + ).strip() + if not replace_value: + replace_value = default + new.append(":%s:`%s`" % (replace_type, replace_value)) + lastvalues[m.group(1)] = replace_value + + new.append(data[last:]) + open(fname, "w").write("".join(new)) + + storage["lastvalues"] = lastvalues + storage.close() + +# +# The following is taken from django.utils.termcolors and is copied here to +# avoid the dependancy. +# + + +def colorize(text='', opts=(), **kwargs): + """ + Returns your text, enclosed in ANSI graphics codes. + + Depends on the keyword arguments 'fg' and 'bg', and the contents of + the opts tuple/list. + + Returns the RESET code if no parameters are given. + + Valid colors: + 'black', 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white' + + Valid options: + 'bold' + 'underscore' + 'blink' + 'reverse' + 'conceal' + 'noreset' - string will not be auto-terminated with the RESET code + + Examples: + colorize('hello', fg='red', bg='blue', opts=('blink',)) + colorize() + colorize('goodbye', opts=('underscore',)) + print colorize('first line', fg='red', opts=('noreset',)) + print 'this should be red too' + print colorize('and so should this') + print 'this should not be red' + """ + color_names = ('black', 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white') + foreground = dict([(color_names[x], '3%s' % x) for x in range(8)]) + background = dict([(color_names[x], '4%s' % x) for x in range(8)]) + + RESET = '0' + opt_dict = {'bold': '1', 'underscore': '4', 'blink': '5', 'reverse': '7', 'conceal': '8'} + + text = str(text) + code_list = [] + if text == '' and len(opts) == 1 and opts[0] == 'reset': + return '\x1b[%sm' % RESET + for k, v in kwargs.iteritems(): + if k == 'fg': + code_list.append(foreground[v]) + elif k == 'bg': + code_list.append(background[v]) + for o in opts: + if o in opt_dict: + code_list.append(opt_dict[o]) + if 'noreset' not in opts: + text = text + '\x1b[%sm' % RESET + return ('\x1b[%sm' % ';'.join(code_list)) + text + +if __name__ == '__main__': + try: + fixliterals(sys.argv[1]) + except (KeyboardInterrupt, SystemExit): + print \ No newline at end of file diff --git a/docs/_static/default.css b/docs/_static/default.css new file mode 100644 index 0000000000..9dc69ee785 --- /dev/null +++ b/docs/_static/default.css @@ -0,0 +1,3 @@ +@import url(reset-fonts-grids.css); +@import url(djangodocs.css); +@import url(homepage.css); \ No newline at end of file diff --git a/docs/_static/djangodocs.css b/docs/_static/djangodocs.css new file mode 100644 index 0000000000..940bab8388 --- /dev/null +++ b/docs/_static/djangodocs.css @@ -0,0 +1,126 @@ +/*** setup ***/ +html { background:#092e20;} +body { font:12px/1.5 Verdana,sans-serif; background:#092e20; color: white;} +#custom-doc { width:76.54em;*width:74.69em;min-width:995px; max-width:100em; margin:auto; text-align:left; padding-top:16px; margin-top:0;} +#hd { padding: 4px 0 12px 0; } +#bd { background:#234F32; } +#ft { color:#487858; font-size:90%; padding-bottom: 2em; } + +/*** links ***/ +a {text-decoration: none;} +a img {border: none;} +a:link, a:visited { color:#ffc757; } +#bd a:link, #bd a:visited { color:#ab5603; text-decoration:underline; } +#bd #sidebar a:link, #bd #sidebar a:visited { color:#ffc757; text-decoration:none; } +a:hover { color:#ffe761; } +#bd a:hover { background-color:#E0FFB8; color:#234f32; text-decoration:none; } +#bd #sidebar a:hover { color:#ffe761; background:none; } +h2 a, h3 a, h4 a { text-decoration:none !important; } +a.reference em { font-style: normal; } + +/*** sidebar ***/ +#sidebar div.sphinxsidebarwrapper { font-size:92%; margin-right: 14px; } +#sidebar h3, #sidebar h4 { color: white; font-size: 125%; } +#sidebar a { color: white; } +#sidebar ul ul { margin-top:0; margin-bottom:0; } +#sidebar li { margin-top: 0.2em; margin-bottom: 0.2em; } + +/*** nav ***/ +div.nav { margin: 0; font-size: 11px; text-align: right; color: #487858;} +#hd div.nav { margin-top: -27px; } +#ft div.nav { margin-bottom: -18px; } +#hd h1 a { color: white; } +#global-nav { position:absolute; top:5px; margin-left: -5px; padding:7px 0; color:#263E2B; } +#global-nav a:link, #global-nav a:visited {color:#487858;} +#global-nav a {padding:0 4px;} +#global-nav a.about {padding-left:0;} +#global-nav:hover {color:#fff;} +#global-nav:hover a:link, #global-nav:hover a:visited { color:#ffc757; } + +/*** content ***/ +#yui-main div.yui-b { position: relative; } +#yui-main div.yui-b { margin: 0 0 0 20px; background: white; color: black; padding: 0.3em 2em 1em 2em; } + +/*** basic styles ***/ +dd { margin-left:15px; } +h1,h2,h3,h4 { margin-top:1em; font-family:"Trebuchet MS",sans-serif; font-weight:normal; } +h1 { font-size:218%; margin-top:0.6em; margin-bottom:.4em; line-height:1.1em; } +h2 { font-size:175%; margin-bottom:.6em; line-height:1.2em; color:#092e20; } +h3 { font-size:150%; font-weight:bold; margin-bottom:.2em; color:#487858; } +h4 { font-size:125%; font-weight:bold; margin-top:1.5em; margin-bottom:3px; } +div.figure { text-align: center; } +div.figure p.caption { font-size:1em; margin-top:0; margin-bottom:1.5em; color: #555;} +hr { color:#ccc; background-color:#ccc; height:1px; border:0; } +p, ul, dl { margin-top:.6em; margin-bottom:1em; padding-bottom: 0.1em;} +#yui-main div.yui-b img { max-width: 50em; margin-left: auto; margin-right: auto; display: block; } +caption { font-size:1em; font-weight:bold; margin-top:0.5em; margin-bottom:0.5em; margin-left: 2px; text-align: center; } +blockquote { padding: 0 1em; margin: 1em 0; font:125%/1.2em "Trebuchet MS", sans-serif; color:#234f32; border-left:2px solid #94da3a; } +strong { font-weight: bold; } +em { font-style: italic; } +ins { font-weight: bold; text-decoration: none; } + +/*** lists ***/ +ul { padding-left:30px; } +ol { padding-left:30px; } +ol.arabic { list-style-type: decimal; } +ul li { list-style-type:square; margin-bottom:.4em; } +ol li { margin-bottom: .4em; } +ul ul { padding-left:1.2em; } +ul ul ul { padding-left:1em; } +ul.linklist, ul.toc { padding-left:0; } +ul.toc ul { margin-left:.6em; } +ul.toc ul li { list-style-type:square; } +ul.toc ul ul li { list-style-type:disc; } +ul.linklist li, ul.toc li { list-style-type:none; } +dt { font-weight:bold; margin-top:.5em; font-size:1.1em; } +dd { margin-bottom:.8em; } +ol.toc { margin-bottom: 2em; } +ol.toc li { font-size:125%; padding: .5em; line-height:1.2em; clear: right; } +ol.toc li.b { background-color: #E0FFB8; } +ol.toc li a:hover { background-color: transparent !important; text-decoration: underline !important; } +ol.toc span.release-date { color:#487858; float: right; font-size: 85%; padding-right: .5em; } +ol.toc span.comment-count { font-size: 75%; color: #999; } + +/*** tables ***/ +table { color:#000; margin-bottom: 1em; width: 100%; } +table.docutils td p { margin-top:0; margin-bottom:.5em; } +table.docutils td, table.docutils th { border-bottom:1px solid #dfdfdf; padding:4px 2px;} +table.docutils thead th { border-bottom:2px solid #dfdfdf; text-align:left; font-weight: bold; white-space: nowrap; } +table.docutils thead th p { margin: 0; padding: 0; } +table.docutils { border-collapse:collapse; } + +/*** code blocks ***/ +.literal { white-space:nowrap; } +.literal { color:#234f32; } +#sidebar .literal { color:white; background:transparent; font-size:11px; } +h4 .literal { color: #234f32; font-size: 13px; } +pre { font-size:small; background:#E0FFB8; border:1px solid #94da3a; border-width:1px 0; margin: 1em 0; padding: .3em .4em; overflow: hidden; line-height: 1.3em;} +dt .literal, table .literal { background:none; } +#bd a.reference { text-decoration: none; } +#bd a.reference tt.literal { border-bottom: 1px #234f32 dotted; } + +/*** notes & admonitions ***/ +.note, .admonition { padding:.8em 1em .8em; margin: 1em 0; border:1px solid #94da3a; } +.admonition-title { font-weight:bold; margin-top:0 !important; margin-bottom:0 !important;} +.admonition .last { margin-bottom:0 !important; } +.note, .admonition { padding-left:65px; background:url(docicons-note.gif) .8em .8em no-repeat;} +div.admonition-philosophy { padding-left:65px; background:url(docicons-philosophy.gif) .8em .8em no-repeat;} +div.admonition-behind-the-scenes { padding-left:65px; background:url(docicons-behindscenes.gif) .8em .8em no-repeat;} + +/*** p-links ***/ +a.headerlink { color: #c60f0f; font-size: 0.8em; padding: 0 4px 0 4px; text-decoration: none; visibility: hidden; } +h1:hover > a.headerlink, h2:hover > a.headerlink, h3:hover > a.headerlink, h4:hover > a.headerlink, h5:hover > a.headerlink, h6:hover > a.headerlink, dt:hover > a.headerlink { visibility: visible; } + +/*** index ***/ +table.indextable td { text-align: left; vertical-align: top;} +table.indextable dl, table.indextable dd { margin-top: 0; margin-bottom: 0; } +table.indextable tr.pcap { height: 10px; } +table.indextable tr.cap { margin-top: 10px; background-color: #f2f2f2;} + +/*** page-specific overrides ***/ +div#contents ul { margin-bottom: 0;} +div#contents ul li { margin-bottom: 0;} +div#contents ul ul li { margin-top: 0.3em;} + +/*** IE hacks ***/ +* pre { width: 100%; } \ No newline at end of file diff --git a/docs/_static/docicons-behindscenes.gif b/docs/_static/docicons-behindscenes.gif new file mode 100644 index 0000000000000000000000000000000000000000..921bc45c33dc92f33c5c0d4c1a56f78647e14b34 GIT binary patch literal 1024 zcmV+b1poU-Nk%w1VJ`qL0M!5h2@M1#GZM+>qlv#mNoFK&nKh@@YFmIT5*i6NO&fr- zK6j=%*6h0Y{PQkA78@oFQgbLkSs!GKF`3U(<nqzN;+VVNjL7AqpweEg*>&;x=)2&I zoY7dL)MT{Wfq;O3#^jy9zrVucn5x%rvD<sD*>ylbK%bwVxZZ}ZudkrfUf<u}P*6~w z$z>oQAd0t7zu}T#U|<js5by8rdZ#~ut4o#6O^m@vh^|)8&(8n=0RR90lFUZ{00000 z00000A^8LV00000EC2ui051S9000L6z@2bNEbcT6ONPg6@-h~N#z?JN83w0zYhX02 zVB=-7EpI26aF~KIySEsMnp%0=x0U&@k-hty248A?e}zneVT6Wd2Rad4f>nKsOa})% z0{}WY3S3roZVC%-3!4ZCI;al>2mqZ-c}5g(3z`sang9S10}h*;qfK%}ZB7dT1Oq$| zI=adS1i?%JI!p=$Jl8q_S{OwaThz^{0TDV5sM|~f1iC!t&6np}X+jNTTGSB%0SN;G z;(T$-wCR8Z9Unrl0KkLXD<%^JF(|`~Ne2=eHjpr2gNKd;JW6e2r$b1HY9hHgVIXAE z00<741?V6`fX$mCI4~nn00Jui2nSh&h`~_YBPRxqIDzmhK?|E6UKA+s0)+q&G&F50 zpf15C00y^7bArSPS8fwP2x#H!SA-G*JPatXQ^$h>1Fk7!imgl%Ed+ENAQ3l!j1wzX zd=Ol7!ode#e;ruhOB2X4O0;k#ut7i#9VdvyKrlkU2x<cwIcV2xn<kZ8mN-$s?10U{ zGl-<np+Z0jUzeH${+Nxx!#4^vJyOeb1(6fHeb>@)Yn`)2Tmjtbi~}JN6Qq6fXjF~T z7I+a#Z}6H>A!7j?B0n%+W&yJsY7MZC=Rp7r)nn1;L|_GUU=s=)6tDmXR)N4lV9E$s z1}aRbP}5B|!N36zfdxnZpKMP2GSWpEdC)-t0U*GP0|G*^MFIgh;1!DsKyXP)nh>xP zB~iRV4Fp;tqXPj1Om<K+%KY<(6mJX%00C_QaAYfXZQ~U~eoQgR77Cmaj8_pT&<sBk z03@OxN$oHZB?t^ORVSPI!O{-*7@|O64h)cv4pUKg#{@)x^9NVW-04CNGnkO4Wf7WD z&k)7jK^{l}m>|Rl+#GpX8Qv5z%O3}5asUJ}q>zFO{%9qE8^aU<iXUPo!%Ql7I?^Z} zR&4o3BMIO&6%!D;k!BT&*db0c5*)B+b&w>YYZ(zB5CK!U7*z%$gFNd-WZ2Ag>miZM u@v0rQ%;!cddJMrGhJ-xCkuDWun1{x@U|>;57xd17L}sx?F-5vT00291;f>G$ literal 0 HcmV?d00001 diff --git a/docs/_static/docicons-note.gif b/docs/_static/docicons-note.gif new file mode 100644 index 0000000000000000000000000000000000000000..c0d599e90a193fdd54cc9400bab53235f5e8e3a9 GIT binary patch literal 632 zcmZ?wbhEHb)MwCVxXQqgH`8?g{{5b5DwEH6thrJ0=G#40V<86zhZ*Msr=0b={qE50 z3*iSIPMLoxPC!7QzrQ~qAYlFa^$H3Ko%@{=5)uju3JeSkq8oJHzkkok%X0tz{rU6f zORMpgFSBacY}e4xz`(%p|Ns9<XWW4dS^&kLEMQ}GKqSad3~c`oOepZsX%k^_aXOOI zCB)Hm$YX63C-d?$YXy-t3CYRcdgg}`-6~_#7OdpnR<pZ;pZn&{eU?8KeXMTusZDHX zYHA6qZ0`sw?CB|W%Zd_bnm%LZtl2Z=qVrr+*c6s5UABD1GKLh_<Y+ebvQS2a)zRrr ztf?C|g>2atUB|L}<6hVOsVq+2QF|2m<u6{keC49F;)xVy_v~{*D<3QoxUn_c<L=R8 z&Nov$U%Ya86Yce0k?-My$Dg9Szh1b?u+&w7{f$5e*N1CUn^_(;PpD^P<hvujV&R19 z9|13;Pn<|{YMS6u;p0)*@7{5hEv)mvL?3%2Im2aA;Y*#o>o~6UgtR}5bDXLhSYqW< z(Qw6IJ*ef-<pjnfdpVyu85C~{4!g)NVzlO_Sdzq<g~#j~I1~;ZkV;i7scpUf`F5+R zOH3xCqhiC|-4&mo<(^99U8iVZoMytX^~@4o1|jXZGdm0$_;MUXD@BYZsAvUi=d&hz zd=9e@v#P!}X+=QV`K9**<Z5?{tDc|q@MP+j?~4U=8h71T*VJ-POe3g@m65?30HD?E ANdN!< literal 0 HcmV?d00001 diff --git a/docs/_static/docicons-philosophy.gif b/docs/_static/docicons-philosophy.gif new file mode 100644 index 0000000000000000000000000000000000000000..432d93ba7920dac1fcf7c879cc00205bf0108ac5 GIT binary patch literal 799 zcmZ?wbhEHb)MwCVxXQqwYAm$;T2|gnQwIl!hK7b8e?DJ(vr9lg;QaaXo%@~NzkfgT zd~o?PD^6aP=mwo9pDrdOBz*k&;>6R%yYKg`y;*wb(F`Fe&IOm^?%%&}U|`^xrlO#r zAg#t55D;MQE4_dJ{`vFgH*B^`=`rl@?_a-uy+fqDo`YCHK|xTlM$4K&1_p-z|Nl=q z;|^qy2NZv@fHmrXNRXcx*!~}wTHv9xPN|Kv^=Qr}4Poaa9&4j`8JCwy8;Gn)Se&v^ zH(z{G!H+`2-P@<P&x)$Ny?yG>4HHU@1LPPO)TER+^BLo_YV!ERv?ffPz$@3D)|uFo zs>m=wR#{$xOI}5QU5l45Z$?;cG!L(qtVAdm%LKXAVWp{@8x^uRmP_STy7A}DJy0yM zoGGu!H8+({i>1m*UP~-b+*K$~jGgO-lYrK$v`i<~lvJK;Pn|fl)bhBy*z%;bI6gT^ zhwL#_IC6EGU#LKj0z=cZiN!o6t`*D)4T3DpDk~ct`cAA(&zlgiC8A{>SCK@B%!lWJ ztRBXm8fgnYJv_j`BWboF=jWy#q5oZ4LQbbHY&@}ZUi7p*niu=Kni^zRvFu4!KkBBn zj6=qvFp!mfRhisdnW6_#ZpyM38f$}lGbUD~cTTvm?V6wZcIO9dvPwR#M|R~2*&N!< zq<2zO#cwI|oA&0enNB?1jEtEdWtWx<S+oh<%(;@L<+Y}D)3xbc{H<r>q!%(d+|?*$ zJ>j)CiQ#&W;wvx4KONs17{3%<otyNbk6o0}oX4Wn%jGVE)0eeRmm5w}-M|vQCHc(V zlT1nv4zvk4?6dj#I^;U<%(CUdr5@RPMIGHjn-~0MNUCL(Udy4sfpbE*lg^QVR36cz zQ#UqnUNvo)rx%v-s4Ztg1VaNG-=9==Z9%maHm%7rQ<f_#b)`H?6yA{0A|kGO?qj^9 t(gSvfyrX|MGfCey6>RTy?l~wcWh2#iG%A)QlU2xGRrILH4HiZQYXBf-C5`|9 literal 0 HcmV?d00001 diff --git a/docs/_static/homepage.css b/docs/_static/homepage.css new file mode 100644 index 0000000000..276c5470ab --- /dev/null +++ b/docs/_static/homepage.css @@ -0,0 +1,22 @@ +#index p.rubric { font-size:150%; font-weight:normal; margin-bottom:.2em; color:#487858; } + +#index div.section dt { font-weight: normal; } + +#index #s-getting-help { float: right; width: 35em; background: #E1ECE2; padding: 1em; margin: 2em 0 2em 2em; } +#index #s-getting-help h2 { margin: 0; } + +#index #s-django-documentation div.section div.section h3 { margin: 0; } +#index #s-django-documentation div.section div.section { background: #E1ECE2; padding: 1em; margin: 2em 0 2em 40.3em; } +#index #s-django-documentation div.section div.section a.reference { white-space: nowrap; } + +#index #s-using-django dl, +#index #s-add-on-contrib-applications dl, +#index #s-solving-specific-problems dl, +#index #s-reference dl + { float: left; width: 41em; } + +#index #s-add-on-contrib-applications, +#index #s-solving-specific-problems, +#index #s-reference, +#index #s-and-all-the-rest + { clear: left; } \ No newline at end of file diff --git a/docs/_static/reset-fonts-grids.css b/docs/_static/reset-fonts-grids.css new file mode 100644 index 0000000000..f5238d7c91 --- /dev/null +++ b/docs/_static/reset-fonts-grids.css @@ -0,0 +1,8 @@ +/* +Copyright (c) 2008, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.5.1 +*/ +html{color:#000;background:#FFF;}body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;padding:0;}table{border-collapse:collapse;border-spacing:0;}fieldset,img{border:0;}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal;}li{list-style:none;}caption,th{text-align:left;}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal;}q:before,q:after{content:'';}abbr,acronym {border:0;font-variant:normal;}sup {vertical-align:text-top;}sub {vertical-align:text-bottom;}input,textarea,select{font-family:inherit;font-size:inherit;font-weight:inherit;}input,textarea,select{*font-size:100%;}legend{color:#000;}body {font:13px/1.231 arial,helvetica,clean,sans-serif;*font-size:small;*font:x-small;}table {font-size:inherit;font:100%;}pre,code,kbd,samp,tt{font-family:monospace;*font-size:108%;line-height:100%;} +body{text-align:center;}#ft{clear:both;}#doc,#doc2,#doc3,#doc4,.yui-t1,.yui-t2,.yui-t3,.yui-t4,.yui-t5,.yui-t6,.yui-t7{margin:auto;text-align:left;width:57.69em;*width:56.25em;min-width:750px;}#doc2{width:73.076em;*width:71.25em;}#doc3{margin:auto 10px;width:auto;}#doc4{width:74.923em;*width:73.05em;}.yui-b{position:relative;}.yui-b{_position:static;}#yui-main .yui-b{position:static;}#yui-main{width:100%;}.yui-t1 #yui-main,.yui-t2 #yui-main,.yui-t3 #yui-main{float:right;margin-left:-25em;}.yui-t4 #yui-main,.yui-t5 #yui-main,.yui-t6 #yui-main{float:left;margin-right:-25em;}.yui-t1 .yui-b{float:left;width:12.30769em;*width:12.00em;}.yui-t1 #yui-main .yui-b{margin-left:13.30769em;*margin-left:13.05em;}.yui-t2 .yui-b{float:left;width:13.8461em;*width:13.50em;}.yui-t2 #yui-main .yui-b{margin-left:14.8461em;*margin-left:14.55em;}.yui-t3 .yui-b{float:left;width:23.0769em;*width:22.50em;}.yui-t3 #yui-main .yui-b{margin-left:24.0769em;*margin-left:23.62em;}.yui-t4 .yui-b{float:right;width:13.8456em;*width:13.50em;}.yui-t4 #yui-main .yui-b{margin-right:14.8456em;*margin-right:14.55em;}.yui-t5 .yui-b{float:right;width:18.4615em;*width:18.00em;}.yui-t5 #yui-main .yui-b{margin-right:19.4615em;*margin-right:19.125em;}.yui-t6 .yui-b{float:right;width:23.0769em;*width:22.50em;}.yui-t6 #yui-main .yui-b{margin-right:24.0769em;*margin-right:23.62em;}.yui-t7 #yui-main .yui-b{display:block;margin:0 0 1em 0;}#yui-main .yui-b{float:none;width:auto;}.yui-gb .yui-u,.yui-g .yui-gb .yui-u,.yui-gb .yui-g,.yui-gb .yui-gb,.yui-gb .yui-gc,.yui-gb .yui-gd,.yui-gb .yui-ge,.yui-gb .yui-gf,.yui-gc .yui-u,.yui-gc .yui-g,.yui-gd .yui-u{float:left;}.yui-g .yui-u,.yui-g .yui-g,.yui-g .yui-gb,.yui-g .yui-gc,.yui-g .yui-gd,.yui-g .yui-ge,.yui-g .yui-gf,.yui-gc .yui-u,.yui-gd .yui-g,.yui-g .yui-gc .yui-u,.yui-ge .yui-u,.yui-ge .yui-g,.yui-gf .yui-g,.yui-gf .yui-u{float:right;}.yui-g div.first,.yui-gb div.first,.yui-gc div.first,.yui-gd div.first,.yui-ge div.first,.yui-gf div.first,.yui-g .yui-gc div.first,.yui-g .yui-ge div.first,.yui-gc div.first div.first{float:left;}.yui-g .yui-u,.yui-g .yui-g,.yui-g .yui-gb,.yui-g .yui-gc,.yui-g .yui-gd,.yui-g .yui-ge,.yui-g .yui-gf{width:49.1%;}.yui-gb .yui-u,.yui-g .yui-gb .yui-u,.yui-gb .yui-g,.yui-gb .yui-gb,.yui-gb .yui-gc,.yui-gb .yui-gd,.yui-gb .yui-ge,.yui-gb .yui-gf,.yui-gc .yui-u,.yui-gc .yui-g,.yui-gd .yui-u{width:32%;margin-left:1.99%;}.yui-gb .yui-u{*margin-left:1.9%;*width:31.9%;}.yui-gc div.first,.yui-gd .yui-u{width:66%;}.yui-gd div.first{width:32%;}.yui-ge div.first,.yui-gf .yui-u{width:74.2%;}.yui-ge .yui-u,.yui-gf div.first{width:24%;}.yui-g .yui-gb div.first,.yui-gb div.first,.yui-gc div.first,.yui-gd div.first{margin-left:0;}.yui-g .yui-g .yui-u,.yui-gb .yui-g .yui-u,.yui-gc .yui-g .yui-u,.yui-gd .yui-g .yui-u,.yui-ge .yui-g .yui-u,.yui-gf .yui-g .yui-u{width:49%;*width:48.1%;*margin-left:0;}.yui-g .yui-gb div.first,.yui-gb .yui-gb div.first{*margin-right:0;*width:32%;_width:31.7%;}.yui-g .yui-gc div.first,.yui-gd .yui-g{width:66%;}.yui-gb .yui-g div.first{*margin-right:4%;_margin-right:1.3%;}.yui-gb .yui-gc div.first,.yui-gb .yui-gd div.first{*margin-right:0;}.yui-gb .yui-gb .yui-u,.yui-gb .yui-gc .yui-u{*margin-left:1.8%;_margin-left:4%;}.yui-g .yui-gb .yui-u{_margin-left:1.0%;}.yui-gb .yui-gd .yui-u{*width:66%;_width:61.2%;}.yui-gb .yui-gd div.first{*width:31%;_width:29.5%;}.yui-g .yui-gc .yui-u,.yui-gb .yui-gc .yui-u{width:32%;_float:right;margin-right:0;_margin-left:0;}.yui-gb .yui-gc div.first{width:66%;*float:left;*margin-left:0;}.yui-gb .yui-ge .yui-u,.yui-gb .yui-gf .yui-u{margin:0;}.yui-gb .yui-gb .yui-u{_margin-left:.7%;}.yui-gb .yui-g div.first,.yui-gb .yui-gb div.first{*margin-left:0;}.yui-gc .yui-g .yui-u,.yui-gd .yui-g .yui-u{*width:48.1%;*margin-left:0;}s .yui-gb .yui-gd div.first{width:32%;}.yui-g .yui-gd div.first{_width:29.9%;}.yui-ge .yui-g{width:24%;}.yui-gf .yui-g{width:74.2%;}.yui-gb .yui-ge div.yui-u,.yui-gb .yui-gf div.yui-u{float:right;}.yui-gb .yui-ge div.first,.yui-gb .yui-gf div.first{float:left;}.yui-gb .yui-ge .yui-u,.yui-gb .yui-gf div.first{*width:24%;_width:20%;}.yui-gb .yui-ge div.first,.yui-gb .yui-gf .yui-u{*width:73.5%;_width:65.5%;}.yui-ge div.first .yui-gd .yui-u{width:65%;}.yui-ge div.first .yui-gd div.first{width:32%;}#bd:after,.yui-g:after,.yui-gb:after,.yui-gc:after,.yui-gd:after,.yui-ge:after,.yui-gf:after{content:".";display:block;height:0;clear:both;visibility:hidden;}#bd,.yui-g,.yui-gb,.yui-gc,.yui-gd,.yui-ge,.yui-gf{zoom:1;} \ No newline at end of file diff --git a/docs/_templates/genindex.html b/docs/_templates/genindex.html new file mode 100644 index 0000000000..60c19efd45 --- /dev/null +++ b/docs/_templates/genindex.html @@ -0,0 +1,4 @@ +{% extends "!genindex.html" %} + +{% block bodyclass %}{% endblock %} +{% block sidebarwrapper %}{% endblock %} \ No newline at end of file diff --git a/docs/_templates/layout.html b/docs/_templates/layout.html new file mode 100644 index 0000000000..eb42298ab3 --- /dev/null +++ b/docs/_templates/layout.html @@ -0,0 +1,87 @@ +{% extends "!layout.html" %} + +{%- macro secondnav %} + {%- if prev %} + « <a href="{{ prev.link|e }}" title="{{ prev.title|e }}">previous</a> + {{ reldelim2 }} + {%- endif %} + {%- if parents %} + <a href="{{ parents.0.link|e }}" title="{{ parents.0.title|e }}" accesskey="U">up</a> + {%- else %} + <a title="{{ docstitle }}" href="{{ pathto('index') }}" accesskey="U">up</a> + {%- endif %} + {%- if next %} + {{ reldelim2 }} + <a href="{{ next.link|e }}" title="{{ next.title|e }}">next</a> » + {%- endif %} +{%- endmacro %} + +{% block document %} + <div id="custom-doc" class="{% block bodyclass %}{{ 'yui-t6' if pagename != 'index' else '' }}{% endblock %}"> + <div id="hd"> + <h1><a href="{{ pathto('index') }}">{{ docstitle }}</a></h1> + <div id="global-nav"> + <a title="Home page" href="{{ pathto('index') }}">Home</a> {{ reldelim2 }} + <a title="Table of contents" href="{{ pathto('contents') }}">Table of contents</a> {{ reldelim2 }} + <a title="Global index" href="{{ pathto('genindex') }}">Index</a> {{ reldelim2 }} + <a title="Search" href="{{ pathto('modindex') }}">Modules</a> + </div> + <div class="nav">{{ secondnav() }}</div> + </div> + + <div id="bd"> + <div id="yui-main"> + <div class="yui-b"> + <div class="yui-g" id="{{ pagename|replace('/', '-') }}"> + {% block body %}{% endblock %} + </div> + </div> + </div> + {% block sidebarwrapper %} + {% if pagename != 'index' %} + <div class="yui-b" id="sidebar"> + {{ sidebar() }} + {%- if last_updated %} + <h3>Last update:</h3> + <p class="topless">{{ last_updated }}</p> + {%- endif %} + </div> + {% endif %} + {% endblock %} + </div> + + <div id="ft"> + <div class="nav">{{ secondnav() }}</div> + </div> + </div> +{% endblock %} + +{% block sidebarrel %} + <h3>Browse</h3> + <ul> + {% if prev %} + <li>Prev: <a href="{{ prev.link }}">{{ prev.title }}</a></li> + {% endif %} + {% if next %} + <li>Next: <a href="{{ next.link }}">{{ next.title }}</a></li> + {% endif %} + </ul> + <h3>You are here:</h3> + <ul> + <li> + <a href="{{ pathto('index') }}">{{ docstitle }}</a> + {% for p in parents %} + <ul><li><a href="{{ p.link }}">{{ p.title }}</a> + {% endfor %} + <ul><li>{{ title }}</li></ul> + {% for p in parents %}</li></ul>{% endfor %} + </li> + </ul> +{% endblock %} + +{# Empty some default blocks out #} +{% block relbar1 %}{% endblock %} +{% block relbar2 %}{% endblock %} +{% block sidebar1 %}{% endblock %} +{% block sidebar2 %}{% endblock %} +{% block footer %}{% endblock %} \ No newline at end of file diff --git a/docs/_templates/modindex.html b/docs/_templates/modindex.html new file mode 100644 index 0000000000..96a1d2080a --- /dev/null +++ b/docs/_templates/modindex.html @@ -0,0 +1,3 @@ +{% extends "!modindex.html" %} +{% block bodyclass %}{% endblock %} +{% block sidebarwrapper %}{% endblock %} \ No newline at end of file diff --git a/docs/_templates/search.html b/docs/_templates/search.html new file mode 100644 index 0000000000..8bd6dbd332 --- /dev/null +++ b/docs/_templates/search.html @@ -0,0 +1,3 @@ +{% extends "!search.html" %} +{% block bodyclass %}{% endblock %} +{% block sidebarwrapper %}{% endblock %} \ No newline at end of file diff --git a/docs/api_stability.txt b/docs/api_stability.txt deleted file mode 100644 index f56872ca51..0000000000 --- a/docs/api_stability.txt +++ /dev/null @@ -1,119 +0,0 @@ -============= -API stability -============= - -Although Django has not reached a 1.0 release, the bulk of Django's public APIs are -stable as of the 0.95 release. This document explains which APIs will and will not -change before the 1.0 release. - -What "stable" means -=================== - -In this context, stable means: - - - All the public APIs -- everything documented in the linked documents, and - all methods that don't begin with an underscore -- will not be moved or - renamed without providing backwards-compatible aliases. - - - If new features are added to these APIs -- which is quite possible -- - they will not break or change the meaning of existing methods. In other - words, "stable" does not (necessarily) mean "complete." - - - If, for some reason, an API declared stable must be removed or replaced, it - will be declared deprecated but will remain in the API until at least - version 1.1. Warnings will be issued when the deprecated method is - called. - - - We'll only break backwards compatibility of these APIs if a bug or - security hole makes it completely unavoidable. - -Stable APIs -=========== - -These APIs are stable: - - - `Caching`_. - - - `Custom template tags and libraries`_ (with the possible exception for a - small change in the way templates are registered and loaded). - - - `Database lookup`_ (with the exception of validation; see below). - - - `django-admin utility`_. - - - `FastCGI integration`_. - - - `Flatpages`_. - - - `Generic views`_. - - - `Internationalization`_. - - - `Legacy database integration`_. - - - `Model definition`_ (with the exception of generic relations; see below). - - - `mod_python integration`_. - - - `Redirects`_. - - - `Request/response objects`_. - - - `Sending e-mail`_. - - - `Sessions`_. - - - `Settings`_. - - - `Syndication`_. - - - `Template language`_ (with the exception of some possible disambiguation - of how tag arguments are passed to tags and filters). - - - `Transactions`_. - - - `URL dispatch`_. - -You'll notice that this list comprises the bulk of Django's APIs. That's right --- most of the changes planned between now and Django 1.0 are either under the -hood, feature additions, or changes to a few select bits. A good estimate is -that 90% of Django can be considered forwards-compatible at this point. - -That said, these APIs should *not* be considered stable, and are likely to -change: - - - `Serialization`_ is under heavy development; changes are likely. - - - The `authentication`_ framework is changing to be far more flexible, and - API changes may be necessary. - - - Generic relations will most likely be moved out of core and into the - content-types contrib package to avoid core dependencies on optional - components. - - - The comments framework, which is yet undocumented, will likely get a complete - rewrite before Django 1.0. Even if the change isn't quite that drastic, - there will at least be moderate changes. - -.. _caching: ../cache/ -.. _custom template tags and libraries: ../templates_python/ -.. _database lookup: ../db-api/ -.. _django-admin utility: ../django-admin/ -.. _fastcgi integration: ../fastcgi/ -.. _flatpages: ../flatpages/ -.. _generic views: ../generic_views/ -.. _internationalization: ../i18n/ -.. _legacy database integration: ../legacy_databases/ -.. _model definition: ../model-api/ -.. _mod_python integration: ../modpython/ -.. _redirects: ../redirects/ -.. _request/response objects: ../request_response/ -.. _sending e-mail: ../email/ -.. _sessions: ../sessions/ -.. _settings: ../settings/ -.. _syndication: ../syndication_feeds/ -.. _template language: ../templates/ -.. _transactions: ../transactions/ -.. _url dispatch: ../url_dispatch/ -.. _serialization: ../serialization/ -.. _authentication: ../authentication/ diff --git a/docs/authentication.txt b/docs/authentication.txt deleted file mode 100644 index 4345fc0c11..0000000000 --- a/docs/authentication.txt +++ /dev/null @@ -1,1173 +0,0 @@ -============================= -User authentication in Django -============================= - -Django comes with a user authentication system. It handles user accounts, -groups, permissions and cookie-based user sessions. This document explains how -things work. - -Overview -======== - -The auth system consists of: - - * Users - * Permissions: Binary (yes/no) flags designating whether a user may perform - a certain task. - * Groups: A generic way of applying labels and permissions to more than one - user. - * Messages: A simple way to queue messages for given users. - -Installation -============ - -Authentication support is bundled as a Django application in -``django.contrib.auth``. To install it, do the following: - - 1. Put ``'django.contrib.auth'`` in your ``INSTALLED_APPS`` setting. - 2. Run the command ``manage.py syncdb``. - -Note that the default ``settings.py`` file created by -``django-admin.py startproject`` includes ``'django.contrib.auth'`` in -``INSTALLED_APPS`` for convenience. If your ``INSTALLED_APPS`` already contains -``'django.contrib.auth'``, feel free to run ``manage.py syncdb`` again; you -can run that command as many times as you'd like, and each time it'll only -install what's needed. - -The ``syncdb`` command creates the necessary database tables, creates -permission objects for all installed apps that need 'em, and prompts you to -create a superuser account the first time you run it. - -Once you've taken those steps, that's it. - -Users -===== - -Users are represented by a standard Django model, which lives in -`django/contrib/auth/models.py`_. - -.. _django/contrib/auth/models.py: http://code.djangoproject.com/browser/django/trunk/django/contrib/auth/models.py - -API reference -------------- - -Fields -~~~~~~ - -``User`` objects have the following fields: - - * ``username`` -- Required. 30 characters or fewer. Alphanumeric characters - only (letters, digits and underscores). - * ``first_name`` -- Optional. 30 characters or fewer. - * ``last_name`` -- Optional. 30 characters or fewer. - * ``email`` -- Optional. E-mail address. - * ``password`` -- Required. A hash of, and metadata about, the password. - (Django doesn't store the raw password.) Raw passwords can be arbitrarily - long and can contain any character. See the "Passwords" section below. - * ``is_staff`` -- Boolean. Designates whether this user can access the - admin site. - * ``is_active`` -- Boolean. Designates whether this account can be used - to log in. Set this flag to ``False`` instead of deleting accounts. - * ``is_superuser`` -- Boolean. Designates that this user has all permissions - without explicitly assigning them. - * ``last_login`` -- A datetime of the user's last login. Is set to the - current date/time by default. - * ``date_joined`` -- A datetime designating when the account was created. - Is set to the current date/time by default when the account is created. - -Methods -~~~~~~~ - -``User`` objects have two many-to-many fields: ``groups`` and -``user_permissions``. ``User`` objects can access their related -objects in the same way as any other `Django model`_:: - - myuser.groups = [group_list] - myuser.groups.add(group, group, ...) - myuser.groups.remove(group, group, ...) - myuser.groups.clear() - myuser.user_permissions = [permission_list] - myuser.user_permissions.add(permission, permission, ...) - myuser.user_permissions.remove(permission, permission, ...) - myuser.user_permissions.clear() - -In addition to those automatic API methods, ``User`` objects have the following -custom methods: - - * ``is_anonymous()`` -- Always returns ``False``. This is a way of - differentiating ``User`` and ``AnonymousUser`` objects. Generally, you - should prefer using ``is_authenticated()`` to this method. - - * ``is_authenticated()`` -- Always returns ``True``. This is a way to - tell if the user has been authenticated. This does not imply any - permissions, and doesn't check if the user is active - it only indicates - that the user has provided a valid username and password. - - * ``get_full_name()`` -- Returns the ``first_name`` plus the ``last_name``, - with a space in between. - - * ``set_password(raw_password)`` -- Sets the user's password to the given - raw string, taking care of the password hashing. Doesn't save the - ``User`` object. - - * ``check_password(raw_password)`` -- Returns ``True`` if the given raw - string is the correct password for the user. (This takes care of the - password hashing in making the comparison.) - - * ``set_unusable_password()`` -- **New in Django development version.** - Marks the user as having no password set. This isn't the same as having - a blank string for a password. ``check_password()`` for this user will - never return ``True``. Doesn't save the ``User`` object. - - You may need this if authentication for your application takes place - against an existing external source such as an LDAP directory. - - * ``has_usable_password()`` -- **New in Django development version.** - Returns ``False`` if ``set_unusable_password()`` has been called for this - user. - - * ``get_group_permissions()`` -- Returns a list of permission strings that - the user has, through his/her groups. - - * ``get_all_permissions()`` -- Returns a list of permission strings that - the user has, both through group and user permissions. - - * ``has_perm(perm)`` -- Returns ``True`` if the user has the specified - permission, where perm is in the format ``"package.codename"``. - If the user is inactive, this method will always return ``False``. - - * ``has_perms(perm_list)`` -- Returns ``True`` if the user has each of the - specified permissions, where each perm is in the format - ``"package.codename"``. If the user is inactive, this method will - always return ``False``. - - * ``has_module_perms(package_name)`` -- Returns ``True`` if the user has - any permissions in the given package (the Django app label). - If the user is inactive, this method will always return ``False``. - - * ``get_and_delete_messages()`` -- Returns a list of ``Message`` objects in - the user's queue and deletes the messages from the queue. - - * ``email_user(subject, message, from_email=None)`` -- Sends an e-mail to - the user. If ``from_email`` is ``None``, Django uses the - `DEFAULT_FROM_EMAIL`_ setting. - - * ``get_profile()`` -- Returns a site-specific profile for this user. - Raises ``django.contrib.auth.models.SiteProfileNotAvailable`` if the current site - doesn't allow profiles. For information on how to define a - site-specific user profile, see the section on `storing additional - user information`_ below. - -.. _Django model: ../model-api/ -.. _DEFAULT_FROM_EMAIL: ../settings/#default-from-email -.. _storing additional user information: #storing-additional-information-about-users - -Manager functions -~~~~~~~~~~~~~~~~~ - -The ``User`` model has a custom manager that has the following helper functions: - - * ``create_user(username, email, password=None)`` -- Creates, saves and - returns a ``User``. The ``username``, ``email`` and ``password`` are set - as given, and the ``User`` gets ``is_active=True``. - - If no password is provided, ``set_unusable_password()`` will be called. - - See `Creating users`_ for example usage. - - * ``make_random_password(length=10, allowed_chars='abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789')`` - Returns a random password with the given length and given string of - allowed characters. (Note that the default value of ``allowed_chars`` - doesn't contain letters that can cause user confusion, including - ``1``, ``I`` and ``0``). - -Basic usage ------------ - -Creating users -~~~~~~~~~~~~~~ - -The most basic way to create users is to use the ``create_user`` helper -function that comes with Django:: - - >>> from django.contrib.auth.models import User - >>> user = User.objects.create_user('john', 'lennon@thebeatles.com', 'johnpassword') - - # At this point, user is a User object that has already been saved - # to the database. You can continue to change its attributes - # if you want to change other fields. - >>> user.is_staff = True - >>> user.save() - -Changing passwords -~~~~~~~~~~~~~~~~~~ - -Change a password with ``set_password()``:: - - >>> from django.contrib.auth.models import User - >>> u = User.objects.get(username__exact='john') - >>> u.set_password('new password') - >>> u.save() - -Don't set the ``password`` attribute directly unless you know what you're -doing. This is explained in the next section. - -Passwords ---------- - -The ``password`` attribute of a ``User`` object is a string in this format:: - - hashtype$salt$hash - -That's hashtype, salt and hash, separated by the dollar-sign character. - -Hashtype is either ``sha1`` (default), ``md5`` or ``crypt`` -- the algorithm -used to perform a one-way hash of the password. Salt is a random string used -to salt the raw password to create the hash. Note that the ``crypt`` method is -only supported on platforms that have the standard Python ``crypt`` module -available, and ``crypt`` support is only available in the Django development -version. - -For example:: - - sha1$a1976$a36cc8cbf81742a8fb52e221aaeab48ed7f58ab4 - -The ``User.set_password()`` and ``User.check_password()`` functions handle -the setting and checking of these values behind the scenes. - -Previous Django versions, such as 0.90, used simple MD5 hashes without password -salts. For backwards compatibility, those are still supported; they'll be -converted automatically to the new style the first time ``User.check_password()`` -works correctly for a given user. - -Anonymous users ---------------- - -``django.contrib.auth.models.AnonymousUser`` is a class that implements -the ``django.contrib.auth.models.User`` interface, with these differences: - - * ``id`` is always ``None``. - * ``is_staff`` and ``is_superuser`` are always ``False``. - * ``is_active`` is always ``False``. - * ``groups`` and ``user_permissions`` are always empty. - * ``is_anonymous()`` returns ``True`` instead of ``False``. - * ``is_authenticated()`` returns ``False`` instead of ``True``. - * ``has_perm()`` always returns ``False``. - * ``set_password()``, ``check_password()``, ``save()``, ``delete()``, - ``set_groups()`` and ``set_permissions()`` raise ``NotImplementedError``. - -In practice, you probably won't need to use ``AnonymousUser`` objects on your -own, but they're used by Web requests, as explained in the next section. - -Creating superusers -------------------- - -``manage.py syncdb`` prompts you to create a superuser the first time you run -it after adding ``'django.contrib.auth'`` to your ``INSTALLED_APPS``. If you need -to create a superuser at a later date, you can use a command line utility. - -**New in Django development version.**:: - - manage.py createsuperuser --username=joe --email=joe@example.com - -You will be prompted for a password. After you enter one, the user will be -created immediately. If you leave off the ``--username`` or the ``--email`` -options, it will prompt you for those values. - -If you're using an older release of Django, the old way of creating a superuser -on the command line still works:: - - python /path/to/django/contrib/auth/create_superuser.py - -...where ``/path/to`` is the path to the Django codebase on your filesystem. The -``manage.py`` command is preferred because it figures out the correct path and -environment for you. - -Storing additional information about users ------------------------------------------- - -If you'd like to store additional information related to your users, -Django provides a method to specify a site-specific related model -- -termed a "user profile" -- for this purpose. - -To make use of this feature, define a model with fields for the -additional information you'd like to store, or additional methods -you'd like to have available, and also add a ``ForeignKey`` from your -model to the ``User`` model, specified with ``unique=True`` to ensure -only one instance of your model can be created for each ``User``. - -To indicate that this model is the user profile model for a given -site, fill in the setting ``AUTH_PROFILE_MODULE`` with a string -consisting of the following items, separated by a dot: - -1. The (normalized to lower-case) name of the application in which the - user profile model is defined (in other words, an all-lowercase - version of the name which was passed to ``manage.py startapp`` to - create the application). - -2. The (normalized to lower-case) name of the model class. - -For example, if the profile model was a class named ``UserProfile`` -and was defined inside an application named ``accounts``, the -appropriate setting would be:: - - AUTH_PROFILE_MODULE = 'accounts.userprofile' - -When a user profile model has been defined and specified in this -manner, each ``User`` object will have a method -- ``get_profile()`` --- which returns the instance of the user profile model associated -with that ``User``. - -For more information, see `Chapter 12 of the Django book`_. - -.. _Chapter 12 of the Django book: http://www.djangobook.com/en/1.0/chapter12/#cn222 - -Authentication in Web requests -============================== - -Until now, this document has dealt with the low-level APIs for manipulating -authentication-related objects. On a higher level, Django can hook this -authentication framework into its system of `request objects`_. - -First, install the ``SessionMiddleware`` and ``AuthenticationMiddleware`` -middlewares by adding them to your ``MIDDLEWARE_CLASSES`` setting. See the -`session documentation`_ for more information. - -Once you have those middlewares installed, you'll be able to access -``request.user`` in views. ``request.user`` will give you a ``User`` object -representing the currently logged-in user. If a user isn't currently logged in, -``request.user`` will be set to an instance of ``AnonymousUser`` (see the -previous section). You can tell them apart with ``is_authenticated()``, like so:: - - if request.user.is_authenticated(): - # Do something for authenticated users. - else: - # Do something for anonymous users. - -.. _request objects: ../request_response/#httprequest-objects -.. _session documentation: ../sessions/ - -How to log a user in --------------------- - -Django provides two functions in ``django.contrib.auth``: ``authenticate()`` -and ``login()``. - -To authenticate a given username and password, use ``authenticate()``. It -takes two keyword arguments, ``username`` and ``password``, and it returns -a ``User`` object if the password is valid for the given username. If the -password is invalid, ``authenticate()`` returns ``None``. Example:: - - from django.contrib.auth import authenticate - user = authenticate(username='john', password='secret') - if user is not None: - if user.is_active: - print "You provided a correct username and password!" - else: - print "Your account has been disabled!" - else: - print "Your username and password were incorrect." - -To log a user in, in a view, use ``login()``. It takes an ``HttpRequest`` -object and a ``User`` object. ``login()`` saves the user's ID in the session, -using Django's session framework, so, as mentioned above, you'll need to make -sure to have the session middleware installed. - -This example shows how you might use both ``authenticate()`` and ``login()``:: - - from django.contrib.auth import authenticate, login - - def my_view(request): - username = request.POST['username'] - password = request.POST['password'] - user = authenticate(username=username, password=password) - if user is not None: - if user.is_active: - login(request, user) - # Redirect to a success page. - else: - # Return a 'disabled account' error message - else: - # Return an 'invalid login' error message. - -.. admonition:: Calling ``authenticate()`` first - - When you're manually logging a user in, you *must* call - ``authenticate()`` before you call ``login()``. ``authenticate()`` - sets an attribute on the ``User`` noting which authentication - backend successfully authenticated that user (see the `backends - documentation`_ for details), and this information is needed later - during the login process. - -.. _backends documentation: #other-authentication-sources - -Manually checking a user's password ------------------------------------ - -If you'd like to manually authenticate a user by comparing a -plain-text password to the hashed password in the database, use the -convenience function ``django.contrib.auth.models.check_password``. It -takes two arguments: the plain-text password to check, and the full -value of a user's ``password`` field in the database to check against, -and returns ``True`` if they match, ``False`` otherwise. - -How to log a user out ---------------------- - -To log out a user who has been logged in via ``django.contrib.auth.login()``, -use ``django.contrib.auth.logout()`` within your view. It takes an -``HttpRequest`` object and has no return value. Example:: - - from django.contrib.auth import logout - - def logout_view(request): - logout(request) - # Redirect to a success page. - -Note that ``logout()`` doesn't throw any errors if the user wasn't logged in. - -**New in Django development version:** When you call ``logout()``, the session -data for the current request is completely cleaned out. All existing data is -removed. This is to prevent another person from using the same web browser to -log in and have access to the previous user's session data. If you want to put -anything into the session that will be available to the user immediately after -logging out, do that *after* calling ``django.contrib.auth.logout()``. - -Limiting access to logged-in users ----------------------------------- - -The raw way -~~~~~~~~~~~ - -The simple, raw way to limit access to pages is to check -``request.user.is_authenticated()`` and either redirect to a login page:: - - from django.http import HttpResponseRedirect - - def my_view(request): - if not request.user.is_authenticated(): - return HttpResponseRedirect('/login/?next=%s' % request.path) - # ... - -...or display an error message:: - - def my_view(request): - if not request.user.is_authenticated(): - return render_to_response('myapp/login_error.html') - # ... - -The login_required decorator -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -As a shortcut, you can use the convenient ``login_required`` decorator:: - - from django.contrib.auth.decorators import login_required - - def my_view(request): - # ... - my_view = login_required(my_view) - -Here's an equivalent example, using the more compact decorator syntax -introduced in Python 2.4:: - - from django.contrib.auth.decorators import login_required - - @login_required - def my_view(request): - # ... - -In the Django development version, ``login_required`` also takes an optional -``redirect_field_name`` parameter. Example:: - - from django.contrib.auth.decorators import login_required - - def my_view(request): - # ... - my_view = login_required(redirect_field_name='redirect_to')(my_view) - -Again, an equivalent example of the more compact decorator syntax introduced in Python 2.4:: - - from django.contrib.auth.decorators import login_required - - @login_required(redirect_field_name='redirect_to') - def my_view(request): - # ... - -``login_required`` does the following: - - * If the user isn't logged in, redirect to ``settings.LOGIN_URL`` - (``/accounts/login/`` by default), passing the current absolute URL - in the query string as ``next`` or the value of ``redirect_field_name``. - For example: - ``/accounts/login/?next=/polls/3/``. - * If the user is logged in, execute the view normally. The view code is - free to assume the user is logged in. - -Note that you'll need to map the appropriate Django view to ``settings.LOGIN_URL``. -For example, using the defaults, add the following line to your URLconf:: - - (r'^accounts/login/$', 'django.contrib.auth.views.login'), - -Here's what ``django.contrib.auth.views.login`` does: - - * If called via ``GET``, it displays a login form that POSTs to the same - URL. More on this in a bit. - - * If called via ``POST``, it tries to log the user in. If login is - successful, the view redirects to the URL specified in ``next``. If - ``next`` isn't provided, it redirects to ``settings.LOGIN_REDIRECT_URL`` - (which defaults to ``/accounts/profile/``). If login isn't successful, - it redisplays the login form. - -It's your responsibility to provide the login form in a template called -``registration/login.html`` by default. This template gets passed three -template context variables: - - * ``form``: A ``Form`` object representing the login form. See the - `forms documentation`_ for more on ``FormWrapper`` objects. - * ``next``: The URL to redirect to after successful login. This may contain - a query string, too. - * ``site_name``: The name of the current ``Site``, according to the - ``SITE_ID`` setting. If you're using the Django development version and - you don't have the site framework installed, this will be set to the - value of ``request.META['SERVER_NAME']``. For more on sites, see the - `site framework docs`_. - -If you'd prefer not to call the template ``registration/login.html``, you can -pass the ``template_name`` parameter via the extra arguments to the view in -your URLconf. For example, this URLconf line would use ``myapp/login.html`` -instead:: - - (r'^accounts/login/$', 'django.contrib.auth.views.login', {'template_name': 'myapp/login.html'}), - -Here's a sample ``registration/login.html`` template you can use as a starting -point. It assumes you have a ``base.html`` template that defines a ``content`` -block:: - - {% extends "base.html" %} - - {% block content %} - - {% if form.errors %} - <p>Your username and password didn't match. Please try again.</p> - {% endif %} - - <form method="post" action="."> - <table> - <tr><td>{{ form.username.label_tag }}</td><td>{{ form.username }}</td></tr> - <tr><td>{{ form.password.label_tag }}</td><td>{{ form.password }}</td></tr> - </table> - - <input type="submit" value="login" /> - <input type="hidden" name="next" value="{{ next }}" /> - </form> - - {% endblock %} - -.. _forms documentation: ../forms/ -.. _site framework docs: ../sites/ - -Other built-in views --------------------- - -In addition to the ``login`` view, the authentication system includes a -few other useful built-in views: - -``django.contrib.auth.views.logout`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -**Description:** - -Logs a user out. - -**Optional arguments:** - - * ``template_name``: The full name of a template to display after - logging the user out. This will default to - ``registration/logged_out.html`` if no argument is supplied. - -**Template context:** - - * ``title``: The string "Logged out", localized. - -``django.contrib.auth.views.logout_then_login`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -**Description:** - -Logs a user out, then redirects to the login page. - -**Optional arguments:** - - * ``login_url``: The URL of the login page to redirect to. This - will default to ``settings.LOGIN_URL`` if not supplied. - -``django.contrib.auth.views.password_change`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -**Description:** - -Allows a user to change their password. - -**Optional arguments:** - - * ``template_name``: The full name of a template to use for - displaying the password change form. This will default to - ``registration/password_change_form.html`` if not supplied. - -**Template context:** - - * ``form``: The password change form. - -``django.contrib.auth.views.password_change_done`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -**Description:** - -The page shown after a user has changed their password. - -**Optional arguments:** - - * ``template_name``: The full name of a template to use. This will - default to ``registration/password_change_done.html`` if not - supplied. - -``django.contrib.auth.views.password_reset`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -**Description:** - -Allows a user to reset their password, and sends them the new password -in an e-mail. - -**Optional arguments:** - - * ``template_name``: The full name of a template to use for - displaying the password reset form. This will default to - ``registration/password_reset_form.html`` if not supplied. - - * ``email_template_name``: The full name of a template to use for - generating the e-mail with the new password. This will default to - ``registration/password_reset_email.html`` if not supplied. - -**Template context:** - - * ``form``: The form for resetting the user's password. - -``django.contrib.auth.views.password_reset_done`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -**Description:** - -The page shown after a user has reset their password. - -**Optional arguments:** - - * ``template_name``: The full name of a template to use. This will - default to ``registration/password_reset_done.html`` if not - supplied. - -``django.contrib.auth.views.redirect_to_login`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -**Description:** - -Redirects to the login page, and then back to another URL after a -successful login. - -**Required arguments:** - - * ``next``: The URL to redirect to after a successful login. - -**Optional arguments:** - - * ``login_url``: The URL of the login page to redirect to. This - will default to ``settings.LOGIN_URL`` if not supplied. - -Built-in forms --------------- - -**New in Django development version.** - -If you don't want to use the built-in views, but want the convenience -of not having to write forms for this functionality, the authentication -system provides several built-in forms: - - * ``django.contrib.auth.forms.AdminPasswordChangeForm``: A form used in - the admin interface to change a user's password. - - * ``django.contrib.auth.forms.AuthenticationForm``: A form for logging a - user in. - - * ``django.contrib.auth.forms.PasswordChangeForm``: A form for allowing a - user to change their password. - - * ``django.contrib.auth.forms.PasswordResetForm``: A form for resetting a - user's password and e-mailing the new password to them. - - * ``django.contrib.auth.forms.UserCreationForm``: A form for creating a - new user. - -Limiting access to logged-in users that pass a test ---------------------------------------------------- - -To limit access based on certain permissions or some other test, you'd do -essentially the same thing as described in the previous section. - -The simple way is to run your test on ``request.user`` in the view directly. -For example, this view checks to make sure the user is logged in and has the -permission ``polls.can_vote``:: - - def my_view(request): - if not (request.user.is_authenticated() and request.user.has_perm('polls.can_vote')): - return HttpResponse("You can't vote in this poll.") - # ... - -As a shortcut, you can use the convenient ``user_passes_test`` decorator:: - - from django.contrib.auth.decorators import user_passes_test - - def my_view(request): - # ... - my_view = user_passes_test(lambda u: u.has_perm('polls.can_vote'))(my_view) - -We're using this particular test as a relatively simple example. However, if -you just want to test whether a permission is available to a user, you can use -the ``permission_required()`` decorator, described later in this document. - -Here's the same thing, using Python 2.4's decorator syntax:: - - from django.contrib.auth.decorators import user_passes_test - - @user_passes_test(lambda u: u.has_perm('polls.can_vote')) - def my_view(request): - # ... - -``user_passes_test`` takes a required argument: a callable that takes a -``User`` object and returns ``True`` if the user is allowed to view the page. -Note that ``user_passes_test`` does not automatically check that the ``User`` -is not anonymous. - -``user_passes_test()`` takes an optional ``login_url`` argument, which lets you -specify the URL for your login page (``settings.LOGIN_URL`` by default). - -Example in Python 2.3 syntax:: - - from django.contrib.auth.decorators import user_passes_test - - def my_view(request): - # ... - my_view = user_passes_test(lambda u: u.has_perm('polls.can_vote'), login_url='/login/')(my_view) - -Example in Python 2.4 syntax:: - - from django.contrib.auth.decorators import user_passes_test - - @user_passes_test(lambda u: u.has_perm('polls.can_vote'), login_url='/login/') - def my_view(request): - # ... - -The permission_required decorator -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -It's a relatively common task to check whether a user has a particular -permission. For that reason, Django provides a shortcut for that case: the -``permission_required()`` decorator. Using this decorator, the earlier example -can be written as:: - - from django.contrib.auth.decorators import permission_required - - def my_view(request): - # ... - my_view = permission_required('polls.can_vote')(my_view) - -Note that ``permission_required()`` also takes an optional ``login_url`` -parameter. Example:: - - from django.contrib.auth.decorators import permission_required - - def my_view(request): - # ... - my_view = permission_required('polls.can_vote', login_url='/loginpage/')(my_view) - -As in the ``login_required`` decorator, ``login_url`` defaults to -``settings.LOGIN_URL``. - -Limiting access to generic views --------------------------------- - -To limit access to a `generic view`_, write a thin wrapper around the view, -and point your URLconf to your wrapper instead of the generic view itself. -For example:: - - from django.views.generic.date_based import object_detail - - @login_required - def limited_object_detail(*args, **kwargs): - return object_detail(*args, **kwargs) - -.. _generic view: ../generic_views/ - -Permissions -=========== - -Django comes with a simple permissions system. It provides a way to assign -permissions to specific users and groups of users. - -It's used by the Django admin site, but you're welcome to use it in your own -code. - -The Django admin site uses permissions as follows: - - * Access to view the "add" form and add an object is limited to users with - the "add" permission for that type of object. - * Access to view the change list, view the "change" form and change an - object is limited to users with the "change" permission for that type of - object. - * Access to delete an object is limited to users with the "delete" - permission for that type of object. - -Permissions are set globally per type of object, not per specific object -instance. For example, it's possible to say "Mary may change news stories," but -it's not currently possible to say "Mary may change news stories, but only the -ones she created herself" or "Mary may only change news stories that have a -certain status, publication date or ID." The latter functionality is something -Django developers are currently discussing. - -Default permissions -------------------- - -When ``django.contrib.auth`` is listed in your ``INSTALLED_APPS`` -setting, it will ensure that three default permissions -- add, change -and delete -- are created for each Django model defined in one of your -installed applications. - -These permissions will be created when you run ``manage.py syncdb``; -the first time you run ``syncdb`` after adding ``django.contrib.auth`` -to ``INSTALLED_APPS``, the default permissions will be created for all -previously-installed models, as well as for any new models being -installed at that time. Afterward, it will create default permissions -for new models each time you run ``manage.py syncdb``. - -Custom permissions ------------------- - -To create custom permissions for a given model object, use the ``permissions`` -`model Meta attribute`_. - -This example model creates three custom permissions:: - - class USCitizen(models.Model): - # ... - class Meta: - permissions = ( - ("can_drive", "Can drive"), - ("can_vote", "Can vote in elections"), - ("can_drink", "Can drink alcohol"), - ) - -The only thing this does is create those extra permissions when you run -``syncdb``. - -.. _model Meta attribute: ../model-api/#meta-options - -API reference -------------- - -Just like users, permissions are implemented in a Django model that lives in -`django/contrib/auth/models.py`_. - -.. _django/contrib/auth/models.py: http://code.djangoproject.com/browser/django/trunk/django/contrib/auth/models.py - -Fields -~~~~~~ - -``Permission`` objects have the following fields: - - * ``name`` -- Required. 50 characters or fewer. Example: ``'Can vote'``. - * ``content_type`` -- Required. A reference to the ``django_content_type`` - database table, which contains a record for each installed Django model. - * ``codename`` -- Required. 100 characters or fewer. Example: ``'can_vote'``. - -Methods -~~~~~~~ - -``Permission`` objects have the standard data-access methods like any other -`Django model`_. - -Authentication data in templates -================================ - -The currently logged-in user and his/her permissions are made available in the -`template context`_ when you use ``RequestContext``. - -.. admonition:: Technicality - - Technically, these variables are only made available in the template context - if you use ``RequestContext`` *and* your ``TEMPLATE_CONTEXT_PROCESSORS`` - setting contains ``"django.core.context_processors.auth"``, which is default. - For more, see the `RequestContext docs`_. - - .. _RequestContext docs: ../templates_python/#subclassing-context-requestcontext - -Users ------ - -The currently logged-in user, either a ``User`` instance or an``AnonymousUser`` -instance, is stored in the template variable ``{{ user }}``:: - - {% if user.is_authenticated %} - <p>Welcome, {{ user.username }}. Thanks for logging in.</p> - {% else %} - <p>Welcome, new user. Please log in.</p> - {% endif %} - -Permissions ------------ - -The currently logged-in user's permissions are stored in the template variable -``{{ perms }}``. This is an instance of ``django.core.context_processors.PermWrapper``, -which is a template-friendly proxy of permissions. - -In the ``{{ perms }}`` object, single-attribute lookup is a proxy to -``User.has_module_perms``. This example would display ``True`` if the logged-in -user had any permissions in the ``foo`` app:: - - {{ perms.foo }} - -Two-level-attribute lookup is a proxy to ``User.has_perm``. This example would -display ``True`` if the logged-in user had the permission ``foo.can_vote``:: - - {{ perms.foo.can_vote }} - -Thus, you can check permissions in template ``{% if %}`` statements:: - - {% if perms.foo %} - <p>You have permission to do something in the foo app.</p> - {% if perms.foo.can_vote %} - <p>You can vote!</p> - {% endif %} - {% if perms.foo.can_drive %} - <p>You can drive!</p> - {% endif %} - {% else %} - <p>You don't have permission to do anything in the foo app.</p> - {% endif %} - -.. _template context: ../templates_python/ - -Groups -====== - -Groups are a generic way of categorizing users so you can apply permissions, or -some other label, to those users. A user can belong to any number of groups. - -A user in a group automatically has the permissions granted to that group. For -example, if the group ``Site editors`` has the permission -``can_edit_home_page``, any user in that group will have that permission. - -Beyond permissions, groups are a convenient way to categorize users to give -them some label, or extended functionality. For example, you could create a -group ``'Special users'``, and you could write code that could, say, give them -access to a members-only portion of your site, or send them members-only e-mail -messages. - -Messages -======== - -The message system is a lightweight way to queue messages for given users. - -A message is associated with a ``User``. There's no concept of expiration or -timestamps. - -Messages are used by the Django admin after successful actions. For example, -``"The poll Foo was created successfully."`` is a message. - -The API is simple: - - * To create a new message, use - ``user_obj.message_set.create(message='message_text')``. - * To retrieve/delete messages, use ``user_obj.get_and_delete_messages()``, - which returns a list of ``Message`` objects in the user's queue (if any) - and deletes the messages from the queue. - -In this example view, the system saves a message for the user after creating -a playlist:: - - def create_playlist(request, songs): - # Create the playlist with the given songs. - # ... - request.user.message_set.create(message="Your playlist was added successfully.") - return render_to_response("playlists/create.html", - context_instance=RequestContext(request)) - -When you use ``RequestContext``, the currently logged-in user and his/her -messages are made available in the `template context`_ as the template variable -``{{ messages }}``. Here's an example of template code that displays messages:: - - {% if messages %} - <ul> - {% for message in messages %} - <li>{{ message }}</li> - {% endfor %} - </ul> - {% endif %} - -Note that ``RequestContext`` calls ``get_and_delete_messages`` behind the -scenes, so any messages will be deleted even if you don't display them. - -Finally, note that this messages framework only works with users in the user -database. To send messages to anonymous users, use the `session framework`_. - -.. _session framework: ../sessions/ - -Other authentication sources -============================ - -The authentication that comes with Django is good enough for most common cases, -but you may have the need to hook into another authentication source -- that -is, another source of usernames and passwords or authentication methods. - -For example, your company may already have an LDAP setup that stores a username -and password for every employee. It'd be a hassle for both the network -administrator and the users themselves if users had separate accounts in LDAP -and the Django-based applications. - -So, to handle situations like this, the Django authentication system lets you -plug in another authentication sources. You can override Django's default -database-based scheme, or you can use the default system in tandem with other -systems. - -Specifying authentication backends ----------------------------------- - -Behind the scenes, Django maintains a list of "authentication backends" that it -checks for authentication. When somebody calls -``django.contrib.auth.authenticate()`` -- as described in "How to log a user in" -above -- Django tries authenticating across all of its authentication backends. -If the first authentication method fails, Django tries the second one, and so -on, until all backends have been attempted. - -The list of authentication backends to use is specified in the -``AUTHENTICATION_BACKENDS`` setting. This should be a tuple of Python path -names that point to Python classes that know how to authenticate. These classes -can be anywhere on your Python path. - -By default, ``AUTHENTICATION_BACKENDS`` is set to:: - - ('django.contrib.auth.backends.ModelBackend',) - -That's the basic authentication scheme that checks the Django users database. - -The order of ``AUTHENTICATION_BACKENDS`` matters, so if the same username and -password is valid in multiple backends, Django will stop processing at the -first positive match. - -Writing an authentication backend ---------------------------------- - -An authentication backend is a class that implements two methods: -``get_user(user_id)`` and ``authenticate(**credentials)``. - -The ``get_user`` method takes a ``user_id`` -- which could be a username, -database ID or whatever -- and returns a ``User`` object. - -The ``authenticate`` method takes credentials as keyword arguments. Most of -the time, it'll just look like this:: - - class MyBackend: - def authenticate(self, username=None, password=None): - # Check the username/password and return a User. - -But it could also authenticate a token, like so:: - - class MyBackend: - def authenticate(self, token=None): - # Check the token and return a User. - -Either way, ``authenticate`` should check the credentials it gets, and it -should return a ``User`` object that matches those credentials, if the -credentials are valid. If they're not valid, it should return ``None``. - -The Django admin system is tightly coupled to the Django ``User`` object -described at the beginning of this document. For now, the best way to deal with -this is to create a Django ``User`` object for each user that exists for your -backend (e.g., in your LDAP directory, your external SQL database, etc.) You -can either write a script to do this in advance, or your ``authenticate`` -method can do it the first time a user logs in. - -Here's an example backend that authenticates against a username and password -variable defined in your ``settings.py`` file and creates a Django ``User`` -object the first time a user authenticates:: - - from django.conf import settings - from django.contrib.auth.models import User, check_password - - class SettingsBackend: - """ - Authenticate against the settings ADMIN_LOGIN and ADMIN_PASSWORD. - - Use the login name, and a hash of the password. For example: - - ADMIN_LOGIN = 'admin' - ADMIN_PASSWORD = 'sha1$4e987$afbcf42e21bd417fb71db8c66b321e9fc33051de' - """ - def authenticate(self, username=None, password=None): - login_valid = (settings.ADMIN_LOGIN == username) - pwd_valid = check_password(password, settings.ADMIN_PASSWORD) - if login_valid and pwd_valid: - try: - user = User.objects.get(username=username) - except User.DoesNotExist: - # Create a new user. Note that we can set password - # to anything, because it won't be checked; the password - # from settings.py will. - user = User(username=username, password='get from settings.py') - user.is_staff = True - user.is_superuser = True - user.save() - return user - return None - - def get_user(self, user_id): - try: - return User.objects.get(pk=user_id) - except User.DoesNotExist: - return None - -Handling authorization in custom backends ------------------------------------------ - -Custom auth backends can provide their own permissions. - -The user model will delegate permission lookup functions -(``get_group_permissions()``, ``get_all_permissions()``, ``has_perm()``, and -``has_module_perms()``) to any authentication backend that implements these -functions. - -The permissions given to the user will be the superset of all permissions -returned by all backends. That is, Django grants a permission to a user that any -one backend grants. - -The simple backend above could implement permissions for the magic admin fairly -simply:: - - class SettingsBackend: - - # ... - - def has_perm(self, user_obj, perm): - if user_obj.username == settings.ADMIN_LOGIN: - return True - else: - return False - -This gives full permissions to the user granted access in the above example. Notice -that the backend auth functions all take the user object as an argument, and -they also accept the same arguments given to the associated ``User`` functions. - -A full authorization implementation can be found in -``django/contrib/auth/backends.py`` _, which is the default backend and queries -the ``auth_permission`` table most of the time. - -.. _django/contrib/auth/backends.py: http://code.djangoproject.com/browser/django/trunk/django/contrib/auth/backends.py diff --git a/docs/conf.py b/docs/conf.py index 0ced57d57b..38edfffcee 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -12,35 +12,36 @@ # serve to show the default value. import sys +import os # If your extensions are in another directory, add it here. -#sys.path.append('some/directory') +sys.path.append(os.path.join(os.path.dirname(__file__), "_ext")) # General configuration # --------------------- # Add any Sphinx extension module names here, as strings. They can be extensions # coming with Sphinx (named 'sphinx.ext.*') or your custom ones. -#extensions = [] +extensions = ["djangodocs"] # Add any paths that contain templates here, relative to this directory. -templates_path = [] +templates_path = ["_templates"] # The suffix of source filenames. source_suffix = '.txt' # The master toctree document. -master_doc = 'index' +master_doc = 'contents' # General substitutions. project = 'Django' -copyright = '2008, Django Software Foundation' +copyright = 'Django Software Foundation and contributors' # The default replacements for |version| and |release|, also used in various # other places throughout the built documents. # # The short X.Y version. -version = 'SVN' +version = '1.0' # The full version, including alpha/beta/rc tags. release = version @@ -65,7 +66,7 @@ add_module_names = False show_authors = False # The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' +pygments_style = 'trac' # Options for HTML output @@ -79,7 +80,7 @@ html_style = 'default.css' # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = [] +html_static_path = ["_static"] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. @@ -89,6 +90,9 @@ html_last_updated_fmt = '%b %d, %Y' # typographically correct entities. html_use_smartypants = True +# HTML translator class for the builder +html_translator_class = "djangodocs.DjangoHTMLTranslator" + # Content template for the index page. #html_index = '' @@ -97,7 +101,7 @@ html_use_smartypants = True # Additional templates that should be rendered to pages, maps page names to # template names. -#html_additional_pages = {} +html_additional_pages = {} # If false, no module index is generated. #html_use_modindex = True @@ -121,6 +125,9 @@ htmlhelp_basename = 'Djangodoc' # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, document class [howto/manual]). #latex_documents = [] +latex_documents = [ + ('index', 'django.tex', 'Django Documentation', 'Django Software Foundation', 'manual'), +] # Additional stuff for the LaTeX preamble. #latex_preamble = '' @@ -130,3 +137,9 @@ htmlhelp_basename = 'Djangodoc' # If false, no module index is generated. #latex_use_modindex = True + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +# If this isn't set to True, the LaTex writer can only handle six levels of headers. +latex_use_parts = True + diff --git a/docs/contents.txt b/docs/contents.txt new file mode 100644 index 0000000000..e41b77055e --- /dev/null +++ b/docs/contents.txt @@ -0,0 +1,36 @@ +.. _contents: + +============================= +Django documentation contents +============================= + +.. toctree:: + :maxdepth: 2 + + intro/index + topics/index + howto/index + faq/index + ref/index + misc/index + glossary + releases/index + internals/index + +Indices, glossary and tables +============================ + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`glossary` + +Deprecated/obsolete documentation +================================= + +The following documentation covers features that have been deprecated or that +have been replaced in newer versions of Django. + +.. toctree:: + :maxdepth: 2 + + obsolete/index \ No newline at end of file diff --git a/docs/contenttypes.txt b/docs/contenttypes.txt deleted file mode 100644 index 84e38020bc..0000000000 --- a/docs/contenttypes.txt +++ /dev/null @@ -1,297 +0,0 @@ -========================== -The contenttypes framework -========================== - -Django includes a "contenttypes" application that can track all of -the models installed in your Django-powered project, providing a -high-level, generic interface for working with your models. - -Overview -======== - -At the heart of the contenttypes application is the ``ContentType`` -model, which lives at -``django.contrib.contenttypes.models.ContentType``. Instances of -``ContentType`` represent and store information about the models -installed in your project, and new instances of ``ContentType`` are -automatically created whenever new models are installed. - -Instances of ``ContentType`` have methods for returning the model -classes they represent and for querying objects from those models. -``ContentType`` also has a `custom manager`_ that adds methods for -working with ``ContentType`` and for obtaining instances of -``ContentType`` for a particular model. - -Relations between your models and ``ContentType`` can also be used to -enable "generic" relationships between an instance of one of your -models and instances of any model you have installed. - -.. _custom manager: ../model-api/#custom-managers - -Installing the contenttypes framework -===================================== - -The contenttypes framework is included in the default -``INSTALLED_APPS`` list created by ``django-admin.py startproject``, -but if you've removed it or if you manually set up your -``INSTALLED_APPS`` list, you can enable it by adding -``'django.contrib.contenttypes'`` to your ``INSTALLED_APPS`` setting. - -It's generally a good idea to have the contenttypes framework -installed; several of Django's other bundled applications require it: - - * The admin application uses it to log the history of each object - added or changed through the admin interface. - - * Django's `authentication framework`_ uses it to tie user permissions - to specific models. - - * Django's comments system (``django.contrib.comments``) uses it to - "attach" comments to any installed model. - -.. _authentication framework: ../authentication/ - -The ``ContentType`` model -========================= - -Each instance of ``ContentType`` has three fields which, taken -together, uniquely describe an installed model: - - ``app_label`` - The name of the application the model is part of. This is taken from - the ``app_label`` attribute of the model, and includes only the *last* - part of the application's Python import path; - "django.contrib.contenttypes", for example, becomes an ``app_label`` - of "contenttypes". - - ``model`` - The name of the model class. - - ``name`` - The human-readable name of the model. This is taken from - `the verbose_name attribute`_ of the model. - -Let's look at an example to see how this works. If you already have -the contenttypes application installed, and then add `the sites application`_ -to your ``INSTALLED_APPS`` setting and run ``manage.py syncdb`` to install it, -the model ``django.contrib.sites.models.Site`` will be installed into your -database. Along with it a new instance of ``ContentType`` will be created with -the following values: - - * ``app_label`` will be set to ``'sites'`` (the last part of the Python - path "django.contrib.sites"). - - * ``model`` will be set to ``'site'``. - - * ``name`` will be set to ``'site'``. - -.. _the verbose_name attribute: ../model-api/#verbose_name -.. _the sites application: ../sites/ - -Methods on ``ContentType`` instances -==================================== - -Each ``ContentType`` instance has methods that allow you to get from a -``ContentType`` instance to the model it represents, or to retrieve objects -from that model: - - ``get_object_for_this_type(**kwargs)`` - Takes a set of valid `lookup arguments`_ for the model the - ``ContentType`` represents, and does `a get() lookup`_ on that - model, returning the corresponding object. - - ``model_class()`` - Returns the model class represented by this ``ContentType`` - instance. - -For example, we could look up the ``ContentType`` for the ``User`` model:: - - >>> from django.contrib.contenttypes.models import ContentType - >>> user_type = ContentType.objects.get(app_label="auth", model="user") - >>> user_type - <ContentType: user> - -And then use it to query for a particular ``User``, or to get access -to the ``User`` model class:: - - >>> user_type.model_class() - <class 'django.contrib.auth.models.User'> - >>> user_type.get_object_for_this_type(username='Guido') - <User: Guido> - -Together, ``get_object_for_this_type`` and ``model_class`` enable two -extremely important use cases: - - 1. Using these methods, you can write high-level generic code that - performs queries on any installed model -- instead of importing and - using a single specific model class, you can pass an ``app_label`` - and ``model`` into a ``ContentType`` lookup at runtime, and then - work with the model class or retrieve objects from it. - - 2. You can relate another model to ``ContentType`` as a way of tying - instances of it to particular model classes, and use these methods - to get access to those model classes. - -Several of Django's bundled applications make use of the latter -technique. For example, `the permissions system`_ in Django's -authentication framework uses a ``Permission`` model with a foreign -key to ``ContentType``; this lets ``Permission`` represent concepts -like "can add blog entry" or "can delete news story". - -.. _lookup arguments: ../db-api/#field-lookups -.. _a get() lookup: ../db-api/#get-kwargs -.. _the permissions system: ../authentication/#permissions - -The ``ContentTypeManager`` --------------------------- - -``ContentType`` also has a custom manager, ``ContentTypeManager``, -which adds the following methods: - - ``clear_cache()`` - Clears an internal cache used by ``ContentType`` to keep track of which - models for which it has created ``ContentType`` instances. You probably - won't ever need to call this method yourself; Django will call it - automatically when it's needed. - - ``get_for_model(model)`` - Takes either a model class or an instance of a model, and returns the - ``ContentType`` instance representing that model. - -The ``get_for_model`` method is especially useful when you know you -need to work with a ``ContentType`` but don't want to go to the -trouble of obtaining the model's metadata to perform a manual lookup:: - - >>> from django.contrib.auth.models import User - >>> user_type = ContentType.objects.get_for_model(User) - >>> user_type - <ContentType: user> - -Generic relations -================= - -Adding a foreign key from one of your own models to ``ContentType`` -allows your model to effectively tie itself to another model class, as -in the example of the ``Permission`` model above. But it's possible to -go one step further and use ``ContentType`` to enable truly generic -(sometimes called "polymorphic") relationships between models. - -A simple example is a tagging system, which might look like this:: - - from django.db import models - from django.contrib.contenttypes.models import ContentType - from django.contrib.contenttypes import generic - - class TaggedItem(models.Model): - tag = models.SlugField() - content_type = models.ForeignKey(ContentType) - object_id = models.PositiveIntegerField() - content_object = generic.GenericForeignKey('content_type', 'object_id') - - def __unicode__(self): - return self.tag - -A normal ``ForeignKey`` can only "point to" one other model, which -means that if the ``TaggedItem`` model used a ``ForeignKey`` it would have to -choose one and only one model to store tags for. The contenttypes -application provides a special field type -- -``django.contrib.contenttypes.generic.GenericForeignKey`` -- which -works around this and allows the relationship to be with any -model. There are three parts to setting up a ``GenericForeignKey``: - - 1. Give your model a ``ForeignKey`` to ``ContentType``. - - 2. Give your model a field that can store a primary-key value from the - models you'll be relating to. (For most models, this means an - ``IntegerField`` or ``PositiveIntegerField``.) - - This field must be of the same type as the primary key of the models - that will be involved in the generic relation. For example, if you use - ``IntegerField``, you won't be able to form a generic relation with a - model that uses a ``CharField`` as a primary key. - - 3. Give your model a ``GenericForeignKey``, and pass it the names of - the two fields described above. If these fields are named - "content_type" and "object_id", you can omit this -- those are the - default field names ``GenericForeignKey`` will look for. - -This will enable an API similar to the one used for a normal ``ForeignKey``; -each ``TaggedItem`` will have a ``content_object`` field that returns the -object it's related to, and you can also assign to that field or use it when -creating a ``TaggedItem``:: - - >>> from django.contrib.auth.models import User - >>> guido = User.objects.get(username='Guido') - >>> t = TaggedItem(content_object=guido, tag='bdfl') - >>> t.save() - >>> t.content_object - <User: Guido> - -Due to the way ``GenericForeignKey`` is implemeneted, you cannot use such -fields directly with filters (``filter()`` and ``exclude()``, for example) via -the database API. They aren't normal field objects. These examples will *not* -work:: - - # This will fail - >>> TaggedItem.objects.filter(content_object=guido) - # This will also fail - >>> TaggedItem.objects.get(content_object=guido) - -Reverse generic relations -------------------------- - -If you know which models you'll be using most often, you can also add -a "reverse" generic relationship to enable an additional API. For example:: - - class Bookmark(models.Model): - url = models.URLField() - tags = generic.GenericRelation(TaggedItem) - -``Bookmark`` instances will each have a ``tags`` attribute, which can -be used to retrieve their associated ``TaggedItems``:: - - >>> b = Bookmark(url='http://www.djangoproject.com/') - >>> b.save() - >>> t1 = TaggedItem(content_object=b, tag='django') - >>> t1.save() - >>> t2 = TaggedItem(content_object=b, tag='python') - >>> t2.save() - >>> b.tags.all() - [<TaggedItem: django>, <TaggedItem: python>] - -If you don't add the reverse relationship, you can do the lookup manually:: - - >>> b = Bookmark.objects.get(url='http://www.djangoproject.com/) - >>> bookmark_type = ContentType.objects.get_for_model(b) - >>> TaggedItem.objects.filter(content_type__pk=bookmark_type.id, - ... object_id=b.id) - [<TaggedItem: django>, <TaggedItem: python>] - -Note that if you delete an object that has a ``GenericRelation``, any objects -which have a ``GenericForeignKey`` pointing at it will be deleted as well. In -the example above, this means that if a ``Bookmark`` object were deleted, any -``TaggedItem`` objects pointing at it would be deleted at the same time. - -Generic relations in forms and admin ------------------------------------- - -``django.contrib.contenttypes.generic`` provides both a ``GenericInlineFormSet`` -and ``GenericInlineModelAdmin``. This enables the use of generic relations in -forms and the admin. See the `model formset`_ and `admin`_ documentation for -more information. - -``GenericInlineModelAdmin`` options -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The ``GenericInlineModelAdmin`` class inherits all properties from an -``InlineModelAdmin`` class. However, it adds a couple of its own for working -with the generic relation: - - * ``ct_field`` - The name of the ``ContentType`` foreign key field on the - model. Defaults to ``content_type``. - - * ``ct_fk_field`` - The name of the integer field that represents the ID - of the related object. Defaults to ``object_id``. - -.. _model formset: ../modelforms/ -.. _admin: ../admin/ diff --git a/docs/db-api.txt b/docs/db-api.txt deleted file mode 100644 index 75f9cff198..0000000000 --- a/docs/db-api.txt +++ /dev/null @@ -1,2421 +0,0 @@ -====================== -Database API reference -====================== - -Once you've created your `data models`_, Django automatically gives you a -database-abstraction API that lets you create, retrieve, update and delete -objects. This document explains that API. - -.. _`data models`: ../model-api/ - -Throughout this reference, we'll refer to the following models, which comprise -a weblog application:: - - class Blog(models.Model): - name = models.CharField(max_length=100) - tagline = models.TextField() - - def __unicode__(self): - return self.name - - class Author(models.Model): - name = models.CharField(max_length=50) - email = models.EmailField() - - def __unicode__(self): - return self.name - - class Entry(models.Model): - blog = models.ForeignKey(Blog) - headline = models.CharField(max_length=255) - body_text = models.TextField() - pub_date = models.DateTimeField() - authors = models.ManyToManyField(Author) - - def __unicode__(self): - return self.headline - -Creating objects -================ - -To represent database-table data in Python objects, Django uses an intuitive -system: A model class represents a database table, and an instance of that -class represents a particular record in the database table. - -To create an object, instantiate it using keyword arguments to the model class, -then call ``save()`` to save it to the database. - -You import the model class from wherever it lives on the Python path, as you -may expect. (We point this out here because previous Django versions required -funky model importing.) - -Assuming models live in a file ``mysite/blog/models.py``, here's an example:: - - from mysite.blog.models import Blog - b = Blog(name='Beatles Blog', tagline='All the latest Beatles news.') - b.save() - -This performs an ``INSERT`` SQL statement behind the scenes. Django doesn't hit -the database until you explicitly call ``save()``. - -The ``save()`` method has no return value. - -To create an object and save it all in one step see the `create`__ method. - -__ `create(**kwargs)`_ - -Auto-incrementing primary keys ------------------------------- - -If a model has an ``AutoField`` -- an auto-incrementing primary key -- then -that auto-incremented value will be calculated and saved as an attribute on -your object the first time you call ``save()``. - -Example:: - - b2 = Blog(name='Cheddar Talk', tagline='Thoughts on cheese.') - b2.id # Returns None, because b doesn't have an ID yet. - b2.save() - b2.id # Returns the ID of your new object. - -There's no way to tell what the value of an ID will be before you call -``save()``, because that value is calculated by your database, not by Django. - -(For convenience, each model has an ``AutoField`` named ``id`` by default -unless you explicitly specify ``primary_key=True`` on a field. See the -`AutoField documentation`_.) - -.. _AutoField documentation: ../model-api/#autofield - -Explicitly specifying auto-primary-key values -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -If a model has an ``AutoField`` but you want to define a new object's ID -explicitly when saving, just define it explicitly before saving, rather than -relying on the auto-assignment of the ID. - -Example:: - - b3 = Blog(id=3, name='Cheddar Talk', tagline='Thoughts on cheese.') - b3.id # Returns 3. - b3.save() - b3.id # Returns 3. - -If you assign auto-primary-key values manually, make sure not to use an -already-existing primary-key value! If you create a new object with an explicit -primary-key value that already exists in the database, Django will assume -you're changing the existing record rather than creating a new one. - -Given the above ``'Cheddar Talk'`` blog example, this example would override -the previous record in the database:: - - b4 = Blog(id=3, name='Not Cheddar', tagline='Anything but cheese.') - b4.save() # Overrides the previous blog with ID=3! - -See `How Django knows to UPDATE vs. INSERT`_, below, for the reason this -happens. - -Explicitly specifying auto-primary-key values is mostly useful for bulk-saving -objects, when you're confident you won't have primary-key collision. - -What happens when you save? ---------------------------- - -When you save an object, Django performs the following steps: - - 1. **Emit a ``pre_save`` signal.** This provides a notification that - an object is about to be saved. You can register a listener that - will be invoked whenever this signal is emitted. (These signals are - not yet documented.) - - 2. **Pre-process the data.** Each field on the object is asked to - perform any automated data modification that the field may need - to perform. - - Most fields do *no* pre-processing -- the field data is kept as-is. - Pre-processing is only used on fields that have special behavior. - For example, if your model has a ``DateField`` with ``auto_now=True``, - the pre-save phase will alter the data in the object to ensure that - the date field contains the current date stamp. (Our documentation - doesn't yet include a list of all the fields with this "special - behavior.") - - 3. **Prepare the data for the database.** Each field is asked to provide - its current value in a data type that can be written to the database. - - Most fields require *no* data preparation. Simple data types, such as - integers and strings, are 'ready to write' as a Python object. However, - more complex data types often require some modification. - - For example, ``DateFields`` use a Python ``datetime`` object to store - data. Databases don't store ``datetime`` objects, so the field value - must be converted into an ISO-compliant date string for insertion - into the database. - - 4. **Insert the data into the database.** The pre-processed, prepared - data is then composed into an SQL statement for insertion into the - database. - - 5. **Emit a ``post_save`` signal.** As with the ``pre_save`` signal, this - is used to provide notification that an object has been successfully - saved. (These signals are not yet documented.) - -Saving changes to objects -========================= - -To save changes to an object that's already in the database, use ``save()``. - -Given a ``Blog`` instance ``b5`` that has already been saved to the database, -this example changes its name and updates its record in the database:: - - b5.name = 'New name' - b5.save() - -This performs an ``UPDATE`` SQL statement behind the scenes. Django doesn't hit -the database until you explicitly call ``save()``. - -The ``save()`` method has no return value. - -Saving ForeignKey and ManyToManyField fields --------------------------------------------- - -Updating ``ForeignKey`` fields works exactly the same way as saving a normal -field; simply assign an object of the right type to the field in question:: - - cheese_blog = Blog.objects.get(name="Cheddar Talk") - entry.blog = cheese_blog - entry.save() - -Updating a ``ManyToManyField`` works a little differently; use the ``add()`` -method on the field to add a record to the relation:: - - joe = Author.objects.create(name="Joe") - entry.authors.add(joe) - -Django will complain if you try to assign or add an object of the wrong type. - -How Django knows to UPDATE vs. INSERT -------------------------------------- - -You may have noticed Django database objects use the same ``save()`` method -for creating and changing objects. Django abstracts the need to use ``INSERT`` -or ``UPDATE`` SQL statements. Specifically, when you call ``save()``, Django -follows this algorithm: - - * If the object's primary key attribute is set to a value that evaluates to - ``True`` (i.e., a value other than ``None`` or the empty string), Django - executes a ``SELECT`` query to determine whether a record with the given - primary key already exists. - * If the record with the given primary key does already exist, Django - executes an ``UPDATE`` query. - * If the object's primary key attribute is *not* set, or if it's set but a - record doesn't exist, Django executes an ``INSERT``. - -The one gotcha here is that you should be careful not to specify a primary-key -value explicitly when saving new objects, if you cannot guarantee the -primary-key value is unused. For more on this nuance, see `Explicitly -specifying auto-primary-key values`_ above and `Forcing an INSERT or UPDATE`_ -below. - -Forcing an INSERT or UPDATE -~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -**New in Django development version** - -In some rare circumstances, it's necesary to be able to force the ``save()`` -method to perform an SQL ``INSERT`` and not fall back to doing an ``UPDATE``. -Or vice-versa: update, if possible, but not insert a new row. In these cases -you can pass the ``force_insert=True`` or ``force_update=True`` parameters to -the ``save()`` method. Passing both parameters is an error, since you cannot -both insert *and* update at the same time. - -It should be very rare that you'll need to use these parameters. Django will -almost always do the right thing and trying to override that will lead to -errors that are difficult to track down. This feature is for advanced use -only. - -Retrieving objects -================== - -To retrieve objects from your database, you construct a ``QuerySet`` via a -``Manager`` on your model class. - -A ``QuerySet`` represents a collection of objects from your database. It can -have zero, one or many *filters* -- criteria that narrow down the collection -based on given parameters. In SQL terms, a ``QuerySet`` equates to a ``SELECT`` -statement, and a filter is a limiting clause such as ``WHERE`` or ``LIMIT``. - -You get a ``QuerySet`` by using your model's ``Manager``. Each model has at -least one ``Manager``, and it's called ``objects`` by default. Access it -directly via the model class, like so:: - - Blog.objects # <django.db.models.manager.Manager object at ...> - b = Blog(name='Foo', tagline='Bar') - b.objects # AttributeError: "Manager isn't accessible via Blog instances." - -(``Managers`` are accessible only via model classes, rather than from model -instances, to enforce a separation between "table-level" operations and -"record-level" operations.) - -The ``Manager`` is the main source of ``QuerySets`` for a model. It acts as a -"root" ``QuerySet`` that describes all objects in the model's database table. -For example, ``Blog.objects`` is the initial ``QuerySet`` that contains all -``Blog`` objects in the database. - -Retrieving all objects ----------------------- - -The simplest way to retrieve objects from a table is to get all of them. -To do this, use the ``all()`` method on a ``Manager``. - -Example:: - - all_entries = Entry.objects.all() - -The ``all()`` method returns a ``QuerySet`` of all the objects in the database. - -(If ``Entry.objects`` is a ``QuerySet``, why can't we just do ``Entry.objects``? -That's because ``Entry.objects``, the root ``QuerySet``, is a special case -that cannot be evaluated. The ``all()`` method returns a ``QuerySet`` that -*can* be evaluated.) - -Filtering objects ------------------ - -The root ``QuerySet`` provided by the ``Manager`` describes all objects in the -database table. Usually, though, you'll need to select only a subset of the -complete set of objects. - -To create such a subset, you refine the initial ``QuerySet``, adding filter -conditions. The two most common ways to refine a ``QuerySet`` are: - -``filter(**kwargs)`` - Returns a new ``QuerySet`` containing objects that match the given lookup - parameters. - -``exclude(**kwargs)`` - Returns a new ``QuerySet`` containing objects that do *not* match the given - lookup parameters. - -The lookup parameters (``**kwargs`` in the above function definitions) should -be in the format described in `Field lookups`_ below. - -For example, to get a ``QuerySet`` of blog entries from the year 2006, use -``filter()`` like so:: - - Entry.objects.filter(pub_date__year=2006) - -(Note we don't have to add an ``all()`` -- ``Entry.objects.all().filter(...)``. -That would still work, but you only need ``all()`` when you want all objects -from the root ``QuerySet``.) - -Chaining filters -~~~~~~~~~~~~~~~~ - -The result of refining a ``QuerySet`` is itself a ``QuerySet``, so it's -possible to chain refinements together. For example:: - - Entry.objects.filter( - headline__startswith='What').exclude( - pub_date__gte=datetime.now()).filter( - pub_date__gte=datetime(2005, 1, 1)) - -...takes the initial ``QuerySet`` of all entries in the database, adds a -filter, then an exclusion, then another filter. The final result is a -``QuerySet`` containing all entries with a headline that starts with "What", -that were published between January 1, 2005, and the current day. - -Filtered QuerySets are unique ------------------------------ - -Each time you refine a ``QuerySet``, you get a brand-new ``QuerySet`` that is -in no way bound to the previous ``QuerySet``. Each refinement creates a -separate and distinct ``QuerySet`` that can be stored, used and reused. - -Example:: - - q1 = Entry.objects.filter(headline__startswith="What") - q2 = q1.exclude(pub_date__gte=datetime.now()) - q3 = q1.filter(pub_date__gte=datetime.now()) - -These three ``QuerySets`` are separate. The first is a base ``QuerySet`` -containing all entries that contain a headline starting with "What". The second -is a subset of the first, with an additional criteria that excludes records -whose ``pub_date`` is greater than now. The third is a subset of the first, -with an additional criteria that selects only the records whose ``pub_date`` is -greater than now. The initial ``QuerySet`` (``q1``) is unaffected by the -refinement process. - -QuerySets are lazy ------------------- - -``QuerySets`` are lazy -- the act of creating a ``QuerySet`` doesn't involve -any database activity. You can stack filters together all day long, and Django -won't actually run the query until the ``QuerySet`` is *evaluated*. - -When QuerySets are evaluated -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -You can evaluate a ``QuerySet`` in the following ways: - - * **Iteration.** A ``QuerySet`` is iterable, and it executes its database - query the first time you iterate over it. For example, this will print - the headline of all entries in the database:: - - for e in Entry.objects.all(): - print e.headline - - * **Slicing.** As explained in `Limiting QuerySets`_ below, a ``QuerySet`` - can be sliced, using Python's array-slicing syntax. Usually slicing a - ``QuerySet`` returns another (unevaluated )``QuerySet``, but Django will - execute the database query if you use the "step" parameter of slice - syntax. - - * **repr().** A ``QuerySet`` is evaluated when you call ``repr()`` on it. - This is for convenience in the Python interactive interpreter, so you can - immediately see your results when using the API interactively. - - * **len().** A ``QuerySet`` is evaluated when you call ``len()`` on it. - This, as you might expect, returns the length of the result list. - - Note: *Don't* use ``len()`` on ``QuerySet``\s if all you want to do is - determine the number of records in the set. It's much more efficient to - handle a count at the database level, using SQL's ``SELECT COUNT(*)``, - and Django provides a ``count()`` method for precisely this reason. See - ``count()`` below. - - * **list().** Force evaluation of a ``QuerySet`` by calling ``list()`` on - it. For example:: - - entry_list = list(Entry.objects.all()) - - Be warned, though, that this could have a large memory overhead, because - Django will load each element of the list into memory. In contrast, - iterating over a ``QuerySet`` will take advantage of your database to - load data and instantiate objects only as you need them. - - -Pickling QuerySets -~~~~~~~~~~~~~~~~~~ - -If you pickle_ a ``QuerySet``, this will also force all the results to be -loaded into memory prior to pickling. This is because pickling is usually used -as a precursor to caching and when the cached ``QuerySet`` is reloaded, you want -the results to already be present. This means that when you unpickle a -``QuerySet``, it contains the results at the moment it was pickled, rather -than the results that are currently in the database. - -If you only want to pickle the necessary information to recreate the -``Queryset`` from the database at a later time, pickle the ``query`` attribute -of the ``QuerySet``. You can then recreate the original ``QuerySet`` (without -any results loaded) using some code like this:: - - >>> import pickle - >>> query = pickle.loads(s) # Assuming 's' is the pickled string. - >>> qs = MyModel.objects.all() - >>> qs.query = query # Restore the original 'query'. - -.. _pickle: http://docs.python.org/lib/module-pickle.html - -Limiting QuerySets ------------------- - -Use Python's array-slicing syntax to limit your ``QuerySet`` to a certain -number of results. This is the equivalent of SQL's ``LIMIT`` and ``OFFSET`` -clauses. - -For example, this returns the first 5 objects (``LIMIT 5``):: - - Entry.objects.all()[:5] - -This returns the sixth through tenth objects (``OFFSET 5 LIMIT 5``):: - - Entry.objects.all()[5:10] - -You can also slice from the item ''N'' to the end of the queryset. For -example, to return everything from the sixth item onwards:: - - Entry.objects.all()[5:] - -How this last example is implemented in SQL varies depending upon the database -used, but it is supported in all cases. - -Generally, slicing a ``QuerySet`` returns a new ``QuerySet`` -- it doesn't -evaluate the query. An exception is if you use the "step" parameter of Python -slice syntax. For example, this would actually execute the query in order to -return a list of every *second* object of the first 10:: - - Entry.objects.all()[:10:2] - -To retrieve a *single* object rather than a list -(e.g. ``SELECT foo FROM bar LIMIT 1``), use a simple index instead of a -slice. For example, this returns the first ``Entry`` in the database, after -ordering entries alphabetically by headline:: - - Entry.objects.order_by('headline')[0] - -This is roughly equivalent to:: - - Entry.objects.order_by('headline')[0:1].get() - -Note, however, that the first of these will raise ``IndexError`` while the -second will raise ``DoesNotExist`` if no objects match the given criteria. - -Combining QuerySets -------------------- - -If you have two ``QuerySet`` instances that act on the same model, you can -combine them using ``&`` and ``|`` to get the items that are in both result -sets or in either results set, respectively. For example:: - - Entry.objects.filter(pubdate__gte=date1) & \ - Entry.objects.filter(headline__startswith="What") - -will combine the two queries into a single SQL query. Of course, in this case -you could have achieved the same result using multiple filters on the same -``QuerySet``, but sometimes the ability to combine individual ``QuerySet`` -instance is useful. - -Be careful, if you are using ``extra()`` to add custom handling to your -``QuerySet`` however. All the ``extra()`` components are merged and the result -may or may not make sense. If you are using custom SQL fragments in your -``extra()`` calls, Django will not inspect these fragments to see if they need -to be rewritten because of changes in the merged query. So test the effects -carefully. Also realize that if you are combining two ``QuerySets`` with -``|``, you cannot use ``extra(select=...)`` or ``extra(where=...)`` on *both* -``QuerySets``. You can only use those calls on one or the other (Django will -raise a ``ValueError`` if you try to use this incorrectly). - -QuerySet methods that return new QuerySets ------------------------------------------- - -Django provides a range of ``QuerySet`` refinement methods that modify either -the types of results returned by the ``QuerySet`` or the way its SQL query is -executed. - -``filter(**kwargs)`` -~~~~~~~~~~~~~~~~~~~~ - -Returns a new ``QuerySet`` containing objects that match the given lookup -parameters. - -The lookup parameters (``**kwargs``) should be in the format described in -`Field lookups`_ below. Multiple parameters are joined via ``AND`` in the -underlying SQL statement. - -``exclude(**kwargs)`` -~~~~~~~~~~~~~~~~~~~~~ - -Returns a new ``QuerySet`` containing objects that do *not* match the given -lookup parameters. - -The lookup parameters (``**kwargs``) should be in the format described in -`Field lookups`_ below. Multiple parameters are joined via ``AND`` in the -underlying SQL statement, and the whole thing is enclosed in a ``NOT()``. - -This example excludes all entries whose ``pub_date`` is later than 2005-1-3 -AND whose ``headline`` is "Hello":: - - Entry.objects.exclude(pub_date__gt=datetime.date(2005, 1, 3), headline='Hello') - -In SQL terms, that evaluates to:: - - SELECT ... - WHERE NOT (pub_date > '2005-1-3' AND headline = 'Hello') - -This example excludes all entries whose ``pub_date`` is later than 2005-1-3 -OR whose headline is "Hello":: - - Entry.objects.exclude(pub_date__gt=datetime.date(2005, 1, 3)).exclude(headline='Hello') - -In SQL terms, that evaluates to:: - - SELECT ... - WHERE NOT pub_date > '2005-1-3' - AND NOT headline = 'Hello' - -Note the second example is more restrictive. - -``order_by(*fields)`` -~~~~~~~~~~~~~~~~~~~~~ - -By default, results returned by a ``QuerySet`` are ordered by the ordering -tuple given by the ``ordering`` option in the model's ``Meta``. You can -override this on a per-``QuerySet`` basis by using the ``order_by`` method. - -Example:: - - Entry.objects.filter(pub_date__year=2005).order_by('-pub_date', 'headline') - -The result above will be ordered by ``pub_date`` descending, then by -``headline`` ascending. The negative sign in front of ``"-pub_date"`` indicates -*descending* order. Ascending order is implied. To order randomly, use ``"?"``, -like so:: - - Entry.objects.order_by('?') - -Note: ``order_by('?')`` queries may be expensive and slow, depending on the -database backend you're using. - -To order by a field in a different model, use the same syntax as when you are -querying across model relations. That is, the name of the field, followed by a -double underscore (``__``), followed by the name of the field in the new model, -and so on for as many models as you want to join. For example:: - - Entry.objects.order_by('blog__name', 'headline') - -If you try to order by a field that is a relation to another model, Django will -use the default ordering on the related model (or order by the related model's -primary key if there is no ``Meta.ordering`` specified. For example:: - - Entry.objects.order_by('blog') - -...is identical to:: - - Entry.objects.order_by('blog__id') - -...since the ``Blog`` model has no default ordering specified. - -Be cautious when ordering by fields in related models if you are also using -``distinct()``. See the note in the `distinct()`_ section for an explanation -of how related model ordering can change the expected results. - -It is permissible to specify a multi-valued field to order the results by (for -example, a ``ManyToMany`` field). Normally this won't be a sensible thing to -do and it's really an advanced usage feature. However, if you know that your -queryset's filtering or available data implies that there will only be one -ordering piece of data for each of the main items you are selecting, the -ordering may well be exactly what you want to do. Use ordering on multi-valued -fields with care and make sure the results are what you expect. - -**New in Django development version:** If you don't want any ordering to be -applied to a query, not even the default ordering, call ``order_by()`` with no -parameters. - -**New in Django development version:** The syntax for ordering across related -models has changed. See the `Django 0.96 documentation`_ for the old behavior. - -.. _Django 0.96 documentation: http://www.djangoproject.com/documentation/0.96/model-api/#floatfield - -There's no way to specify whether ordering should be case sensitive. With -respect to case-sensitivity, Django will order results however your database -backend normally orders them. - -``reverse()`` -~~~~~~~~~~~~~ - -**New in Django development version** - -Use the ``reverse()`` method to reverse the order in which a queryset's -elements are returned. Calling ``reverse()`` a second time restores the -ordering back to the normal direction. - -To retrieve the ''last'' five items in a queryset, you could do this:: - - my_queryset.reverse()[:5] - -Note that this is not quite the same as slicing from the end of a sequence in -Python. The above example will return the last item first, then the -penultimate item and so on. If we had a Python sequence and looked at -``seq[:-5]``, we would see the fifth-last item first. Django doesn't support -that mode of access (slicing from the end), because it's not possible to do it -efficiently in SQL. - -Also, note that ``reverse()`` should generally only be called on a -``QuerySet`` which has a defined ordering (e.g., when querying against -a model which defines a default ordering, or when using -``order_by()``). If no such ordering is defined for a given -``QuerySet``, calling ``reverse()`` on it has no real effect (the -ordering was undefined prior to calling ``reverse()``, and will remain -undefined afterward). - - -``distinct()`` -~~~~~~~~~~~~~~ - -Returns a new ``QuerySet`` that uses ``SELECT DISTINCT`` in its SQL query. This -eliminates duplicate rows from the query results. - -By default, a ``QuerySet`` will not eliminate duplicate rows. In practice, this -is rarely a problem, because simple queries such as ``Blog.objects.all()`` -don't introduce the possibility of duplicate result rows. However, if your -query spans multiple tables, it's possible to get duplicate results when a -``QuerySet`` is evaluated. That's when you'd use ``distinct()``. - -.. note:: - Any fields used in an ``order_by()`` call are included in the SQL - ``SELECT`` columns. This can sometimes lead to unexpected results when - used in conjunction with ``distinct()``. If you order by fields from a - related model, those fields will be added to the selected columns and they - may make otherwise duplicate rows appear to be distinct. Since the extra - columns don't appear in the returned results (they are only there to - support ordering), it sometimes looks like non-distinct results are being - returned. - - Similarly, if you use a ``values()`` query to restrict the columns - selected, the columns used in any ``order_by()`` (or default model - ordering) will still be involved and may affect uniqueness of the results. - - The moral here is that if you are using ``distinct()`` be careful about - ordering by related models. Similarly, when using ``distinct()`` and - ``values()`` together, be careful when ordering by fields not in the - ``values()`` call. - -``values(*fields)`` -~~~~~~~~~~~~~~~~~~~ - -Returns a ``ValuesQuerySet`` -- a ``QuerySet`` that evaluates to a list of -dictionaries instead of model-instance objects. - -Each of those dictionaries represents an object, with the keys corresponding to -the attribute names of model objects. - -This example compares the dictionaries of ``values()`` with the normal model -objects:: - - # This list contains a Blog object. - >>> Blog.objects.filter(name__startswith='Beatles') - [Beatles Blog] - - # This list contains a dictionary. - >>> Blog.objects.filter(name__startswith='Beatles').values() - [{'id': 1, 'name': 'Beatles Blog', 'tagline': 'All the latest Beatles news.'}] - -``values()`` takes optional positional arguments, ``*fields``, which specify -field names to which the ``SELECT`` should be limited. If you specify the -fields, each dictionary will contain only the field keys/values for the fields -you specify. If you don't specify the fields, each dictionary will contain a -key and value for every field in the database table. - -Example:: - - >>> Blog.objects.values() - [{'id': 1, 'name': 'Beatles Blog', 'tagline': 'All the latest Beatles news.'}], - >>> Blog.objects.values('id', 'name') - [{'id': 1, 'name': 'Beatles Blog'}] - -You can also retrieve values from across ``ForeignKey`` relations by using -double underscores to separate the field names, just as when calling the -``filter()`` command. For example:: - - >>> Entry.objects.values('blog__name').distinct() - [{'name': 'Beatles Blog'}] - -A couple of subtleties that are worth mentioning: - - * The ``values()`` method does not return anything for ``ManyToManyField`` - attributes and will raise an error if you try to pass in this type of - field to it. - * If you have a field called ``foo`` that is a ``ForeignKey``, the default - ``values()`` call will return a dictionary key called ``foo_id``, since - this is the name of the hidden model attribute that stores the actual - value (the ``foo`` attribute refers to the related model). When you are - calling ``values()`` and passing in field names, you can pass in either - ``foo`` or ``foo_id`` and you will get back the same thing (the - dictionary key will match the field name you passed in). - - For example:: - - >>> Entry.objects.values() - [{'blog_id: 1, 'headline': u'First Entry', ...}, ...] - - >>> Entry.objects.values('blog') - [{'blog': 1}, ...] - - >>> Entry.objects.values('blog_id') - [{'blog_id': 1}, ...] - * When using ``values()`` together with ``distinct()``, be aware that - ordering can affect the results. See the note in the `distinct()`_ - section, above, for details. - -**New in Django development version:** Previously, it was not possible to pass -``blog_id`` to ``values()`` in the above example, only ``blog``. - -A ``ValuesQuerySet`` is useful when you know you're only going to need values -from a small number of the available fields and you won't need the -functionality of a model instance object. It's more efficient to select only -the fields you need to use. - -Finally, note a ``ValuesQuerySet`` is a subclass of ``QuerySet``, so it has all -methods of ``QuerySet``. You can call ``filter()`` on it, or ``order_by()``, or -whatever. Yes, that means these two calls are identical:: - - Blog.objects.values().order_by('id') - Blog.objects.order_by('id').values() - -The people who made Django prefer to put all the SQL-affecting methods first, -followed (optionally) by any output-affecting methods (such as ``values()``), -but it doesn't really matter. This is your chance to really flaunt your -individualism. - -``values_list(*fields)`` -~~~~~~~~~~~~~~~~~~~~~~~~ - -**New in Django development version** - -This is similar to ``values()`` except that instead of returning a list of -dictionaries, it returns a list of tuples. Each tuple contains the value from -the respective field passed into the ``values_list()`` call -- so the first -item is the first field, etc. For example:: - - >>> Entry.objects.values_list('id', 'headline') - [(1, u'First entry'), ...] - -If you only pass in a single field, you can also pass in the ``flat`` -parameter. If ``True``, this will mean the returned results are single values, -rather than one-tuples. An example should make the difference clearer:: - - >>> Entry.objects.values_list('id').order_by('id') - [(1,), (2,), (3,), ...] - - >>> Entry.objects.values_list('id', flat=True).order_by('id') - [1, 2, 3, ...] - -It is an error to pass in ``flat`` when there is more than one field. - -If you don't pass any values to ``values_list()``, it will return all the -fields in the model, in the order they were declared. - -``dates(field, kind, order='ASC')`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Returns a ``DateQuerySet`` -- a ``QuerySet`` that evaluates to a list of -``datetime.datetime`` objects representing all available dates of a particular -kind within the contents of the ``QuerySet``. - -``field`` should be the name of a ``DateField`` or ``DateTimeField`` of your -model. - -``kind`` should be either ``"year"``, ``"month"`` or ``"day"``. Each -``datetime.datetime`` object in the result list is "truncated" to the given -``type``. - - * ``"year"`` returns a list of all distinct year values for the field. - * ``"month"`` returns a list of all distinct year/month values for the field. - * ``"day"`` returns a list of all distinct year/month/day values for the field. - -``order``, which defaults to ``'ASC'``, should be either ``'ASC'`` or -``'DESC'``. This specifies how to order the results. - -Examples:: - - >>> Entry.objects.dates('pub_date', 'year') - [datetime.datetime(2005, 1, 1)] - >>> Entry.objects.dates('pub_date', 'month') - [datetime.datetime(2005, 2, 1), datetime.datetime(2005, 3, 1)] - >>> Entry.objects.dates('pub_date', 'day') - [datetime.datetime(2005, 2, 20), datetime.datetime(2005, 3, 20)] - >>> Entry.objects.dates('pub_date', 'day', order='DESC') - [datetime.datetime(2005, 3, 20), datetime.datetime(2005, 2, 20)] - >>> Entry.objects.filter(headline__contains='Lennon').dates('pub_date', 'day') - [datetime.datetime(2005, 3, 20)] - -``none()`` -~~~~~~~~~~ - -**New in Django development version** - -Returns an ``EmptyQuerySet`` -- a ``QuerySet`` that always evaluates to -an empty list. This can be used in cases where you know that you should -return an empty result set and your caller is expecting a ``QuerySet`` -object (instead of returning an empty list, for example.) - -Examples:: - - >>> Entry.objects.none() - [] - -``all()`` -~~~~~~~~~~ - -**New in Django development version** - -Returns a ''copy'' of the current ``QuerySet`` (or ``QuerySet`` subclass you -pass in). This can be useful in some situations where you might want to pass -in either a model manager or a ``QuerySet`` and do further filtering on the -result. You can safely call ``all()`` on either object and then you'll -definitely have a ``QuerySet`` to work with. - -``select_related()`` -~~~~~~~~~~~~~~~~~~~~ - -Returns a ``QuerySet`` that will automatically "follow" foreign-key -relationships, selecting that additional related-object data when it executes -its query. This is a performance booster which results in (sometimes much) -larger queries but means later use of foreign-key relationships won't require -database queries. - -The following examples illustrate the difference between plain lookups and -``select_related()`` lookups. Here's standard lookup:: - - # Hits the database. - e = Entry.objects.get(id=5) - - # Hits the database again to get the related Blog object. - b = e.blog - -And here's ``select_related`` lookup:: - - # Hits the database. - e = Entry.objects.select_related().get(id=5) - - # Doesn't hit the database, because e.blog has been prepopulated - # in the previous query. - b = e.blog - -``select_related()`` follows foreign keys as far as possible. If you have the -following models:: - - class City(models.Model): - # ... - - class Person(models.Model): - # ... - hometown = models.ForeignKey(City) - - class Book(models.Model): - # ... - author = models.ForeignKey(Person) - -...then a call to ``Book.objects.select_related().get(id=4)`` will cache the -related ``Person`` *and* the related ``City``:: - - b = Book.objects.select_related().get(id=4) - p = b.author # Doesn't hit the database. - c = p.hometown # Doesn't hit the database. - - b = Book.objects.get(id=4) # No select_related() in this example. - p = b.author # Hits the database. - c = p.hometown # Hits the database. - -Note that, by default, ``select_related()`` does not follow foreign keys that -have ``null=True``. - -Usually, using ``select_related()`` can vastly improve performance because your -app can avoid many database calls. However, in situations with deeply nested -sets of relationships ``select_related()`` can sometimes end up following "too -many" relations, and can generate queries so large that they end up being slow. - -In these situations, you can use the ``depth`` argument to ``select_related()`` -to control how many "levels" of relations ``select_related()`` will actually -follow:: - - b = Book.objects.select_related(depth=1).get(id=4) - p = b.author # Doesn't hit the database. - c = p.hometown # Requires a database call. - -The ``depth`` argument is new in the Django development version. - -**New in Django development version:** Sometimes you only need to access -specific models that are related to your root model, not all of the related -models. In these cases, you can pass the related field names to -``select_related()`` and it will only follow those relations. You can even do -this for models that are more than one relation away by separating the field -names with double underscores, just as for filters. For example, if we have -this model:: - - class Room(models.Model): - # ... - building = models.ForeignKey(...) - - class Group(models.Model): - # ... - teacher = models.ForeignKey(...) - room = models.ForeignKey(Room) - subject = models.ForeignKey(...) - -...and we only needed to work with the ``room`` and ``subject`` attributes, we -could write this:: - - g = Group.objects.select_related('room', 'subject') - -This is also valid:: - - g = Group.objects.select_related('room__building', 'subject') - -...and would also pull in the ``building`` relation. - -You can only refer to ``ForeignKey`` relations in the list of fields passed to -``select_related``. You *can* refer to foreign keys that have ``null=True`` -(unlike the default ``select_related()`` call). It's an error to use both a -list of fields and the ``depth`` parameter in the same ``select_related()`` -call, since they are conflicting options. - -``extra(select=None, where=None, params=None, tables=None, order_by=None, select_params=None)`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Sometimes, the Django query syntax by itself can't easily express a complex -``WHERE`` clause. For these edge cases, Django provides the ``extra()`` -``QuerySet`` modifier -- a hook for injecting specific clauses into the SQL -generated by a ``QuerySet``. - -By definition, these extra lookups may not be portable to different database -engines (because you're explicitly writing SQL code) and violate the DRY -principle, so you should avoid them if possible. - -Specify one or more of ``params``, ``select``, ``where`` or ``tables``. None -of the arguments is required, but you should use at least one of them. - -``select`` - The ``select`` argument lets you put extra fields in the ``SELECT`` clause. - It should be a dictionary mapping attribute names to SQL clauses to use to - calculate that attribute. - - Example:: - - Entry.objects.extra(select={'is_recent': "pub_date > '2006-01-01'"}) - - As a result, each ``Entry`` object will have an extra attribute, - ``is_recent``, a boolean representing whether the entry's ``pub_date`` is - greater than Jan. 1, 2006. - - Django inserts the given SQL snippet directly into the ``SELECT`` - statement, so the resulting SQL of the above example would be:: - - SELECT blog_entry.*, (pub_date > '2006-01-01') - FROM blog_entry; - - - The next example is more advanced; it does a subquery to give each - resulting ``Blog`` object an ``entry_count`` attribute, an integer count - of associated ``Entry`` objects:: - - Blog.objects.extra( - select={ - 'entry_count': 'SELECT COUNT(*) FROM blog_entry WHERE blog_entry.blog_id = blog_blog.id' - }, - ) - - (In this particular case, we're exploiting the fact that the query will - already contain the ``blog_blog`` table in its ``FROM`` clause.) - - The resulting SQL of the above example would be:: - - SELECT blog_blog.*, (SELECT COUNT(*) FROM blog_entry WHERE blog_entry.blog_id = blog_blog.id) - FROM blog_blog; - - Note that the parenthesis required by most database engines around - subqueries are not required in Django's ``select`` clauses. Also note that - some database backends, such as some MySQL versions, don't support - subqueries. - - **New in Django development version** - In some rare cases, you might wish to pass parameters to the SQL fragments - in ``extra(select=...)```. For this purpose, use the ``select_params`` - parameter. Since ``select_params`` is a sequence and the ``select`` - attribute is a dictionary, some care is required so that the parameters - are matched up correctly with the extra select pieces. In this situation, - you should use a ``django.utils.datastructures.SortedDict`` for the - ``select`` value, not just a normal Python dictionary. - - This will work, for example:: - - Blog.objects.extra( - select=SortedDict([('a', '%s'), ('b', '%s')]), - select_params=('one', 'two')) - - The only thing to be careful about when using select parameters in - ``extra()`` is to avoid using the substring ``"%%s"`` (that's *two* - percent characters before the ``s``) in the select strings. Django's - tracking of parameters looks for ``%s`` and an escaped ``%`` character - like this isn't detected. That will lead to incorrect results. - -``where`` / ``tables`` - You can define explicit SQL ``WHERE`` clauses -- perhaps to perform - non-explicit joins -- by using ``where``. You can manually add tables to - the SQL ``FROM`` clause by using ``tables``. - - ``where`` and ``tables`` both take a list of strings. All ``where`` - parameters are "AND"ed to any other search criteria. - - Example:: - - Entry.objects.extra(where=['id IN (3, 4, 5, 20)']) - - ...translates (roughly) into the following SQL:: - - SELECT * FROM blog_entry WHERE id IN (3, 4, 5, 20); - - Be careful when using the ``tables`` parameter if you're specifying - tables that are already used in the query. When you add extra tables - via the ``tables`` parameter, Django assumes you want that table included - an extra time, if it is already included. That creates a problem, - since the table name will then be given an alias. If a table appears - multiple times in an SQL statement, the second and subsequent occurrences - must use aliases so the database can tell them apart. If you're - referring to the extra table you added in the extra ``where`` parameter - this is going to cause errors. - - Normally you'll only be adding extra tables that don't already appear in - the query. However, if the case outlined above does occur, there are a few - solutions. First, see if you can get by without including the extra table - and use the one already in the query. If that isn't possible, put your - ``extra()`` call at the front of the queryset construction so that your - table is the first use of that table. Finally, if all else fails, look at - the query produced and rewrite your ``where`` addition to use the alias - given to your extra table. The alias will be the same each time you - construct the queryset in the same way, so you can rely upon the alias - name to not change. - -``order_by`` - If you need to order the resulting queryset using some of the new fields - or tables you have included via ``extra()`` use the ``order_by`` parameter - to ``extra()`` and pass in a sequence of strings. These strings should - either be model fields (as in the normal ``order_by()`` method on - querysets), of the form ``table_name.column_name`` or an alias for a column - that you specified in the ``select`` parameter to ``extra()``. - - For example:: - - q = Entry.objects.extra(select={'is_recent': "pub_date > '2006-01-01'"}) - q = q.extra(order_by = ['-is_recent']) - - This would sort all the items for which ``is_recent`` is true to the front - of the result set (``True`` sorts before ``False`` in a descending - ordering). - - This shows, by the way, that you can make multiple calls to - ``extra()`` and it will behave as you expect (adding new constraints each - time). - -``params`` - The ``where`` parameter described above may use standard Python database - string placeholders -- ``'%s'`` to indicate parameters the database engine - should automatically quote. The ``params`` argument is a list of any extra - parameters to be substituted. - - Example:: - - Entry.objects.extra(where=['headline=%s'], params=['Lennon']) - - Always use ``params`` instead of embedding values directly into ``where`` - because ``params`` will ensure values are quoted correctly according to - your particular backend. (For example, quotes will be escaped correctly.) - - Bad:: - - Entry.objects.extra(where=["headline='Lennon'"]) - - Good:: - - Entry.objects.extra(where=['headline=%s'], params=['Lennon']) - -**New in Django development version** The ``select_params`` argument to -``extra()`` is new. Previously, you could attempt to pass parameters for -``select`` in the ``params`` argument, but it worked very unreliably. - -QuerySet methods that do not return QuerySets ---------------------------------------------- - -The following ``QuerySet`` methods evaluate the ``QuerySet`` and return -something *other than* a ``QuerySet``. - -These methods do not use a cache (see `Caching and QuerySets`_ below). Rather, -they query the database each time they're called. - -``get(**kwargs)`` -~~~~~~~~~~~~~~~~~ - -Returns the object matching the given lookup parameters, which should be in -the format described in `Field lookups`_. - -``get()`` raises ``MultipleObjectsReturned`` if more than one object was found. -The ``MultipleObjectsReturned`` exception is an attribute of the model class. -For example, the following will raise ``MultipleObjectsReturned`` if there -are more than one authors with the name of 'John':: - - Author.objects.get(name='John') # raises Author.MultipleObjectsReturned - -``get()`` raises a ``DoesNotExist`` exception if an object wasn't found for the -given parameters. The ``DoesNotExist`` exception is an attribute of the model -class. Example:: - - Entry.objects.get(id='foo') # raises Entry.DoesNotExist - -The ``DoesNotExist`` exception inherits from -``django.core.exceptions.ObjectDoesNotExist``, so you can target multiple -``DoesNotExist`` exceptions. Example:: - - from django.core.exceptions import ObjectDoesNotExist - try: - e = Entry.objects.get(id=3) - b = Blog.objects.get(id=1) - except ObjectDoesNotExist: - print "Either the entry or blog doesn't exist." - -``create(**kwargs)`` -~~~~~~~~~~~~~~~~~~~~ - -A convenience method for creating an object and saving it all in one step. Thus:: - - p = Person.objects.create(first_name="Bruce", last_name="Springsteen") - -and:: - - p = Person(first_name="Bruce", last_name="Springsteen") - p.save() - -are equivalent. - -``get_or_create(**kwargs)`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -A convenience method for looking up an object with the given kwargs, creating -one if necessary. - -Returns a tuple of ``(object, created)``, where ``object`` is the retrieved or -created object and ``created`` is a boolean specifying whether a new object was -created. - -This is meant as a shortcut to boilerplatish code and is mostly useful for -data-import scripts. For example:: - - try: - obj = Person.objects.get(first_name='John', last_name='Lennon') - except Person.DoesNotExist: - obj = Person(first_name='John', last_name='Lennon', birthday=date(1940, 10, 9)) - obj.save() - -This pattern gets quite unwieldy as the number of fields in a model goes up. -The above example can be rewritten using ``get_or_create()`` like so:: - - obj, created = Person.objects.get_or_create(first_name='John', last_name='Lennon', - defaults={'birthday': date(1940, 10, 9)}) - -Any keyword arguments passed to ``get_or_create()`` -- *except* an optional one -called ``defaults`` -- will be used in a ``get()`` call. If an object is found, -``get_or_create()`` returns a tuple of that object and ``False``. If an object -is *not* found, ``get_or_create()`` will instantiate and save a new object, -returning a tuple of the new object and ``True``. The new object will be -created according to this algorithm:: - - defaults = kwargs.pop('defaults', {}) - params = dict([(k, v) for k, v in kwargs.items() if '__' not in k]) - params.update(defaults) - obj = self.model(**params) - obj.save() - -In English, that means start with any non-``'defaults'`` keyword argument that -doesn't contain a double underscore (which would indicate a non-exact lookup). -Then add the contents of ``defaults``, overriding any keys if necessary, and -use the result as the keyword arguments to the model class. - -If you have a field named ``defaults`` and want to use it as an exact lookup in -``get_or_create()``, just use ``'defaults__exact'``, like so:: - - Foo.objects.get_or_create(defaults__exact='bar', defaults={'defaults': 'baz'}) - -Finally, a word on using ``get_or_create()`` in Django views. As mentioned -earlier, ``get_or_create()`` is mostly useful in scripts that need to parse -data and create new records if existing ones aren't available. But if you need -to use ``get_or_create()`` in a view, please make sure to use it only in -``POST`` requests unless you have a good reason not to. ``GET`` requests -shouldn't have any effect on data; use ``POST`` whenever a request to a page -has a side effect on your data. For more, see `Safe methods`_ in the HTTP spec. - -.. _Safe methods: http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.1.1 - -``count()`` -~~~~~~~~~~~ - -Returns an integer representing the number of objects in the database matching -the ``QuerySet``. ``count()`` never raises exceptions. - -Example:: - - # Returns the total number of entries in the database. - Entry.objects.count() - - # Returns the number of entries whose headline contains 'Lennon' - Entry.objects.filter(headline__contains='Lennon').count() - -``count()`` performs a ``SELECT COUNT(*)`` behind the scenes, so you should -always use ``count()`` rather than loading all of the record into Python -objects and calling ``len()`` on the result. - -Depending on which database you're using (e.g. PostgreSQL vs. MySQL), -``count()`` may return a long integer instead of a normal Python integer. This -is an underlying implementation quirk that shouldn't pose any real-world -problems. - -``in_bulk(id_list)`` -~~~~~~~~~~~~~~~~~~~~ - -Takes a list of primary-key values and returns a dictionary mapping each -primary-key value to an instance of the object with the given ID. - -Example:: - - >>> Blog.objects.in_bulk([1]) - {1: Beatles Blog} - >>> Blog.objects.in_bulk([1, 2]) - {1: Beatles Blog, 2: Cheddar Talk} - >>> Blog.objects.in_bulk([]) - {} - -If you pass ``in_bulk()`` an empty list, you'll get an empty dictionary. - -``iterator()`` -~~~~~~~~~~~~~~ - -Evaluates the ``QuerySet`` (by performing the query) and returns an -`iterator`_ over the results. A ``QuerySet`` typically reads all of -its results and instantiates all of the corresponding objects the -first time you access it; ``iterator()`` will instead read results and -instantiate objects in discrete chunks, yielding them one at a -time. For a ``QuerySet`` which returns a large number of objects, this -often results in better performance and a significant reduction in -memory use. - -Note that using ``iterator()`` on a ``QuerySet`` which has already -been evaluated will force it to evaluate again, repeating the query. - -.. _iterator: http://www.python.org/dev/peps/pep-0234/ - -``latest(field_name=None)`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Returns the latest object in the table, by date, using the ``field_name`` -provided as the date field. - -This example returns the latest ``Entry`` in the table, according to the -``pub_date`` field:: - - Entry.objects.latest('pub_date') - -If your model's ``Meta`` specifies ``get_latest_by``, you can leave off the -``field_name`` argument to ``latest()``. Django will use the field specified in -``get_latest_by`` by default. - -Like ``get()``, ``latest()`` raises ``DoesNotExist`` if an object doesn't -exist with the given parameters. - -Note ``latest()`` exists purely for convenience and readability. - -Field lookups -------------- - -Field lookups are how you specify the meat of an SQL ``WHERE`` clause. They're -specified as keyword arguments to the ``QuerySet`` methods ``filter()``, -``exclude()`` and ``get()``. - -Basic lookups keyword arguments take the form ``field__lookuptype=value``. -(That's a double-underscore). For example:: - - Entry.objects.filter(pub_date__lte='2006-01-01') - -translates (roughly) into the following SQL:: - - SELECT * FROM blog_entry WHERE pub_date <= '2006-01-01'; - -.. admonition:: How this is possible - - Python has the ability to define functions that accept arbitrary name-value - arguments whose names and values are evaluated at runtime. For more - information, see `Keyword Arguments`_ in the official Python tutorial. - - .. _`Keyword Arguments`: http://docs.python.org/tut/node6.html#SECTION006720000000000000000 - -If you pass an invalid keyword argument, a lookup function will raise -``TypeError``. - -The database API supports the following lookup types: - -exact -~~~~~ - -Exact match. If the value provided for comparison is ``None``, it will -be interpreted as an SQL ``NULL`` (See isnull_ for more details). - -Examples:: - - Entry.objects.get(id__exact=14) - Entry.objects.get(id__exact=None) - -SQL equivalents:: - - SELECT ... WHERE id = 14; - SELECT ... WHERE id IS NULL; - -**New in Django development version:** The semantics of ``id__exact=None`` have -changed in the development version. Previously, it was (intentionally) -converted to ``WHERE id = NULL`` at the SQL level, which would never match -anything. It has now been changed to behave the same as ``id__isnull=True``. - -.. admonition:: MySQL comparisons - - In MySQL, whether or not ``exact`` comparisons are case-sensitive depends - upon the collation setting of the table involved. The default is usually - ``latin1_swedish_ci`` or ``utf8_swedish_ci``, which results in - case-insensitive comparisons. Change the collation to - ``latin1_swedish_cs`` or ``utf8_bin`` for case sensitive comparisons. - - For more details, refer to the MySQL manual section about `character sets - and collations`_. - -.. _character sets and collations: http://dev.mysql.com/doc/refman/5.0/en/charset.html - -iexact -~~~~~~ - -Case-insensitive exact match. - -Example:: - - Blog.objects.get(name__iexact='beatles blog') - -SQL equivalent:: - - SELECT ... WHERE name ILIKE 'beatles blog'; - -Note this will match ``'Beatles Blog'``, ``'beatles blog'``, -``'BeAtLes BLoG'``, etc. - -contains -~~~~~~~~ - -Case-sensitive containment test. - -Example:: - - Entry.objects.get(headline__contains='Lennon') - -SQL equivalent:: - - SELECT ... WHERE headline LIKE '%Lennon%'; - -Note this will match the headline ``'Today Lennon honored'`` but not -``'today lennon honored'``. - -SQLite doesn't support case-sensitive ``LIKE`` statements; ``contains`` acts -like ``icontains`` for SQLite. - -icontains -~~~~~~~~~ - -Case-insensitive containment test. - -Example:: - - Entry.objects.get(headline__icontains='Lennon') - -SQL equivalent:: - - SELECT ... WHERE headline ILIKE '%Lennon%'; - -gt -~~ - -Greater than. - -Example:: - - Entry.objects.filter(id__gt=4) - -SQL equivalent:: - - SELECT ... WHERE id > 4; - -gte -~~~ - -Greater than or equal to. - -lt -~~ - -Less than. - -lte -~~~ - -Less than or equal to. - -in -~~ - -In a given list. - -Example:: - - Entry.objects.filter(id__in=[1, 3, 4]) - -SQL equivalent:: - - SELECT ... WHERE id IN (1, 3, 4); - -You can also use a queryset to dynamically evaluate the list of values -instead of providing a list of literal values. The queryset must be -reduced to a list of individual values using the ``values()`` method, -and then converted into a query using the ``query`` attribute:: - - Entry.objects.filter(blog__in=Blog.objects.filter(name__contains='Cheddar').values('pk').query) - -This queryset will be evaluated as subselect statement:: - - SELECT ... WHERE blog.id IN (SELECT id FROM ... WHERE NAME LIKE '%Cheddar%') - -startswith -~~~~~~~~~~ - -Case-sensitive starts-with. - -Example:: - - Entry.objects.filter(headline__startswith='Will') - -SQL equivalent:: - - SELECT ... WHERE headline LIKE 'Will%'; - -SQLite doesn't support case-sensitive ``LIKE`` statements; ``startswith`` acts -like ``istartswith`` for SQLite. - -istartswith -~~~~~~~~~~~ - -Case-insensitive starts-with. - -Example:: - - Entry.objects.filter(headline__istartswith='will') - -SQL equivalent:: - - SELECT ... WHERE headline ILIKE 'Will%'; - -endswith -~~~~~~~~ - -Case-sensitive ends-with. - -Example:: - - Entry.objects.filter(headline__endswith='cats') - -SQL equivalent:: - - SELECT ... WHERE headline LIKE '%cats'; - -SQLite doesn't support case-sensitive ``LIKE`` statements; ``endswith`` acts -like ``iendswith`` for SQLite. - -iendswith -~~~~~~~~~ - -Case-insensitive ends-with. - -Example:: - - Entry.objects.filter(headline__iendswith='will') - -SQL equivalent:: - - SELECT ... WHERE headline ILIKE '%will' - -range -~~~~~ - -Range test (inclusive). - -Example:: - - start_date = datetime.date(2005, 1, 1) - end_date = datetime.date(2005, 3, 31) - Entry.objects.filter(pub_date__range=(start_date, end_date)) - -SQL equivalent:: - - SELECT ... WHERE pub_date BETWEEN '2005-01-01' and '2005-03-31'; - -You can use ``range`` anywhere you can use ``BETWEEN`` in SQL -- for dates, -numbers and even characters. - -year -~~~~ - -For date/datetime fields, exact year match. Takes a four-digit year. - -Example:: - - Entry.objects.filter(pub_date__year=2005) - -SQL equivalent:: - - SELECT ... WHERE EXTRACT('year' FROM pub_date) = '2005'; - -(The exact SQL syntax varies for each database engine.) - -month -~~~~~ - -For date/datetime fields, exact month match. Takes an integer 1 (January) -through 12 (December). - -Example:: - - Entry.objects.filter(pub_date__month=12) - -SQL equivalent:: - - SELECT ... WHERE EXTRACT('month' FROM pub_date) = '12'; - -(The exact SQL syntax varies for each database engine.) - -day -~~~ - -For date/datetime fields, exact day match. - -Example:: - - Entry.objects.filter(pub_date__day=3) - -SQL equivalent:: - - SELECT ... WHERE EXTRACT('day' FROM pub_date) = '3'; - -(The exact SQL syntax varies for each database engine.) - -Note this will match any record with a pub_date on the third day of the month, -such as January 3, July 3, etc. - -isnull -~~~~~~ - -Takes either ``True`` or ``False``, which correspond to SQL queries of -``IS NULL`` and ``IS NOT NULL``, respectively. - -Example:: - - Entry.objects.filter(pub_date__isnull=True) - -SQL equivalent:: - - SELECT ... WHERE pub_date IS NULL; - -search -~~~~~~ - -A boolean full-text search, taking advantage of full-text indexing. This is -like ``contains`` but is significantly faster due to full-text indexing. - -Note this is only available in MySQL and requires direct manipulation of the -database to add the full-text index. - -regex -~~~~~ - -**New in Django development version** - -Case-sensitive regular expression match. - -The regular expression syntax is that of the database backend in use. In the -case of SQLite, which doesn't natively support regular-expression lookups, the -syntax is that of Python's ``re`` module. - -Example:: - - Entry.objects.get(title__regex=r'^(An?|The) +') - -SQL equivalents:: - - SELECT ... WHERE title REGEXP BINARY '^(An?|The) +'; -- MySQL - - SELECT ... WHERE REGEXP_LIKE(title, '^(an?|the) +', 'c'); -- Oracle - - SELECT ... WHERE title ~ '^(An?|The) +'; -- PostgreSQL - - SELECT ... WHERE title REGEXP '^(An?|The) +'; -- SQLite - -Using raw strings (e.g., ``r'foo'`` instead of ``'foo'``) for passing in the -regular expression syntax is recommended. - -iregex -~~~~~~ - -**New in Django development version** - -Case-insensitive regular expression match. - -Example:: - - Entry.objects.get(title__iregex=r'^(an?|the) +') - -SQL equivalents:: - - SELECT ... WHERE title REGEXP '^(an?|the) +'; -- MySQL - - SELECT ... WHERE REGEXP_LIKE(title, '^(an?|the) +', 'i'); -- Oracle - - SELECT ... WHERE title ~* '^(an?|the) +'; -- PostgreSQL - - SELECT ... WHERE title REGEXP '(?i)^(an?|the) +'; -- SQLite - -Default lookups are exact -------------------------- - -If you don't provide a lookup type -- that is, if your keyword argument doesn't -contain a double underscore -- the lookup type is assumed to be ``exact``. - -For example, the following two statements are equivalent:: - - Blog.objects.get(id__exact=14) # Explicit form - Blog.objects.get(id=14) # __exact is implied - -This is for convenience, because ``exact`` lookups are the common case. - -The pk lookup shortcut ----------------------- - -For convenience, Django provides a ``pk`` lookup type, which stands for -"primary_key". - -In the example ``Blog`` model, the primary key is the ``id`` field, so these -three statements are equivalent:: - - Blog.objects.get(id__exact=14) # Explicit form - Blog.objects.get(id=14) # __exact is implied - Blog.objects.get(pk=14) # pk implies id__exact - -The use of ``pk`` isn't limited to ``__exact`` queries -- any query term -can be combined with ``pk`` to perform a query on the primary key of a model:: - - # Get blogs entries with id 1, 4 and 7 - Blog.objects.filter(pk__in=[1,4,7]) - # Get all blog entries with id > 14 - Blog.objects.filter(pk__gt=14) - -``pk`` lookups also work across joins. For example, these three statements are -equivalent:: - - Entry.objects.filter(blog__id__exact=3) # Explicit form - Entry.objects.filter(blog__id=3) # __exact is implied - Entry.objects.filter(blog__pk=3) # __pk implies __id__exact - -.. note:: - Because of this shortcut, you cannot have a field called ``pk`` that is not - the primary key of the model. It will always be replaced by the name of the - model's primary key in queries. - -Lookups that span relationships -------------------------------- - -Django offers a powerful and intuitive way to "follow" relationships in -lookups, taking care of the SQL ``JOIN``\s for you automatically, behind the -scenes. To span a relationship, just use the field name of related fields -across models, separated by double underscores, until you get to the field you -want. - -This example retrieves all ``Entry`` objects with a ``Blog`` whose ``name`` -is ``'Beatles Blog'``:: - - Entry.objects.filter(blog__name__exact='Beatles Blog') - -This spanning can be as deep as you'd like. - -It works backwards, too. To refer to a "reverse" relationship, just use the -lowercase name of the model. - -This example retrieves all ``Blog`` objects which have at least one ``Entry`` -whose ``headline`` contains ``'Lennon'``:: - - Blog.objects.filter(entry__headline__contains='Lennon') - -If you are filtering across multiple relationships and one of the intermediate -models doesn't have a value that meets the filter condition, Django will treat -it as if there is an empty (all values are ``NULL``), but valid, object there. -All this means is that no error will be raised. For example, in this filter:: - - Blog.objects.filter(entry__author__name='Lennon') - -(if there was a related ``Author`` model), if there was no ``author`` -associated with an entry, it would be treated as if there was also no ``name`` -attached, rather than raising an error because of the missing ``author``. -Usually this is exactly what you want to have happen. The only case where it -might be confusing is if you are using ``isnull``. Thus:: - - Blog.objects.filter(entry__author__name__isnull=True) - -will return ``Blog`` objects that have an empty ``name`` on the ``author`` and -also those which have an empty ``author`` on the ``entry``. If you don't want -those latter objects, you could write:: - - Blog.objetcs.filter(entry__author__isnull=False, - entry__author__name__isnull=True) - -Spanning multi-valued relationships -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -**New in Django development version** - -When you are filtering an object based on a ``ManyToManyField`` or a reverse -``ForeignKeyField``, there are two different sorts of filter you may be -interested in. Consider the ``Blog``/``Entry`` relationship (``Blog`` to -``Entry`` is a one-to-many relation). We might be interested in finding blogs -that have an entry which has both *"Lennon"* in the headline and was published -in 2008. Or we might want to find blogs that have an entry with *"Lennon"* in -the headline as well as an entry that was published in 2008. Since there are -multiple entries associated with a single ``Blog``, both of these queries are -possible and make sense in some situations. - -The same type of situation arises with a ``ManyToManyField``. For example, if -an ``Entry`` has a ``ManyToManyField`` called ``tags``, we might want to find -entries linked to tags called *"music"* and *"bands"* or we might want an -entry that contains a tag with a name of *"music"* and a status of *"public"*. - -To handle both of these situations, Django has a consistent way of processing -``filter()`` and ``exclude()`` calls. Everything inside a single ``filter()`` -call is applied simultaneously to filter out items matching all those -requirements. Successive ``filter()`` calls further restrict the set of -objects, but for multi-valued relations, they apply to any object linked to -the primary model, not necessarily those objects that were selected by an -earlier ``filter()`` call. - -That may sound a bit confusing, so hopefully an example will clarify. To -select all blogs that contains entries with *"Lennon"* in the headline and -were published in 2008, we would write:: - - Blog.objects.filter(entry__headline__contains='Lennon', - entry__pub_date__year=2008) - -To select all blogs that contain an entry with *"Lennon"* in the headline -**as well as** an entry that was published in 2008, we would write:: - - Blog.objects.filter(entry__headline__contains='Lennon').filter( - entry__pub_date__year=2008) - -In this second example, the first filter restricted the queryset to all those -blogs linked to that particular type of entry. The second filter restricted -the set of blogs *further* to those that are also linked to the second type of -entry. The entries select by the second filter may or may not be the same as -the entries in the first filter. We are filtering the ``Blog`` items with each -filter statement, not the ``Entry`` items. - -All of this behavior also applies to ``exclude()``: all the conditions in a -single ``exclude()`` statement apply to a single instance (if those conditions -are talking about the same multi-valued relation). Conditions in subsequent -``filter()`` or ``exclude()`` calls that refer to the same relation may end up -filtering on different linked objects. - -Escaping percent signs and underscores in LIKE statements ---------------------------------------------------------- - -The field lookups that equate to ``LIKE`` SQL statements (``iexact``, -``contains``, ``icontains``, ``startswith``, ``istartswith``, ``endswith`` -and ``iendswith``) will automatically escape the two special characters used in -``LIKE`` statements -- the percent sign and the underscore. (In a ``LIKE`` -statement, the percent sign signifies a multiple-character wildcard and the -underscore signifies a single-character wildcard.) - -This means things should work intuitively, so the abstraction doesn't leak. -For example, to retrieve all the entries that contain a percent sign, just use -the percent sign as any other character:: - - Entry.objects.filter(headline__contains='%') - -Django takes care of the quoting for you; the resulting SQL will look something -like this:: - - SELECT ... WHERE headline LIKE '%\%%'; - -Same goes for underscores. Both percentage signs and underscores are handled -for you transparently. - -Caching and QuerySets ---------------------- - -Each ``QuerySet`` contains a cache, to minimize database access. It's important -to understand how it works, in order to write the most efficient code. - -In a newly created ``QuerySet``, the cache is empty. The first time a -``QuerySet`` is evaluated -- and, hence, a database query happens -- Django -saves the query results in the ``QuerySet``'s cache and returns the results -that have been explicitly requested (e.g., the next element, if the -``QuerySet`` is being iterated over). Subsequent evaluations of the -``QuerySet`` reuse the cached results. - -Keep this caching behavior in mind, because it may bite you if you don't use -your ``QuerySet``\s correctly. For example, the following will create two -``QuerySet``\s, evaluate them, and throw them away:: - - print [e.headline for e in Entry.objects.all()] - print [e.pub_date for e in Entry.objects.all()] - -That means the same database query will be executed twice, effectively doubling -your database load. Also, there's a possibility the two lists may not include -the same database records, because an ``Entry`` may have been added or deleted -in the split second between the two requests. - -To avoid this problem, simply save the ``QuerySet`` and reuse it:: - - queryset = Poll.objects.all() - print [p.headline for p in queryset] # Evaluate the query set. - print [p.pub_date for p in queryset] # Re-use the cache from the evaluation. - -Comparing objects -================= - -To compare two model instances, just use the standard Python comparison operator, -the double equals sign: ``==``. Behind the scenes, that compares the primary -key values of two models. - -Using the ``Entry`` example above, the following two statements are equivalent:: - - some_entry == other_entry - some_entry.id == other_entry.id - -If a model's primary key isn't called ``id``, no problem. Comparisons will -always use the primary key, whatever it's called. For example, if a model's -primary key field is called ``name``, these two statements are equivalent:: - - some_obj == other_obj - some_obj.name == other_obj.name - -Complex lookups with Q objects -============================== - -Keyword argument queries -- in ``filter()``, etc. -- are "AND"ed together. If -you need to execute more complex queries (for example, queries with ``OR`` -statements), you can use ``Q`` objects. - -A ``Q`` object (``django.db.models.Q``) is an object used to encapsulate a -collection of keyword arguments. These keyword arguments are specified as in -"Field lookups" above. - -For example, this ``Q`` object encapsulates a single ``LIKE`` query:: - - Q(question__startswith='What') - -``Q`` objects can be combined using the ``&`` and ``|`` operators. When an -operator is used on two ``Q`` objects, it yields a new ``Q`` object. - -For example, this statement yields a single ``Q`` object that represents the -"OR" of two ``"question__startswith"`` queries:: - - Q(question__startswith='Who') | Q(question__startswith='What') - -This is equivalent to the following SQL ``WHERE`` clause:: - - WHERE question LIKE 'Who%' OR question LIKE 'What%' - -You can compose statements of arbitrary complexity by combining ``Q`` objects -with the ``&`` and ``|`` operators. You can also use parenthetical grouping. - -**New in Django development version:** ``Q`` objects can also be negated using -the ``~`` operator, allowing for combined lookups that combine both a normal -query and a negated (``NOT``) query:: - - Q(question__startswith='Who') | ~Q(pub_date__year=2005) - -Each lookup function that takes keyword-arguments (e.g. ``filter()``, -``exclude()``, ``get()``) can also be passed one or more ``Q`` objects as -positional (not-named) arguments. If you provide multiple ``Q`` object -arguments to a lookup function, the arguments will be "AND"ed together. For -example:: - - Poll.objects.get( - Q(question__startswith='Who'), - Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)) - ) - -... roughly translates into the SQL:: - - SELECT * from polls WHERE question LIKE 'Who%' - AND (pub_date = '2005-05-02' OR pub_date = '2005-05-06') - -Lookup functions can mix the use of ``Q`` objects and keyword arguments. All -arguments provided to a lookup function (be they keyword arguments or ``Q`` -objects) are "AND"ed together. However, if a ``Q`` object is provided, it must -precede the definition of any keyword arguments. For example:: - - Poll.objects.get( - Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)), - question__startswith='Who') - -... would be a valid query, equivalent to the previous example; but:: - - # INVALID QUERY - Poll.objects.get( - question__startswith='Who', - Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6))) - -... would not be valid. - -See the `OR lookups examples page`_ for more examples. - -.. _OR lookups examples page: ../models/or_lookups/ - -Related objects -=============== - -When you define a relationship in a model (i.e., a ``ForeignKey``, -``OneToOneField``, or ``ManyToManyField``), instances of that model will have -a convenient API to access the related object(s). - -Using the models at the top of this page, for example, an ``Entry`` object ``e`` -can get its associated ``Blog`` object by accessing the ``blog`` attribute: -``e.blog``. - -(Behind the scenes, this functionality is implemented by Python descriptors_. -This shouldn't really matter to you, but we point it out here for the curious.) - -Django also creates API accessors for the "other" side of the relationship -- -the link from the related model to the model that defines the relationship. -For example, a ``Blog`` object ``b`` has access to a list of all related -``Entry`` objects via the ``entry_set`` attribute: ``b.entry_set.all()``. - -All examples in this section use the sample ``Blog``, ``Author`` and ``Entry`` -models defined at the top of this page. - -.. _descriptors: http://users.rcn.com/python/download/Descriptor.htm - -One-to-many relationships -------------------------- - -Forward -~~~~~~~ - -If a model has a ``ForeignKey``, instances of that model will have access to -the related (foreign) object via a simple attribute of the model. - -Example:: - - e = Entry.objects.get(id=2) - e.blog # Returns the related Blog object. - -You can get and set via a foreign-key attribute. As you may expect, changes to -the foreign key aren't saved to the database until you call ``save()``. -Example:: - - e = Entry.objects.get(id=2) - e.blog = some_blog - e.save() - -If a ``ForeignKey`` field has ``null=True`` set (i.e., it allows ``NULL`` -values), you can assign ``None`` to it. Example:: - - e = Entry.objects.get(id=2) - e.blog = None - e.save() # "UPDATE blog_entry SET blog_id = NULL ...;" - -Forward access to one-to-many relationships is cached the first time the -related object is accessed. Subsequent accesses to the foreign key on the same -object instance are cached. Example:: - - e = Entry.objects.get(id=2) - print e.blog # Hits the database to retrieve the associated Blog. - print e.blog # Doesn't hit the database; uses cached version. - -Note that the ``select_related()`` ``QuerySet`` method recursively prepopulates -the cache of all one-to-many relationships ahead of time. Example:: - - e = Entry.objects.select_related().get(id=2) - print e.blog # Doesn't hit the database; uses cached version. - print e.blog # Doesn't hit the database; uses cached version. - -``select_related()`` is documented in the `QuerySet methods that return new QuerySets`_ section above. - -Backward -~~~~~~~~ - -If a model has a ``ForeignKey``, instances of the foreign-key model will have -access to a ``Manager`` that returns all instances of the first model. By -default, this ``Manager`` is named ``FOO_set``, where ``FOO`` is the source -model name, lowercased. This ``Manager`` returns ``QuerySets``, which can be -filtered and manipulated as described in the "Retrieving objects" section -above. - -Example:: - - b = Blog.objects.get(id=1) - b.entry_set.all() # Returns all Entry objects related to Blog. - - # b.entry_set is a Manager that returns QuerySets. - b.entry_set.filter(headline__contains='Lennon') - b.entry_set.count() - -You can override the ``FOO_set`` name by setting the ``related_name`` -parameter in the ``ForeignKey()`` definition. For example, if the ``Entry`` -model was altered to ``blog = ForeignKey(Blog, related_name='entries')``, the -above example code would look like this:: - - b = Blog.objects.get(id=1) - b.entries.all() # Returns all Entry objects related to Blog. - - # b.entries is a Manager that returns QuerySets. - b.entries.filter(headline__contains='Lennon') - b.entries.count() - -You cannot access a reverse ``ForeignKey`` ``Manager`` from the class; it must -be accessed from an instance. Example:: - - Blog.entry_set # Raises AttributeError: "Manager must be accessed via instance". - -In addition to the ``QuerySet`` methods defined in "Retrieving objects" above, -the ``ForeignKey`` ``Manager`` has these additional methods: - - * ``add(obj1, obj2, ...)``: Adds the specified model objects to the related - object set. - - Example:: - - b = Blog.objects.get(id=1) - e = Entry.objects.get(id=234) - b.entry_set.add(e) # Associates Entry e with Blog b. - - * ``create(**kwargs)``: Creates a new object, saves it and puts it in the - related object set. Returns the newly created object. - - Example:: - - b = Blog.objects.get(id=1) - e = b.entry_set.create(headline='Hello', body_text='Hi', pub_date=datetime.date(2005, 1, 1)) - # No need to call e.save() at this point -- it's already been saved. - - This is equivalent to (but much simpler than):: - - b = Blog.objects.get(id=1) - e = Entry(blog=b, headline='Hello', body_text='Hi', pub_date=datetime.date(2005, 1, 1)) - e.save() - - Note that there's no need to specify the keyword argument of the model - that defines the relationship. In the above example, we don't pass the - parameter ``blog`` to ``create()``. Django figures out that the new - ``Entry`` object's ``blog`` field should be set to ``b``. - - * ``remove(obj1, obj2, ...)``: Removes the specified model objects from the - related object set. - - Example:: - - b = Blog.objects.get(id=1) - e = Entry.objects.get(id=234) - b.entry_set.remove(e) # Disassociates Entry e from Blog b. - - In order to prevent database inconsistency, this method only exists on - ``ForeignKey`` objects where ``null=True``. If the related field can't be - set to ``None`` (``NULL``), then an object can't be removed from a - relation without being added to another. In the above example, removing - ``e`` from ``b.entry_set()`` is equivalent to doing ``e.blog = None``, - and because the ``blog`` ``ForeignKey`` doesn't have ``null=True``, this - is invalid. - - * ``clear()``: Removes all objects from the related object set. - - Example:: - - b = Blog.objects.get(id=1) - b.entry_set.clear() - - Note this doesn't delete the related objects -- it just disassociates - them. - - Just like ``remove()``, ``clear()`` is only available on ``ForeignKey``s - where ``null=True``. - -To assign the members of a related set in one fell swoop, just assign to it -from any iterable object. Example:: - - b = Blog.objects.get(id=1) - b.entry_set = [e1, e2] - -If the ``clear()`` method is available, any pre-existing objects will be -removed from the ``entry_set`` before all objects in the iterable (in this -case, a list) are added to the set. If the ``clear()`` method is *not* -available, all objects in the iterable will be added without removing any -existing elements. - -Each "reverse" operation described in this section has an immediate effect on -the database. Every addition, creation and deletion is immediately and -automatically saved to the database. - -One-to-one relationships ------------------------- - -One-to-one relationships are very similar to many-to-one relationships. -If you define a OneToOneField on your model, instances of that model will have -access to the related object via a simple attribute of the model. - -For example:: - - class EntryDetail(models.Model): - entry = models.OneToOneField(Entry) - details = models.TextField() - - ed = EntryDetail.objects.get(id=2) - ed.entry # Returns the related Entry object. - -The difference comes in "reverse" queries. The related model in a one-to-one -relationship also has access to a ``Manager`` object, but that ``Manager`` -represents a single object, rather than a collection of objects:: - - e = Entry.objects.get(id=2) - e.entrydetail # returns the related EntryDetail object - -If no object has been assigned to this relationship, Django will raise -a ``DoesNotExist`` exception. - -Instances can be assigned to the reverse relationship in the same way as -you would assign the forward relationship:: - - e.entrydetail = ed - -Many-to-many relationships --------------------------- - -Both ends of a many-to-many relationship get automatic API access to the other -end. The API works just as a "backward" one-to-many relationship. See Backward_ -above. - -The only difference is in the attribute naming: The model that defines the -``ManyToManyField`` uses the attribute name of that field itself, whereas the -"reverse" model uses the lowercased model name of the original model, plus -``'_set'`` (just like reverse one-to-many relationships). - -An example makes this easier to understand:: - - e = Entry.objects.get(id=3) - e.authors.all() # Returns all Author objects for this Entry. - e.authors.count() - e.authors.filter(name__contains='John') - - a = Author.objects.get(id=5) - a.entry_set.all() # Returns all Entry objects for this Author. - -Like ``ForeignKey``, ``ManyToManyField`` can specify ``related_name``. In the -above example, if the ``ManyToManyField`` in ``Entry`` had specified -``related_name='entries'``, then each ``Author`` instance would have an -``entries`` attribute instead of ``entry_set``. - -How are the backward relationships possible? --------------------------------------------- - -Other object-relational mappers require you to define relationships on both -sides. The Django developers believe this is a violation of the DRY (Don't -Repeat Yourself) principle, so Django only requires you to define the -relationship on one end. - -But how is this possible, given that a model class doesn't know which other -model classes are related to it until those other model classes are loaded? - -The answer lies in the ``INSTALLED_APPS`` setting. The first time any model is -loaded, Django iterates over every model in ``INSTALLED_APPS`` and creates the -backward relationships in memory as needed. Essentially, one of the functions -of ``INSTALLED_APPS`` is to tell Django the entire model domain. - -Queries over related objects ----------------------------- - -Queries involving related objects follow the same rules as queries involving -normal value fields. When specifying the the value for a query to match, you -may use either an object instance itself, or the primary key value for the -object. - -For example, if you have a Blog object ``b`` with ``id=5``, the following -three queries would be identical:: - - Entry.objects.filter(blog=b) # Query using object instance - Entry.objects.filter(blog=b.id) # Query using id from instance - Entry.objects.filter(blog=5) # Query using id directly - -Deleting objects -================ - -The delete method, conveniently, is named ``delete()``. This method immediately -deletes the object and has no return value. Example:: - - e.delete() - -You can also delete objects in bulk. Every ``QuerySet`` has a ``delete()`` -method, which deletes all members of that ``QuerySet``. - -For example, this deletes all ``Entry`` objects with a ``pub_date`` year of -2005:: - - Entry.objects.filter(pub_date__year=2005).delete() - -Keep in mind that this will, whenever possible, be executed purely in -SQL, and so the ``delete()`` methods of individual object instances -will not necessarily be called during the process. If you've provided -a custom ``delete()`` method on a model class and want to ensure that -it is called, you will need to "manually" delete instances of that -model (e.g., by iterating over a ``QuerySet`` and calling ``delete()`` -on each object individually) rather than using the bulk ``delete()`` -method of a ``QuerySet``. - -When Django deletes an object, it emulates the behavior of the SQL -constraint ``ON DELETE CASCADE`` -- in other words, any objects which -had foreign keys pointing at the object to be deleted will be deleted -along with it. For example:: - - b = Blog.objects.get(pk=1) - # This will delete the Blog and all of its Entry objects. - b.delete() - -Note that ``delete()`` is the only ``QuerySet`` method that is not exposed on a -``Manager`` itself. This is a safety mechanism to prevent you from accidentally -requesting ``Entry.objects.delete()``, and deleting *all* the entries. If you -*do* want to delete all the objects, then you have to explicitly request a -complete query set:: - - Entry.objects.all().delete() - -Updating multiple objects at once -================================= - -**New in Django development version** - -Sometimes you want to set a field to a particular value for all the objects in -a ``QuerySet``. You can do this with the ``update()`` method. For example:: - - # Update all the headlines with pub_date in 2007. - Entry.objects.filter(pub_date__year=2007).update(headline='Everything is the same') - -You can only set non-relation fields and ``ForeignKey`` fields using this -method, and the value you set the field to must be a hard-coded Python value -(i.e., you can't set a field to be equal to some other field at the moment). - -To update ``ForeignKey`` fields, set the new value to be the new model -instance you want to point to. Example:: - - b = Blog.objects.get(pk=1) - # Change every Entry so that it belongs to this Blog. - Entry.objects.all().update(blog=b) - -The ``update()`` method is applied instantly and doesn't return anything -(similar to ``delete()``). The only restriction on the ``QuerySet`` that is -updated is that it can only access one database table, the model's main -table. So don't try to filter based on related fields or anything like that; -it won't work. - -Be aware that the ``update()`` method is converted directly to an SQL -statement. It is a bulk operation for direct updates. It doesn't run any -``save()`` methods on your models, or emit the ``pre_save`` or ``post_save`` -signals (which are a consequence of calling ``save()``). If you want to save -every item in a ``QuerySet`` and make sure that the ``save()`` method is -called on each instance, you don't need any special function to handle that. -Just loop over them and call ``save()``:: - - for item in my_queryset: - item.save() - - -Extra instance methods -====================== - -In addition to ``save()``, ``delete()``, a model object might get any or all -of the following methods: - -get_FOO_display() ------------------ - -For every field that has ``choices`` set, the object will have a -``get_FOO_display()`` method, where ``FOO`` is the name of the field. This -method returns the "human-readable" value of the field. For example, in the -following model:: - - GENDER_CHOICES = ( - ('M', 'Male'), - ('F', 'Female'), - ) - class Person(models.Model): - name = models.CharField(max_length=20) - gender = models.CharField(max_length=1, choices=GENDER_CHOICES) - -...each ``Person`` instance will have a ``get_gender_display()`` method. Example:: - - >>> p = Person(name='John', gender='M') - >>> p.save() - >>> p.gender - 'M' - >>> p.get_gender_display() - 'Male' - -get_next_by_FOO(\**kwargs) and get_previous_by_FOO(\**kwargs) -------------------------------------------------------------- - -For every ``DateField`` and ``DateTimeField`` that does not have ``null=True``, -the object will have ``get_next_by_FOO()`` and ``get_previous_by_FOO()`` -methods, where ``FOO`` is the name of the field. This returns the next and -previous object with respect to the date field, raising the appropriate -``DoesNotExist`` exception when appropriate. - -Both methods accept optional keyword arguments, which should be in the format -described in `Field lookups`_ above. - -Note that in the case of identical date values, these methods will use the ID -as a fallback check. This guarantees that no records are skipped or duplicated. -For a full example, see the `lookup API sample model`_. - -.. _lookup API sample model: ../models/lookup/ - - -Shortcuts -========= - -As you develop views, you will discover a number of common idioms in the -way you use the database API. Django encodes some of these idioms as -shortcuts that can be used to simplify the process of writing views. These -functions are in the ``django.shortcuts`` module. - -get_object_or_404() -------------------- - -One common idiom to use ``get()`` and raise ``Http404`` if the -object doesn't exist. This idiom is captured by ``get_object_or_404()``. -This function takes a Django model as its first argument and an -arbitrary number of keyword arguments, which it passes to the default -manager's ``get()`` function. It raises ``Http404`` if the object doesn't -exist. For example:: - - # Get the Entry with a primary key of 3 - e = get_object_or_404(Entry, pk=3) - -When you provide a model to this shortcut function, the default manager -is used to execute the underlying ``get()`` query. If you don't want to -use the default manager, or if you want to search a list of related objects, -you can provide ``get_object_or_404()`` with a ``Manager`` object instead. -For example:: - - # Get the author of blog instance e with a name of 'Fred' - a = get_object_or_404(e.authors, name='Fred') - - # Use a custom manager 'recent_entries' in the search for an - # entry with a primary key of 3 - e = get_object_or_404(Entry.recent_entries, pk=3) - -**New in Django development version:** The first argument to -``get_object_or_404()`` can be a ``QuerySet`` object. This is useful in cases -where you've defined a custom manager method. For example:: - - # Use a QuerySet returned from a 'published' method of a custom manager - # in the search for an entry with primary key of 5 - e = get_object_or_404(Entry.objects.published(), pk=5) - -get_list_or_404() ------------------ - -``get_list_or_404`` behaves the same way as ``get_object_or_404()`` --- except that it uses ``filter()`` instead of ``get()``. It raises -``Http404`` if the list is empty. - -Falling back to raw SQL -======================= - -If you find yourself needing to write an SQL query that is too complex for -Django's database-mapper to handle, you can fall back into raw-SQL statement -mode. - -The preferred way to do this is by giving your model custom methods or custom -manager methods that execute queries. Although there's nothing in Django that -*requires* database queries to live in the model layer, this approach keeps all -your data-access logic in one place, which is smart from an code-organization -standpoint. For instructions, see `Executing custom SQL`_. - -Finally, it's important to note that the Django database layer is merely an -interface to your database. You can access your database via other tools, -programming languages or database frameworks; there's nothing Django-specific -about your database. - -.. _Executing custom SQL: ../model-api/#executing-custom-sql diff --git a/docs/documentation.txt b/docs/documentation.txt deleted file mode 100644 index decb066fa1..0000000000 --- a/docs/documentation.txt +++ /dev/null @@ -1,138 +0,0 @@ -==================================== -How to read the Django documentation -==================================== - -We've put a lot of effort into making Django's documentation useful, easy to -read and as complete as possible. Here are a few tips on how to make the best -of it, along with some style guidelines. - -(Yes, this is documentation about documentation. Rest assured we have no plans -to write a document about how to read the document about documentation.) - -How documentation is updated -============================ - -Just as the Django code base is developed and improved on a daily basis, our -documentation is consistently improving. We improve documentation for several -reasons: - - * To make content fixes, such as grammar/typo corrections. - * To add information and/or examples to existing sections that need to be - expanded. - * To document Django features that aren't yet documented. (The list of - such features is shrinking but exists nonetheless.) - * To add documentation for new features as new features get added, or as - Django APIs or behaviors change. - -Django's documentation is kept in the same source control system as its code. -It lives in the `django/trunk/docs`_ directory of our Subversion repository. -Each document is a separate text file that covers a narrowly focused topic, -such as the "generic views" framework or how to construct a database model. - -.. _django/trunk/docs: http://code.djangoproject.com/browser/django/trunk/docs - -Where to get it -=============== - -You can read Django documentation in several ways. They are, in order of -preference: - -On the Web ----------- - -The most recent version of the Django documentation lives at -http://www.djangoproject.com/documentation/ . These HTML pages are generated -automatically from the text files in source control. That means they reflect -the "latest and greatest" in Django -- they include the very latest -corrections and additions, and they discuss the latest Django features, -which may only be available to users of the Django development version. (See -"Differences between versions" below.) - -We encourage you to help improve the docs by submitting changes, corrections -and suggestions in the `ticket system`_. The Django developers actively monitor -the ticket system and use your feedback to improve the documentation for -everybody. - -Note, however, that tickets should explicitly relate to the documentation, -rather than asking broad tech-support questions. If you need help with your -particular Django setup, try the `django-users mailing list`_ or the -`#django IRC channel`_ instead. - -.. _ticket system: http://code.djangoproject.com/simpleticket?component=Documentation -.. _django-users mailing list: http://groups.google.com/group/django-users -.. _#django IRC channel: irc://irc.freenode.net/django - -In plain text -------------- - -For offline reading, or just for convenience, you can read the Django -documentation in plain text. - -If you're using an official release of Django, note that the zipped package -(tarball) of the code includes a ``docs/`` directory, which contains all the -documentation for that release. - -If you're using the development version of Django (aka the Subversion "trunk"), -note that the ``docs/`` directory contains all of the documentation. You can -``svn update`` it, just as you ``svn update`` the Python code, in order to get -the latest changes. - -You can check out the latest Django documentation from Subversion using this -shell command:: - - svn co http://code.djangoproject.com/svn/django/trunk/docs/ django_docs - -One low-tech way of taking advantage of the text documentation is by using the -Unix ``grep`` utility to search for a phrase in all of the documentation. For -example, this will show you each mention of the phrase "edit_inline" in any -Django document:: - - grep edit_inline /path/to/django/docs/*.txt - -Formatting -~~~~~~~~~~ - -The text documentation is written in ReST (ReStructured Text) format. That -means it's easy to read but is also formatted in a way that makes it easy to -convert into other formats, such as HTML. If you have the `reStructuredText`_ -library installed, you can use ``rst2html`` to generate your own HTML files. - -.. _reStructuredText: http://docutils.sourceforge.net/rst.html - -Differences between versions -============================ - -As previously mentioned, the text documentation in our Subversion repository -contains the "latest and greatest" changes and additions. These changes often -include documentation of new features added in the Django development version --- the Subversion ("trunk") version of Django. For that reason, it's worth -pointing out our policy on keeping straight the documentation for various -versions of the framework. - -We follow this policy: - - * The primary documentation on djangoproject.com is an HTML version of the - latest docs in Subversion. These docs always correspond to the latest - official Django release, plus whatever features we've added/changed in - the framework *since* the latest release. - - * As we add features to Django's development version, we try to update the - documentation in the same Subversion commit transaction. - - * To distinguish feature changes/additions in the docs, we use the phrase - **New in Django development version**. In practice, this means that the - current documentation on djangoproject.com can be used by users of either - the latest release *or* the development version. - - * Documentation for a particular Django release is frozen once the version - has been released officially. It remains a snapshot of the docs as of the - moment of the release. We will make exceptions to this rule in - the case of retroactive security updates or other such retroactive - changes. Once documentation is frozen, we add a note to the top of each - frozen document that says "These docs are frozen for Django version XXX" - and links to the current version of that document. - - * The `main documentation Web page`_ includes links to documentation for - all previous versions. - -.. _main documentation Web page: http://www.djangoproject.com/documentation/ diff --git a/docs/faq.txt b/docs/faq.txt deleted file mode 100644 index 2c1ffa72db..0000000000 --- a/docs/faq.txt +++ /dev/null @@ -1,744 +0,0 @@ -========== -Django FAQ -========== - -General questions -================= - -Why does this project exist? ----------------------------- - -Django grew from a very practical need: World Online, a newspaper Web -operation, is responsible for building intensive Web applications on journalism -deadlines. In the fast-paced newsroom, World Online often has only a matter of -hours to take a complicated Web application from concept to public launch. - -At the same time, the World Online Web developers have consistently been -perfectionists when it comes to following best practices of Web development. - -In fall 2003, the World Online developers (Adrian Holovaty and Simon Willison) -ditched PHP and began using Python to develop its Web sites. As they built -intensive, richly interactive sites such as Lawrence.com, they began to extract -a generic Web development framework that let them build Web applications more -and more quickly. They tweaked this framework constantly, adding improvements -over two years. - -In summer 2005, World Online decided to open-source the resulting software, -Django. Django would not be possible without a whole host of open-source -projects -- `Apache`_, `Python`_, and `PostgreSQL`_ to name a few -- and we're -thrilled to be able to give something back to the open-source community. - -.. _Apache: http://httpd.apache.org/ -.. _Python: http://www.python.org/ -.. _PostgreSQL: http://www.postgresql.org/ - -What does "Django" mean, and how do you pronounce it? ------------------------------------------------------ - -Django is named after `Django Reinhardt`_, a gypsy jazz guitarist from the 1930s -to early 1950s. To this day, he's considered one of the best guitarists of all time. - -Listen to his music. You'll like it. - -Django is pronounced **JANG**-oh. Rhymes with FANG-oh. The "D" is silent. - -We've also recorded an `audio clip of the pronunciation`_. - -.. _Django Reinhardt: http://en.wikipedia.org/wiki/Django_Reinhardt -.. _audio clip of the pronunciation: http://red-bean.com/~adrian/django_pronunciation.mp3 - -Is Django stable? ------------------ - -Yes. World Online has been using Django for more than three years. Sites built -on Django have weathered traffic spikes of over one million hits an hour and a -number of Slashdottings. Yes, it's quite stable. - -Does Django scale? ------------------- - -Yes. Compared to development time, hardware is cheap, and so Django is -designed to take advantage of as much hardware as you can throw at it. - -Django uses a "shared-nothing" architecture, which means you can add hardware -at any level -- database servers, caching servers or Web/application servers. - -The framework cleanly separates components such as its database layer and -application layer. And it ships with a simple-yet-powerful `cache framework`_. - -.. _`cache framework`: ../cache/ - -Who's behind this? ------------------- - -Django was developed at `World Online`_, the Web department of a newspaper in -Lawrence, Kansas, USA. - -`Adrian Holovaty`_ - Adrian is a Web developer with a background in journalism. He was lead - developer at World Online for 2.5 years, during which time Django was - developed and implemented on World Online's sites. Now he works for - washingtonpost.com building rich, database-backed information sites, and - continues to oversee Django development. He likes playing guitar (Django - Reinhardt style) and hacking on side projects such as `chicagocrime.org`_. - He lives in Chicago. - - On IRC, Adrian goes by ``adrian_h``. - -`Jacob Kaplan-Moss`_ - Jacob is a whipper-snapper from California who spends equal time coding and - cooking. He's lead developer at World Online and actively hacks on various - cool side projects. He's contributed to the Python-ObjC bindings and was - the first guy to figure out how to write Tivo apps in Python. Lately he's - been messing with Python on the PSP. He lives in Lawrence, Kansas. - - On IRC, Jacob goes by ``jacobkm``. - -`Simon Willison`_ - Simon is a well-respected Web developer from England. He had a one-year - internship at World Online, during which time he and Adrian developed - Django from scratch. The most enthusiastic Brit you'll ever meet, he's - passionate about best practices in Web development and has maintained a - well-read Web-development blog for years at http://simon.incutio.com. - He works for Yahoo UK, where he managed to score the title "Hacker Liason." - He lives in London. - - On IRC, Simon goes by ``SimonW``. - -`Wilson Miner`_ - Wilson's design-fu makes us all look like rock stars. By day, he's an - interactive designer for `Apple`_. Don't ask him what he's working on, or - he'll have to kill you. He lives in San Francisco. - - On IRC, Wilson goes by ``wilsonian``. - -.. _`World Online`: http://code.djangoproject.com/wiki/WorldOnline -.. _`Adrian Holovaty`: http://www.holovaty.com/ -.. _`washingtonpost.com`: http://www.washingtonpost.com/ -.. _`chicagocrime.org`: http://www.chicagocrime.org/ -.. _`Simon Willison`: http://simon.incutio.com/ -.. _`simon.incutio.com`: http://simon.incutio.com/ -.. _`Jacob Kaplan-Moss`: http://www.jacobian.org/ -.. _`Wilson Miner`: http://www.wilsonminer.com/ -.. _`Apple`: http://www.apple.com/ - -Which sites use Django? ------------------------ - -The Django wiki features a consistently growing `list of Django-powered sites`_. -Feel free to add your Django-powered site to the list. - -.. _list of Django-powered sites: http://code.djangoproject.com/wiki/DjangoPoweredSites - -Django appears to be a MVC framework, but you call the Controller the "view", and the View the "template". How come you don't use the standard names? ------------------------------------------------------------------------------------------------------------------------------------------------------ - -Well, the standard names are debatable. - -In our interpretation of MVC, the "view" describes the data that gets presented -to the user. It's not necessarily *how* the data *looks*, but *which* data is -presented. The view describes *which data you see*, not *how you see it.* It's -a subtle distinction. - -So, in our case, a "view" is the Python callback function for a particular URL, -because that callback function describes which data is presented. - -Furthermore, it's sensible to separate content from presentation -- which is -where templates come in. In Django, a "view" describes which data is presented, -but a view normally delegates to a template, which describes *how* the data is -presented. - -Where does the "controller" fit in, then? In Django's case, it's probably the -framework itself: the machinery that sends a request to the appropriate view, -according to the Django URL configuration. - -If you're hungry for acronyms, you might say that Django is a "MTV" framework --- that is, "model", "template", and "view." That breakdown makes much more -sense. - -At the end of the day, of course, it comes down to getting stuff done. And, -regardless of how things are named, Django gets stuff done in a way that's most -logical to us. - -<Framework X> does <feature Y> -- why doesn't Django? ------------------------------------------------------ - -We're well aware that there are other awesome Web frameworks out there, and -we're not averse to borrowing ideas where appropriate. However, Django was -developed precisely because we were unhappy with the status quo, so please be -aware that "because <Framework X> does it" is not going to be sufficient reason -to add a given feature to Django. - -Why did you write all of Django from scratch, instead of using other Python libraries? --------------------------------------------------------------------------------------- - -When Django was originally written a couple of years ago, Adrian and Simon -spent quite a bit of time exploring the various Python Web frameworks -available. - -In our opinion, none of them were completely up to snuff. - -We're picky. You might even call us perfectionists. (With deadlines.) - -Over time, we stumbled across open-source libraries that did things we'd -already implemented. It was reassuring to see other people solving similar -problems in similar ways, but it was too late to integrate outside code: We'd -already written, tested and implemented our own framework bits in several -production settings -- and our own code met our needs delightfully. - -In most cases, however, we found that existing frameworks/tools inevitably had -some sort of fundamental, fatal flaw that made us squeamish. No tool fit our -philosophies 100%. - -Like we said: We're picky. - -We've documented our philosophies on the `design philosophies page`_. - -.. _design philosophies page: ../design_philosophies/ - -Do you have any of those nifty "screencast" things? ---------------------------------------------------- - -You can bet your bottom they're on the way. But, since we're still hammering -out a few points, we want to make sure they reflect the final state of things -at Django 1.0, not some intermediary step. In other words, we don't want to -spend a lot of energy creating screencasts yet, because Django APIs will shift. - -Is Django a content-management-system (CMS)? --------------------------------------------- - -No, Django is not a CMS, or any sort of "turnkey product" in and of itself. -It's a Web framework; it's a programming tool that lets you build Web sites. - -For example, it doesn't make much sense to compare Django to something like -Drupal_, because Django is something you use to *create* things like Drupal. - -Of course, Django's automatic admin site is fantastic and timesaving -- but -the admin site is one module of Django the framework. Furthermore, although -Django has special conveniences for building "CMS-y" apps, that doesn't mean -it's not just as appropriate for building "non-CMS-y" apps (whatever that -means!). - -.. _Drupal: http://drupal.org/ - -When will you release Django 1.0? ---------------------------------- - -See our `version one roadmap`_ for the detailed timeline. We're aiming for -September 2, 2008. - -.. _version one roadmap: http://code.djangoproject.com/wiki/VersionOneRoadmap - -How can I download the Django documentation to read it offline? ---------------------------------------------------------------- - -The Django docs are available in the ``docs`` directory of each Django tarball -release. These docs are in ReST (ReStructured Text) format, and each text file -corresponds to a Web page on the official Django site. - -Because the documentation is `stored in revision control`_, you can browse -documentation changes just like you can browse code changes. - -Technically, the docs on Django's site are generated from the latest development -versions of those ReST documents, so the docs on the Django site may offer more -information than the docs that come with the latest Django release. - -.. _stored in revision control: http://code.djangoproject.com/browser/django/trunk/docs - -Where can I find Django developers for hire? --------------------------------------------- - -Consult our `developers for hire page`_ for a list of Django developers who -would be happy to help you. - -You might also be interested in posting a job to http://djangogigs.com/ . -If you want to find Django-capable people in your local area, try -http://djangopeople.net/ . - -.. _developers for hire page: http://code.djangoproject.com/wiki/DevelopersForHire - -Installation questions -====================== - -How do I get started? ---------------------- - - #. `Download the code`_. - #. Install Django (read the `installation guide`_). - #. Walk through the tutorial_. - #. Check out the rest of the documentation_, and `ask questions`_ if you - run into trouble. - -.. _`Download the code`: http://www.djangoproject.com/download/ -.. _`installation guide`: ../install/ -.. _tutorial: ../tutorial01/ -.. _documentation: ../ -.. _ask questions: http://www.djangoproject.com/community/ - -How do I fix the "install a later version of setuptools" error? ---------------------------------------------------------------- - -Just run the ``ez_setup.py`` script in the Django distribution. - -What are Django's prerequisites? --------------------------------- - -Django requires Python_ 2.3 or later. No other Python libraries are required -for basic Django usage. - -For a development environment -- if you just want to experiment with Django -- -you don't need to have a separate Web server installed; Django comes with its -own lightweight development server. For a production environment, we recommend -`Apache 2`_ and mod_python_, although Django follows the WSGI_ spec, which -means it can run on a variety of server platforms. - -If you want to use Django with a database, which is probably the case, you'll -also need a database engine. PostgreSQL_ is recommended, because we're -PostgreSQL fans, and MySQL_, `SQLite 3`_, and Oracle_ are also supported. - -.. _Python: http://www.python.org/ -.. _Apache 2: http://httpd.apache.org/ -.. _mod_python: http://www.modpython.org/ -.. _WSGI: http://www.python.org/peps/pep-0333.html -.. _PostgreSQL: http://www.postgresql.org/ -.. _MySQL: http://www.mysql.com/ -.. _`SQLite 3`: http://www.sqlite.org/ -.. _Oracle: http://www.oracle.com/ - -Do I lose anything by using Python 2.3 versus newer Python versions, such as Python 2.5? ----------------------------------------------------------------------------------------- - -No. Django itself is guaranteed to work with any version of Python from 2.3 -and higher. - -If you use a Python version newer than 2.3, you will, of course, be able to -take advantage of newer Python features in your own code, along with the speed -improvements and other optimizations that have been made to the Python language -itself. But the Django framework itself should work equally well on 2.3 as it -does on 2.4 or 2.5. - -Do I have to use mod_python? ----------------------------- - -Although we recommend mod_python for production use, you don't have to use it, -thanks to the fact that Django uses an arrangement called WSGI_. Django can -talk to any WSGI-enabled server. Other non-mod_python deployment setups are -FastCGI, SCGI or AJP. See `How to use Django with FastCGI, SCGI or AJP`_ for -full information. - -Also, see the `server arrangements wiki page`_ for other deployment strategies. - -If you just want to play around and develop things on your local computer, use -the development Web server that comes with Django. Things should Just Work. - -.. _WSGI: http://www.python.org/peps/pep-0333.html -.. _How to use Django with FastCGI, SCGI or AJP: ../fastcgi/ -.. _server arrangements wiki page: http://code.djangoproject.com/wiki/ServerArrangements - -How do I install mod_python on Windows? ---------------------------------------- - - * For Python 2.4, grab mod_python from `win32 build of mod_python for - Python 2.4`_. - * For Python 2.4, check out this `Django on Windows howto`_. - * For Python 2.3, grab mod_python from http://www.modpython.org/ and read - `Running mod_python on Apache on Windows2000`_. - * Also, try this (not Windows-specific) `guide to getting mod_python - working`_. - -.. _`win32 build of mod_python for Python 2.4`: http://www.lehuen.com/nicolas/index.php/2005/02/21/39-win32-build-of-mod_python-314-for-python-24 -.. _`Django on Windows howto`: http://thinkhole.org/wp/django-on-windows/ -.. _`Running mod_python on Apache on Windows2000`: http://groups-beta.google.com/group/comp.lang.python/msg/139af8c83a5a9d4f -.. _`guide to getting mod_python working`: http://www.dscpl.com.au/articles/modpython-001.html - -Will Django run under shared hosting (like TextDrive or Dreamhost)? -------------------------------------------------------------------- - -See our `Django-friendly Web hosts`_ page. - -.. _`Django-friendly Web hosts`: http://code.djangoproject.com/wiki/DjangoFriendlyWebHosts - -Should I use the official version or development version? ---------------------------------------------------------- - -The Django developers improve Django every day and are pretty good about not -checking in broken code. We use the development code (from the Subversion -repository) directly on our servers, so we consider it stable. With that in -mind, we recommend that you use the latest development code, because it -generally contains more features and fewer bugs than the "official" releases. - -Using Django -============ - -Why do I get an error about importing DJANGO_SETTINGS_MODULE? -------------------------------------------------------------- - -Make sure that: - - * The environment variable DJANGO_SETTINGS_MODULE is set to a fully-qualified - Python module (i.e. "mysite.settings"). - - * Said module is on ``sys.path`` (``import mysite.settings`` should work). - - * The module doesn't contain syntax errors (of course). - - * If you're using mod_python but *not* using Django's request handler, - you'll need to work around a mod_python bug related to the use of - ``SetEnv``; before you import anything from Django you'll need to do - the following:: - - os.environ.update(req.subprocess_env) - - (where ``req`` is the mod_python request object). - -I can't stand your template language. Do I have to use it? ----------------------------------------------------------- - -We happen to think our template engine is the best thing since chunky bacon, -but we recognize that choosing a template language runs close to religion. -There's nothing about Django that requires using the template language, so -if you're attached to ZPT, Cheetah, or whatever, feel free to use those. - -Do I have to use your model/database layer? -------------------------------------------- - -Nope. Just like the template system, the model/database layer is decoupled from -the rest of the framework. - -The one exception is: If you use a different database library, you won't get to -use Django's automatically-generated admin site. That app is coupled to the -Django database layer. - -How do I use image and file fields? ------------------------------------ - -Using a ``FileField`` or an ``ImageField`` in a model takes a few steps: - - #. In your settings file, define ``MEDIA_ROOT`` as the full path to - a directory where you'd like Django to store uploaded files. (For - performance, these files are not stored in the database.) Define - ``MEDIA_URL`` as the base public URL of that directory. Make sure that - this directory is writable by the Web server's user account. - - #. Add the ``FileField`` or ``ImageField`` to your model, making sure - to define the ``upload_to`` option to tell Django to which subdirectory - of ``MEDIA_ROOT`` it should upload files. - - #. All that will be stored in your database is a path to the file - (relative to ``MEDIA_ROOT``). You'll most likely want to use the - convenience ``get_<fieldname>_url`` function provided by Django. For - example, if your ``ImageField`` is called ``mug_shot``, you can get the - absolute URL to your image in a template with - ``{{ object.get_mug_shot_url }}``. - -Databases and models -==================== - -How can I see the raw SQL queries Django is running? ----------------------------------------------------- - -Make sure your Django ``DEBUG`` setting is set to ``True``. Then, just do -this:: - - >>> from django.db import connection - >>> connection.queries - [{'sql': 'SELECT polls_polls.id,polls_polls.question,polls_polls.pub_date FROM polls_polls', - 'time': '0.002'}] - -``connection.queries`` is only available if ``DEBUG`` is ``True``. It's a list -of dictionaries in order of query execution. Each dictionary has the following:: - - ``sql`` -- The raw SQL statement - ``time`` -- How long the statement took to execute, in seconds. - -``connection.queries`` includes all SQL statements -- INSERTs, UPDATES, -SELECTs, etc. Each time your app hits the database, the query will be recorded. - -Can I use Django with a pre-existing database? ----------------------------------------------- - -Yes. See `Integrating with a legacy database`_. - -.. _`Integrating with a legacy database`: ../legacy_databases/ - -If I make changes to a model, how do I update the database? ------------------------------------------------------------ - -If you don't mind clearing data, your project's ``manage.py`` utility has an -option to reset the SQL for a particular application:: - - manage.py reset appname - -This drops any tables associated with ``appname`` and recreates them. - -If you do care about deleting data, you'll have to execute the ``ALTER TABLE`` -statements manually in your database. That's the way we've always done it, -because dealing with data is a very sensitive operation that we've wanted to -avoid automating. That said, there's some work being done to add partially -automated database-upgrade functionality. - -Do Django models support multiple-column primary keys? ------------------------------------------------------- - -No. Only single-column primary keys are supported. - -But this isn't an issue in practice, because there's nothing stopping you from -adding other constraints (using the ``unique_together`` model option or -creating the constraint directly in your database), and enforcing the -uniqueness at that level. Single-column primary keys are needed for things such -as the admin interface to work; e.g., you need a simple way of being able to -specify an object to edit or delete. - -How do I add database-specific options to my CREATE TABLE statements, such as specifying MyISAM as the table type? ------------------------------------------------------------------------------------------------------------------- - -We try to avoid adding special cases in the Django code to accommodate all the -database-specific options such as table type, etc. If you'd like to use any of -these options, create an `SQL initial data file`_ that contains ``ALTER TABLE`` -statements that do what you want to do. The initial data files are executed in -your database after the ``CREATE TABLE`` statements. - -For example, if you're using MySQL and want your tables to use the MyISAM table -type, create an initial data file and put something like this in it:: - - ALTER TABLE myapp_mytable ENGINE=MyISAM; - -As explained in the `SQL initial data file`_ documentation, this SQL file can -contain arbitrary SQL, so you can make any sorts of changes you need to make. - -.. _SQL initial data file: ../model-api/#providing-initial-sql-data - -Why is Django leaking memory? ------------------------------ - -Django isn't known to leak memory. If you find your Django processes are -allocating more and more memory, with no sign of releasing it, check to make -sure your ``DEBUG`` setting is set to ``True``. If ``DEBUG`` is ``True``, then -Django saves a copy of every SQL statement it has executed. - -(The queries are saved in ``django.db.connection.queries``. See -`How can I see the raw SQL queries Django is running?`_.) - -To fix the problem, set ``DEBUG`` to ``False``. - -If you need to clear the query list manually at any point in your functions, -just call ``reset_queries()``, like this:: - - from django import db - db.reset_queries() - -The admin site -============== - -I can't log in. When I enter a valid username and password, it just brings up the login page again, with no error messages. ---------------------------------------------------------------------------------------------------------------------------- - -The login cookie isn't being set correctly, because the domain of the cookie -sent out by Django doesn't match the domain in your browser. Try these two -things: - - * Set the ``SESSION_COOKIE_DOMAIN`` setting in your admin config file - to match your domain. For example, if you're going to - "http://www.mysite.com/admin/" in your browser, in - "myproject.settings" you should set ``SESSION_COOKIE_DOMAIN = 'www.mysite.com'``. - - * Some browsers (Firefox?) don't like to accept cookies from domains that - don't have dots in them. If you're running the admin site on "localhost" - or another domain that doesn't have a dot in it, try going to - "localhost.localdomain" or "127.0.0.1". And set - ``SESSION_COOKIE_DOMAIN`` accordingly. - -I can't log in. When I enter a valid username and password, it brings up the login page again, with a "Please enter a correct username and password" error. ------------------------------------------------------------------------------------------------------------------------------------------------------------ - -If you're sure your username and password are correct, make sure your user -account has ``is_active`` and ``is_staff`` set to True. The admin site only -allows access to users with those two fields both set to True. - -How can I prevent the cache middleware from caching the admin site? -------------------------------------------------------------------- - -Set the ``CACHE_MIDDLEWARE_ANONYMOUS_ONLY`` setting to ``True``. See the -`cache documentation`_ for more information. - -.. _cache documentation: ../cache/#the-per-site-cache - -How do I automatically set a field's value to the user who last edited the object in the admin? ------------------------------------------------------------------------------------------------ - -At this point, Django doesn't have an official way to do this. But it's an oft-requested -feature, so we're discussing how it can be implemented. The problem is we don't want to couple -the model layer with the admin layer with the request layer (to get the current user). It's a -tricky problem. - -One person hacked up a `solution that doesn't require patching Django`_, but note that it's an -unofficial solution, and there's no guarantee it won't break at some point. - -.. _solution that doesn't require patching Django: http://lukeplant.me.uk/blog.php?id=1107301634 - -How do I limit admin access so that objects can only be edited by the users who created them? ---------------------------------------------------------------------------------------------- - -See the answer to the previous question. - -My admin-site CSS and images showed up fine using the development server, but they're not displaying when using mod_python. ---------------------------------------------------------------------------------------------------------------------------- - -See `serving the admin files`_ in the "How to use Django with mod_python" -documentation. - -.. _serving the admin files: ../modpython/#serving-the-admin-files - -My "list_filter" contains a ManyToManyField, but the filter doesn't display. ----------------------------------------------------------------------------- - -Django won't bother displaying the filter for a ``ManyToManyField`` if there -are fewer than two related objects. - -For example, if your ``list_filter`` includes ``sites``, and there's only one -site in your database, it won't display a "Site" filter. In that case, -filtering by site would be meaningless. - -How can I customize the functionality of the admin interface? -------------------------------------------------------------- - -You've got several options. If you want to piggyback on top of an add/change -form that Django automatically generates, you can attach arbitrary JavaScript -modules to the page via the model's ``class Admin`` ``js`` parameter. That -parameter is a list of URLs, as strings, pointing to JavaScript modules that -will be included within the admin form via a ``<script>`` tag. - -If you want more flexibility than simply tweaking the auto-generated forms, -feel free to write custom views for the admin. The admin is powered by Django -itself, and you can write custom views that hook into the authentication -system, check permissions and do whatever else they need to do. - -If you want to customize the look-and-feel of the admin interface, read the -next question. - -The dynamically-generated admin site is ugly! How can I change it? ------------------------------------------------------------------- - -We like it, but if you don't agree, you can modify the admin site's -presentation by editing the CSS stylesheet and/or associated image files. The -site is built using semantic HTML and plenty of CSS hooks, so any changes you'd -like to make should be possible by editing the stylesheet. We've got a -`guide to the CSS used in the admin`_ to get you started. - -.. _`guide to the CSS used in the admin`: ../admin_css/ - -How do I create users without having to edit password hashes? -------------------------------------------------------------- - -If you'd like to use the admin site to create users, upgrade to the Django -development version, where this problem was fixed on Aug. 4, 2006. - -You can also use the Python API. See `creating users`_ for full info. - -.. _creating users: ../authentication/#creating-users - -Getting help -============ - -How do I do X? Why doesn't Y work? Where can I go to get help? --------------------------------------------------------------- - -If this FAQ doesn't contain an answer to your question, you might want to -try the `django-users mailing list`_. Feel free to ask any question related -to installing, using, or debugging Django. - -If you prefer IRC, the `#django IRC channel`_ on the Freenode IRC network is an -active community of helpful individuals who may be able to solve your problem. - -.. _`django-users mailing list`: http://groups.google.com/group/django-users -.. _`#django IRC channel`: irc://irc.freenode.net/django - -Why hasn't my message appeared on django-users? ------------------------------------------------ - -django-users_ has a lot of subscribers. This is good for the community, as -it means many people are available to contribute answers to questions. -Unfortunately, it also means that django-users_ is an attractive target for -spammers. - -In order to combat the spam problem, when you join the django-users_ mailing -list, we manually moderate the first message you send to the list. This means -that spammers get caught, but it also means that your first question to the -list might take a little longer to get answered. We apologize for any -inconvenience that this policy may cause. - -.. _django-users: http://groups.google.com/group/django-users - -Nobody on django-users answered my question! What should I do? --------------------------------------------------------------- - -Try making your question more specific, or provide a better example of your -problem. - -As with most open-source mailing lists, the folks on django-users_ are -volunteers. If nobody has answered your question, it may be because nobody -knows the answer, it may be because nobody can understand the question, or it -may be that everybody that can help is busy. One thing you might try is to ask -the question on IRC -- visit the `#django IRC channel`_ on the Freenode IRC -network. - -You might notice we have a second mailing list, called django-developers_ -- -but please don't e-mail support questions to this mailing list. This list is -for discussion of the development of Django itself. Asking a tech support -question there is considered quite impolite. - -.. _django-developers: http://groups.google.com/group/django-developers - -I think I've found a bug! What should I do? -------------------------------------------- - -Detailed instructions on how to handle a potential bug can be found in our -`Guide to contributing to Django`_. - -.. _`Guide to contributing to Django`: ../contributing/#reporting-bugs - -I think I've found a security problem! What should I do? --------------------------------------------------------- - -If you think you've found a security problem with Django, please send a message -to security@djangoproject.com. This is a private list only open to long-time, -highly trusted Django developers, and its archives are not publicly readable. - -Due to the sensitive nature of security issues, we ask that if you think you -have found a security problem, *please* don't send a message to one of the -public mailing lists. Django has a `policy for handling security issues`_; -while a defect is outstanding, we would like to minimize any damage that -could be inflicted through public knowledge of that defect. - -.. _`policy for handling security issues`: ../contributing/#reporting-security-issues - -Contributing code -================= - -How can I get started contributing code to Django? --------------------------------------------------- - -Thanks for asking! We've written an entire document devoted to this question. -It's titled `Contributing to Django`_. - -.. _`Contributing to Django`: ../contributing/ - -I submitted a bug fix in the ticket system several weeks ago. Why are you ignoring my patch? --------------------------------------------------------------------------------------------- - -Don't worry: We're not ignoring you! - -It's important to understand there is a difference between "a ticket is being -ignored" and "a ticket has not been attended to yet." Django's ticket system -contains hundreds of open tickets, of various degrees of impact on end-user -functionality, and Django's developers have to review and prioritize. - -On top of that: the people who work on Django are all volunteers. As a result, -the amount of time that we have to work on the framework is limited and will -vary from week to week depending on our spare time. If we're busy, we may not -be able to spend as much time on Django as we might want. - -Besides, if your feature request stands no chance of inclusion in Django, we -won't ignore it -- we'll just close the ticket. So if your ticket is still -open, it doesn't mean we're ignoring you; it just means we haven't had time to -look at it yet. diff --git a/docs/faq/admin.txt b/docs/faq/admin.txt new file mode 100644 index 0000000000..4701341747 --- /dev/null +++ b/docs/faq/admin.txt @@ -0,0 +1,103 @@ +.. _faq-admin: + +FAQ: The admin +============== + +I can't log in. When I enter a valid username and password, it just brings up the login page again, with no error messages. +--------------------------------------------------------------------------------------------------------------------------- + +The login cookie isn't being set correctly, because the domain of the cookie +sent out by Django doesn't match the domain in your browser. Try these two +things: + + * Set the ``SESSION_COOKIE_DOMAIN`` setting in your admin config file + to match your domain. For example, if you're going to + "http://www.example.com/admin/" in your browser, in + "myproject.settings" you should set ``SESSION_COOKIE_DOMAIN = 'www.example.com'``. + + * Some browsers (Firefox?) don't like to accept cookies from domains that + don't have dots in them. If you're running the admin site on "localhost" + or another domain that doesn't have a dot in it, try going to + "localhost.localdomain" or "127.0.0.1". And set + ``SESSION_COOKIE_DOMAIN`` accordingly. + +I can't log in. When I enter a valid username and password, it brings up the login page again, with a "Please enter a correct username and password" error. +----------------------------------------------------------------------------------------------------------------------------------------------------------- + +If you're sure your username and password are correct, make sure your user +account has ``is_active`` and ``is_staff`` set to True. The admin site only +allows access to users with those two fields both set to True. + +How can I prevent the cache middleware from caching the admin site? +------------------------------------------------------------------- + +Set the :setting:``CACHE_MIDDLEWARE_ANONYMOUS_ONLY`` setting to ``True``. See the +:ref:`cache documentation <topics-cache>` for more information. + +How do I automatically set a field's value to the user who last edited the object in the admin? +----------------------------------------------------------------------------------------------- + +At this point, Django doesn't have an official way to do this. But it's an oft-requested +feature, so we're discussing how it can be implemented. The problem is we don't want to couple +the model layer with the admin layer with the request layer (to get the current user). It's a +tricky problem. + +One person hacked up a `solution that doesn't require patching Django`_, but note that it's an +unofficial solution, and there's no guarantee it won't break at some point. + +.. _solution that doesn't require patching Django: http://lukeplant.me.uk/blog.php?id=1107301634 + +How do I limit admin access so that objects can only be edited by the users who created them? +--------------------------------------------------------------------------------------------- + +See the answer to the previous question. + +My admin-site CSS and images showed up fine using the development server, but they're not displaying when using mod_python. +--------------------------------------------------------------------------------------------------------------------------- + +See :ref:`serving the admin files <howto-deployment-modpython-serving-the-admin-files` +in the "How to use Django with mod_python" documentation. + +My "list_filter" contains a ManyToManyField, but the filter doesn't display. +---------------------------------------------------------------------------- + +Django won't bother displaying the filter for a ``ManyToManyField`` if there +are fewer than two related objects. + +For example, if your ``list_filter`` includes ``sites``, and there's only one +site in your database, it won't display a "Site" filter. In that case, +filtering by site would be meaningless. + +How can I customize the functionality of the admin interface? +------------------------------------------------------------- + +You've got several options. If you want to piggyback on top of an add/change +form that Django automatically generates, you can attach arbitrary JavaScript +modules to the page via the model's ``class Admin`` ``js`` parameter. That +parameter is a list of URLs, as strings, pointing to JavaScript modules that +will be included within the admin form via a ``<script>`` tag. + +If you want more flexibility than simply tweaking the auto-generated forms, +feel free to write custom views for the admin. The admin is powered by Django +itself, and you can write custom views that hook into the authentication +system, check permissions and do whatever else they need to do. + +If you want to customize the look-and-feel of the admin interface, read the +next question. + +The dynamically-generated admin site is ugly! How can I change it? +------------------------------------------------------------------ + +We like it, but if you don't agree, you can modify the admin site's +presentation by editing the CSS stylesheet and/or associated image files. The +site is built using semantic HTML and plenty of CSS hooks, so any changes you'd +like to make should be possible by editing the stylesheet. We've got a +:ref:`guide to the CSS used in the admin <obsolete-admin-css>` to get you started. + +How do I create users without having to edit password hashes? +------------------------------------------------------------- + +If you'd like to use the admin site to create users, upgrade to the Django +development version, where this problem was fixed on Aug. 4, 2006. + +You can also use the Python API. See :ref:`creating users <topics-auth-creating-users>` for full info. diff --git a/docs/faq/contributing.txt b/docs/faq/contributing.txt new file mode 100644 index 0000000000..9e6c46b6fc --- /dev/null +++ b/docs/faq/contributing.txt @@ -0,0 +1,30 @@ +.. _faq-contributing: + +FAQ: Contributing code +====================== + +How can I get started contributing code to Django? +-------------------------------------------------- + +Thanks for asking! We've written an entire document devoted to this question. +It's titled :ref:`Contributing to Django <internals-contributing>`. + +I submitted a bug fix in the ticket system several weeks ago. Why are you ignoring my patch? +-------------------------------------------------------------------------------------------- + +Don't worry: We're not ignoring you! + +It's important to understand there is a difference between "a ticket is being +ignored" and "a ticket has not been attended to yet." Django's ticket system +contains hundreds of open tickets, of various degrees of impact on end-user +functionality, and Django's developers have to review and prioritize. + +On top of that: the people who work on Django are all volunteers. As a result, +the amount of time that we have to work on the framework is limited and will +vary from week to week depending on our spare time. If we're busy, we may not +be able to spend as much time on Django as we might want. + +Besides, if your feature request stands no chance of inclusion in Django, we +won't ignore it -- we'll just close the ticket. So if your ticket is still +open, it doesn't mean we're ignoring you; it just means we haven't had time to +look at it yet. diff --git a/docs/faq/general.txt b/docs/faq/general.txt new file mode 100644 index 0000000000..346ddd643c --- /dev/null +++ b/docs/faq/general.txt @@ -0,0 +1,256 @@ +.. _faq-general: + +FAQ: General +============ + +Why does this project exist? +---------------------------- + +Django grew from a very practical need: World Online, a newspaper Web +operation, is responsible for building intensive Web applications on journalism +deadlines. In the fast-paced newsroom, World Online often has only a matter of +hours to take a complicated Web application from concept to public launch. + +At the same time, the World Online Web developers have consistently been +perfectionists when it comes to following best practices of Web development. + +In fall 2003, the World Online developers (Adrian Holovaty and Simon Willison) +ditched PHP and began using Python to develop its Web sites. As they built +intensive, richly interactive sites such as Lawrence.com, they began to extract +a generic Web development framework that let them build Web applications more +and more quickly. They tweaked this framework constantly, adding improvements +over two years. + +In summer 2005, World Online decided to open-source the resulting software, +Django. Django would not be possible without a whole host of open-source +projects -- `Apache`_, `Python`_, and `PostgreSQL`_ to name a few -- and we're +thrilled to be able to give something back to the open-source community. + +.. _Apache: http://httpd.apache.org/ +.. _Python: http://www.python.org/ +.. _PostgreSQL: http://www.postgresql.org/ + +What does "Django" mean, and how do you pronounce it? +----------------------------------------------------- + +Django is named after `Django Reinhardt`_, a gypsy jazz guitarist from the 1930s +to early 1950s. To this day, he's considered one of the best guitarists of all time. + +Listen to his music. You'll like it. + +Django is pronounced **JANG**-oh. Rhymes with FANG-oh. The "D" is silent. + +We've also recorded an `audio clip of the pronunciation`_. + +.. _Django Reinhardt: http://en.wikipedia.org/wiki/Django_Reinhardt +.. _audio clip of the pronunciation: http://red-bean.com/~adrian/django_pronunciation.mp3 + +Is Django stable? +----------------- + +Yes. World Online has been using Django for more than three years. Sites built +on Django have weathered traffic spikes of over one million hits an hour and a +number of Slashdottings. Yes, it's quite stable. + +Does Django scale? +------------------ + +Yes. Compared to development time, hardware is cheap, and so Django is +designed to take advantage of as much hardware as you can throw at it. + +Django uses a "shared-nothing" architecture, which means you can add hardware +at any level -- database servers, caching servers or Web/application servers. + +The framework cleanly separates components such as its database layer and +application layer. And it ships with a simple-yet-powerful +:ref:`cache framework <topics-cache>`. + +Who's behind this? +------------------ + +Django was developed at `World Online`_, the Web department of a newspaper in +Lawrence, Kansas, USA. + +`Adrian Holovaty`_ + Adrian is a Web developer with a background in journalism. He was lead + developer at World Online for 2.5 years, during which time Django was + developed and implemented on World Online's sites. Now he works for + washingtonpost.com building rich, database-backed information sites, and + continues to oversee Django development. He likes playing guitar (Django + Reinhardt style) and hacking on side projects such as `chicagocrime.org`_. + He lives in Chicago. + + On IRC, Adrian goes by ``adrian_h``. + +`Jacob Kaplan-Moss`_ + Jacob is a whipper-snapper from California who spends equal time coding and + cooking. He's lead developer at World Online and actively hacks on various + cool side projects. He's contributed to the Python-ObjC bindings and was + the first guy to figure out how to write Tivo apps in Python. Lately he's + been messing with Python on the PSP. He lives in Lawrence, Kansas. + + On IRC, Jacob goes by ``jacobkm``. + +`Simon Willison`_ + Simon is a well-respected Web developer from England. He had a one-year + internship at World Online, during which time he and Adrian developed + Django from scratch. The most enthusiastic Brit you'll ever meet, he's + passionate about best practices in Web development and has maintained a + well-read Web-development blog for years at http://simon.incutio.com. + He works for Yahoo UK, where he managed to score the title "Hacker Liason." + He lives in London. + + On IRC, Simon goes by ``SimonW``. + +`Wilson Miner`_ + Wilson's design-fu makes us all look like rock stars. By day, he's an + interactive designer for `Apple`_. Don't ask him what he's working on, or + he'll have to kill you. He lives in San Francisco. + + On IRC, Wilson goes by ``wilsonian``. + +.. _`World Online`: http://code.djangoproject.com/wiki/WorldOnline +.. _`Adrian Holovaty`: http://www.holovaty.com/ +.. _`washingtonpost.com`: http://www.washingtonpost.com/ +.. _`chicagocrime.org`: http://www.chicagocrime.org/ +.. _`Simon Willison`: http://simon.incutio.com/ +.. _`simon.incutio.com`: http://simon.incutio.com/ +.. _`Jacob Kaplan-Moss`: http://www.jacobian.org/ +.. _`Wilson Miner`: http://www.wilsonminer.com/ +.. _`Apple`: http://www.apple.com/ + +Which sites use Django? +----------------------- + +The Django wiki features a consistently growing `list of Django-powered sites`_. +Feel free to add your Django-powered site to the list. + +.. _list of Django-powered sites: http://code.djangoproject.com/wiki/DjangoPoweredSites + +.. _mtv: + +Django appears to be a MVC framework, but you call the Controller the "view", and the View the "template". How come you don't use the standard names? +----------------------------------------------------------------------------------------------------------------------------------------------------- + +Well, the standard names are debatable. + +In our interpretation of MVC, the "view" describes the data that gets presented +to the user. It's not necessarily *how* the data *looks*, but *which* data is +presented. The view describes *which data you see*, not *how you see it.* It's +a subtle distinction. + +So, in our case, a "view" is the Python callback function for a particular URL, +because that callback function describes which data is presented. + +Furthermore, it's sensible to separate content from presentation -- which is +where templates come in. In Django, a "view" describes which data is presented, +but a view normally delegates to a template, which describes *how* the data is +presented. + +Where does the "controller" fit in, then? In Django's case, it's probably the +framework itself: the machinery that sends a request to the appropriate view, +according to the Django URL configuration. + +If you're hungry for acronyms, you might say that Django is a "MTV" framework +-- that is, "model", "template", and "view." That breakdown makes much more +sense. + +At the end of the day, of course, it comes down to getting stuff done. And, +regardless of how things are named, Django gets stuff done in a way that's most +logical to us. + +<Framework X> does <feature Y> -- why doesn't Django? +----------------------------------------------------- + +We're well aware that there are other awesome Web frameworks out there, and +we're not averse to borrowing ideas where appropriate. However, Django was +developed precisely because we were unhappy with the status quo, so please be +aware that "because <Framework X> does it" is not going to be sufficient reason +to add a given feature to Django. + +Why did you write all of Django from scratch, instead of using other Python libraries? +-------------------------------------------------------------------------------------- + +When Django was originally written a couple of years ago, Adrian and Simon +spent quite a bit of time exploring the various Python Web frameworks +available. + +In our opinion, none of them were completely up to snuff. + +We're picky. You might even call us perfectionists. (With deadlines.) + +Over time, we stumbled across open-source libraries that did things we'd +already implemented. It was reassuring to see other people solving similar +problems in similar ways, but it was too late to integrate outside code: We'd +already written, tested and implemented our own framework bits in several +production settings -- and our own code met our needs delightfully. + +In most cases, however, we found that existing frameworks/tools inevitably had +some sort of fundamental, fatal flaw that made us squeamish. No tool fit our +philosophies 100%. + +Like we said: We're picky. + +We've documented our philosophies on the +:ref:`design philosophies page <misc-design-philosophies>`. + +Do you have any of those nifty "screencast" things? +--------------------------------------------------- + +You can bet your bottom they're on the way. But, since we're still hammering +out a few points, we want to make sure they reflect the final state of things +at Django 1.0, not some intermediary step. In other words, we don't want to +spend a lot of energy creating screencasts yet, because Django APIs will shift. + +Is Django a content-management-system (CMS)? +-------------------------------------------- + +No, Django is not a CMS, or any sort of "turnkey product" in and of itself. +It's a Web framework; it's a programming tool that lets you build Web sites. + +For example, it doesn't make much sense to compare Django to something like +Drupal_, because Django is something you use to *create* things like Drupal. + +Of course, Django's automatic admin site is fantastic and timesaving -- but +the admin site is one module of Django the framework. Furthermore, although +Django has special conveniences for building "CMS-y" apps, that doesn't mean +it's not just as appropriate for building "non-CMS-y" apps (whatever that +means!). + +.. _Drupal: http://drupal.org/ + +When will you release Django 1.0? +--------------------------------- + +See our `version one roadmap`_ for the detailed timeline. We're aiming for +September 2, 2008. + +.. _version one roadmap: http://code.djangoproject.com/wiki/VersionOneRoadmap + +How can I download the Django documentation to read it offline? +--------------------------------------------------------------- + +The Django docs are available in the ``docs`` directory of each Django tarball +release. These docs are in ReST (ReStructured Text) format, and each text file +corresponds to a Web page on the official Django site. + +Because the documentation is `stored in revision control`_, you can browse +documentation changes just like you can browse code changes. + +Technically, the docs on Django's site are generated from the latest development +versions of those ReST documents, so the docs on the Django site may offer more +information than the docs that come with the latest Django release. + +.. _stored in revision control: http://code.djangoproject.com/browser/django/trunk/docs + +Where can I find Django developers for hire? +-------------------------------------------- + +Consult our `developers for hire page`_ for a list of Django developers who +would be happy to help you. + +You might also be interested in posting a job to http://djangogigs.com/ . +If you want to find Django-capable people in your local area, try +http://djangopeople.net/ . + +.. _developers for hire page: http://code.djangoproject.com/wiki/DevelopersForHire diff --git a/docs/faq/help.txt b/docs/faq/help.txt new file mode 100644 index 0000000000..5d7faf6fec --- /dev/null +++ b/docs/faq/help.txt @@ -0,0 +1,75 @@ +.. _faq-help: + +FAQ: Getting Help +================= + +How do I do X? Why doesn't Y work? Where can I go to get help? +-------------------------------------------------------------- + +If this FAQ doesn't contain an answer to your question, you might want to +try the `django-users mailing list`_. Feel free to ask any question related +to installing, using, or debugging Django. + +If you prefer IRC, the `#django IRC channel`_ on the Freenode IRC network is an +active community of helpful individuals who may be able to solve your problem. + +.. _`django-users mailing list`: http://groups.google.com/group/django-users +.. _`#django IRC channel`: irc://irc.freenode.net/django + +Why hasn't my message appeared on django-users? +----------------------------------------------- + +django-users_ has a lot of subscribers. This is good for the community, as +it means many people are available to contribute answers to questions. +Unfortunately, it also means that django-users_ is an attractive target for +spammers. + +In order to combat the spam problem, when you join the django-users_ mailing +list, we manually moderate the first message you send to the list. This means +that spammers get caught, but it also means that your first question to the +list might take a little longer to get answered. We apologize for any +inconvenience that this policy may cause. + +.. _django-users: http://groups.google.com/group/django-users + +Nobody on django-users answered my question! What should I do? +-------------------------------------------------------------- + +Try making your question more specific, or provide a better example of your +problem. + +As with most open-source mailing lists, the folks on django-users_ are +volunteers. If nobody has answered your question, it may be because nobody +knows the answer, it may be because nobody can understand the question, or it +may be that everybody that can help is busy. One thing you might try is to ask +the question on IRC -- visit the `#django IRC channel`_ on the Freenode IRC +network. + +You might notice we have a second mailing list, called django-developers_ -- +but please don't e-mail support questions to this mailing list. This list is +for discussion of the development of Django itself. Asking a tech support +question there is considered quite impolite. + +.. _django-developers: http://groups.google.com/group/django-developers + +I think I've found a bug! What should I do? +------------------------------------------- + +Detailed instructions on how to handle a potential bug can be found in our +:ref:`Guide to contributing to Django <reporting-bugs>`. + +I think I've found a security problem! What should I do? +-------------------------------------------------------- + +If you think you've found a security problem with Django, please send a message +to security@djangoproject.com. This is a private list only open to long-time, +highly trusted Django developers, and its archives are not publicly readable. + +Due to the sensitive nature of security issues, we ask that if you think you +have found a security problem, *please* don't send a message to one of the +public mailing lists. Django has a +:ref:`policy for handling security issues <reporting-security-issues>`; +while a defect is outstanding, we would like to minimize any damage that +could be inflicted through public knowledge of that defect. + +.. _`policy for handling security issues`: ../contributing/#reporting-security-issues diff --git a/docs/faq/index.txt b/docs/faq/index.txt new file mode 100644 index 0000000000..d357a3ebb0 --- /dev/null +++ b/docs/faq/index.txt @@ -0,0 +1,16 @@ +.. _faq-index: + +========== +Django FAQ +========== + +.. toctree:: + :maxdepth: 2 + + general + install + usage + help + models + admin + contributing \ No newline at end of file diff --git a/docs/faq/install.txt b/docs/faq/install.txt new file mode 100644 index 0000000000..a6b7742b2f --- /dev/null +++ b/docs/faq/install.txt @@ -0,0 +1,108 @@ +.. _faq-install: + +FAQ: Installation +================= + +How do I get started? +--------------------- + + #. `Download the code`_. + #. Install Django (read the :ref:`installation guide <intro-install>`). + #. Walk through the :ref:`tutorial <intro-tutorial01>`. + #. Check out the rest of the :ref:`documentation <index>`, and `ask questions`_ if you + run into trouble. + +.. _`Download the code`: http://www.djangoproject.com/download/ +.. _ask questions: http://www.djangoproject.com/community/ + +How do I fix the "install a later version of setuptools" error? +--------------------------------------------------------------- + +Just run the ``ez_setup.py`` script in the Django distribution. + +What are Django's prerequisites? +-------------------------------- + +Django requires Python_ 2.3 or later. No other Python libraries are required +for basic Django usage. + +For a development environment -- if you just want to experiment with Django -- +you don't need to have a separate Web server installed; Django comes with its +own lightweight development server. For a production environment, we recommend +`Apache 2`_ and mod_python_, although Django follows the WSGI_ spec, which +means it can run on a variety of server platforms. + +If you want to use Django with a database, which is probably the case, you'll +also need a database engine. PostgreSQL_ is recommended, because we're +PostgreSQL fans, and MySQL_, `SQLite 3`_, and Oracle_ are also supported. + +.. _Python: http://www.python.org/ +.. _Apache 2: http://httpd.apache.org/ +.. _mod_python: http://www.modpython.org/ +.. _WSGI: http://www.python.org/peps/pep-0333.html +.. _PostgreSQL: http://www.postgresql.org/ +.. _MySQL: http://www.mysql.com/ +.. _`SQLite 3`: http://www.sqlite.org/ +.. _Oracle: http://www.oracle.com/ + +Do I lose anything by using Python 2.3 versus newer Python versions, such as Python 2.5? +---------------------------------------------------------------------------------------- + +No. Django itself is guaranteed to work with any version of Python from 2.3 +and higher. + +If you use a Python version newer than 2.3, you will, of course, be able to +take advantage of newer Python features in your own code, along with the speed +improvements and other optimizations that have been made to the Python language +itself. But the Django framework itself should work equally well on 2.3 as it +does on 2.4 or 2.5. + +Do I have to use mod_python? +---------------------------- + +Although we recommend mod_python for production use, you don't have to use it, +thanks to the fact that Django uses an arrangement called WSGI_. Django can +talk to any WSGI-enabled server. Other non-mod_python deployment setups are +FastCGI, SCGI or AJP. See +:ref:`How to use Django with FastCGI, SCGI or AJP <howto-deployment-fastcgi>` +for full information. + +Also, see the `server arrangements wiki page`_ for other deployment strategies. + +If you just want to play around and develop things on your local computer, use +the development Web server that comes with Django. Things should Just Work. + +.. _WSGI: http://www.python.org/peps/pep-0333.html +.. _server arrangements wiki page: http://code.djangoproject.com/wiki/ServerArrangements + +How do I install mod_python on Windows? +--------------------------------------- + + * For Python 2.4, grab mod_python from `win32 build of mod_python for + Python 2.4`_. + * For Python 2.4, check out this `Django on Windows howto`_. + * For Python 2.3, grab mod_python from http://www.modpython.org/ and read + `Running mod_python on Apache on Windows2000`_. + * Also, try this (not Windows-specific) `guide to getting mod_python + working`_. + +.. _`win32 build of mod_python for Python 2.4`: http://www.lehuen.com/nicolas/index.php/2005/02/21/39-win32-build-of-mod_python-314-for-python-24 +.. _`Django on Windows howto`: http://thinkhole.org/wp/django-on-windows/ +.. _`Running mod_python on Apache on Windows2000`: http://groups-beta.google.com/group/comp.lang.python/msg/139af8c83a5a9d4f +.. _`guide to getting mod_python working`: http://www.dscpl.com.au/articles/modpython-001.html + +Will Django run under shared hosting (like TextDrive or Dreamhost)? +------------------------------------------------------------------- + +See our `Django-friendly Web hosts`_ page. + +.. _`Django-friendly Web hosts`: http://code.djangoproject.com/wiki/DjangoFriendlyWebHosts + +Should I use the official version or development version? +--------------------------------------------------------- + +The Django developers improve Django every day and are pretty good about not +checking in broken code. We use the development code (from the Subversion +repository) directly on our servers, so we consider it stable. With that in +mind, we recommend that you use the latest development code, because it +generally contains more features and fewer bugs than the "official" releases. diff --git a/docs/faq/models.txt b/docs/faq/models.txt new file mode 100644 index 0000000000..4a33914ec9 --- /dev/null +++ b/docs/faq/models.txt @@ -0,0 +1,94 @@ +.. _faq-models: + +FAQ: Databases and models +========================= + +How can I see the raw SQL queries Django is running? +---------------------------------------------------- + +Make sure your Django ``DEBUG`` setting is set to ``True``. Then, just do +this:: + + >>> from django.db import connection + >>> connection.queries + [{'sql': 'SELECT polls_polls.id,polls_polls.question,polls_polls.pub_date FROM polls_polls', + 'time': '0.002'}] + +``connection.queries`` is only available if ``DEBUG`` is ``True``. It's a list +of dictionaries in order of query execution. Each dictionary has the following:: + + ``sql`` -- The raw SQL statement + ``time`` -- How long the statement took to execute, in seconds. + +``connection.queries`` includes all SQL statements -- INSERTs, UPDATES, +SELECTs, etc. Each time your app hits the database, the query will be recorded. + +Can I use Django with a pre-existing database? +---------------------------------------------- + +Yes. See :ref:`Integrating with a legacy database <howto-legacy-databases>`. + +If I make changes to a model, how do I update the database? +----------------------------------------------------------- + +If you don't mind clearing data, your project's ``manage.py`` utility has an +option to reset the SQL for a particular application:: + + manage.py reset appname + +This drops any tables associated with ``appname`` and recreates them. + +If you do care about deleting data, you'll have to execute the ``ALTER TABLE`` +statements manually in your database. That's the way we've always done it, +because dealing with data is a very sensitive operation that we've wanted to +avoid automating. That said, there's some work being done to add partially +automated database-upgrade functionality. + +Do Django models support multiple-column primary keys? +------------------------------------------------------ + +No. Only single-column primary keys are supported. + +But this isn't an issue in practice, because there's nothing stopping you from +adding other constraints (using the ``unique_together`` model option or +creating the constraint directly in your database), and enforcing the +uniqueness at that level. Single-column primary keys are needed for things such +as the admin interface to work; e.g., you need a simple way of being able to +specify an object to edit or delete. + +How do I add database-specific options to my CREATE TABLE statements, such as specifying MyISAM as the table type? +------------------------------------------------------------------------------------------------------------------ + +We try to avoid adding special cases in the Django code to accommodate all the +database-specific options such as table type, etc. If you'd like to use any of +these options, create an :ref:`SQL initial data file <initial-sql>` that +contains ``ALTER TABLE`` statements that do what you want to do. The initial +data files are executed in your database after the ``CREATE TABLE`` statements. + +For example, if you're using MySQL and want your tables to use the MyISAM table +type, create an initial data file and put something like this in it:: + + ALTER TABLE myapp_mytable ENGINE=MyISAM; + +As explained in the :ref:`SQL initial data file <initial-sql>` documentation, +this SQL file can contain arbitrary SQL, so you can make any sorts of changes +you need to make. + +Why is Django leaking memory? +----------------------------- + +Django isn't known to leak memory. If you find your Django processes are +allocating more and more memory, with no sign of releasing it, check to make +sure your ``DEBUG`` setting is set to ``True``. If ``DEBUG`` is ``True``, then +Django saves a copy of every SQL statement it has executed. + +(The queries are saved in ``django.db.connection.queries``. See +`How can I see the raw SQL queries Django is running?`_.) + +To fix the problem, set ``DEBUG`` to ``False``. + +If you need to clear the query list manually at any point in your functions, +just call ``reset_queries()``, like this:: + + from django import db + db.reset_queries() diff --git a/docs/faq/usage.txt b/docs/faq/usage.txt new file mode 100644 index 0000000000..67565a5807 --- /dev/null +++ b/docs/faq/usage.txt @@ -0,0 +1,65 @@ +.. _faq-usage: + +FAQ: Using Django +================= + +Why do I get an error about importing DJANGO_SETTINGS_MODULE? +------------------------------------------------------------- + +Make sure that: + + * The environment variable DJANGO_SETTINGS_MODULE is set to a fully-qualified + Python module (i.e. "mysite.settings"). + + * Said module is on ``sys.path`` (``import mysite.settings`` should work). + + * The module doesn't contain syntax errors (of course). + + * If you're using mod_python but *not* using Django's request handler, + you'll need to work around a mod_python bug related to the use of + ``SetEnv``; before you import anything from Django you'll need to do + the following:: + + os.environ.update(req.subprocess_env) + + (where ``req`` is the mod_python request object). + +I can't stand your template language. Do I have to use it? +---------------------------------------------------------- + +We happen to think our template engine is the best thing since chunky bacon, +but we recognize that choosing a template language runs close to religion. +There's nothing about Django that requires using the template language, so +if you're attached to ZPT, Cheetah, or whatever, feel free to use those. + +Do I have to use your model/database layer? +------------------------------------------- + +Nope. Just like the template system, the model/database layer is decoupled from +the rest of the framework. + +The one exception is: If you use a different database library, you won't get to +use Django's automatically-generated admin site. That app is coupled to the +Django database layer. + +How do I use image and file fields? +----------------------------------- + +Using a ``FileField`` or an ``ImageField`` in a model takes a few steps: + + #. In your settings file, define ``MEDIA_ROOT`` as the full path to + a directory where you'd like Django to store uploaded files. (For + performance, these files are not stored in the database.) Define + ``MEDIA_URL`` as the base public URL of that directory. Make sure that + this directory is writable by the Web server's user account. + + #. Add the ``FileField`` or ``ImageField`` to your model, making sure + to define the ``upload_to`` option to tell Django to which subdirectory + of ``MEDIA_ROOT`` it should upload files. + + #. All that will be stored in your database is a path to the file + (relative to ``MEDIA_ROOT``). You'll most likely want to use the + convenience ``get_<fieldname>_url`` function provided by Django. For + example, if your ``ImageField`` is called ``mug_shot``, you can get the + absolute URL to your image in a template with + ``{{ object.get_mug_shot_url }}``. diff --git a/docs/files.txt b/docs/files.txt deleted file mode 100644 index 29b13a78a9..0000000000 --- a/docs/files.txt +++ /dev/null @@ -1,388 +0,0 @@ -============== -Managing files -============== - -**New in Django development version** - -This document describes Django's file access APIs. - -By default, Django stores files locally, using the ``MEDIA_ROOT`` and -``MEDIA_URL`` settings_. The examples below assume that you're using -these defaults. - -However, Django provides ways to write custom `file storage systems`_ that -allow you to completely customize where and how Django stores files. The -second half of this document describes how these storage systems work. - -.. _file storage systems: `File storage`_ -.. _settings: ../settings/ - -Using files in models -===================== - -When you use a `FileField`_ or `ImageField`_, Django provides a set of APIs you can use to deal with that file. - -.. _filefield: ../model-api/#filefield -.. _imagefield: ../model-api/#imagefield - -Consider the following model, using a ``FileField`` to store a photo:: - - class Car(models.Model): - name = models.CharField(max_length=255) - price = models.DecimalField(max_digits=5, decimal_places=2) - photo = models.ImageField(upload_to='cars') - -Any ``Car`` instance will have a ``photo`` attribute that you can use to get at -the details of the attached photo:: - - >>> car = Car.object.get(name="57 Chevy") - >>> car.photo - <ImageFieldFile: chevy.jpg> - >>> car.photo.name - u'chevy.jpg' - >>> car.photo.path - u'/media/cars/chevy.jpg' - >>> car.photo.url - u'http://media.example.com/cars/chevy.jpg' - -This object -- ``car.photo`` in the example -- is a ``File`` object, which means -it has all the methods and attributes described below. - -The ``File`` object -=================== - -Internally, Django uses a ``django.core.files.File`` any time it needs to -represent a file. This object is a thin wrapper around Python's `built-in file -object`_ with some Django-specific additions. - -.. _built-in file object: http://docs.python.org/lib/bltin-file-objects.html - -Creating ``File`` instances ---------------------------- - -Most of the time you'll simply use a ``File`` that Django's given you (i.e. a -file attached to a model as above, or perhaps an `uploaded file`_). - -.. _uploaded file: ../upload_handling/ - -If you need to construct a ``File`` yourself, the easiest way is to create one -using a Python built-in ``file`` object:: - - >>> from django.core.files import File - - # Create a Python file object using open() - >>> f = open('/tmp/hello.world', 'w') - >>> myfile = File(f) - -Now you can use any of the ``File`` attributes and methods defined below. - -``File`` attributes and methods -------------------------------- - -Django's ``File`` has the following attributes and methods: - -``File.path`` -~~~~~~~~~~~~~ - -The absolute path to the file's location on a local filesystem. - -Custom `file storage systems`_ may not store files locally; files stored on -these systems will have a ``path`` of ``None``. - -``File.url`` -~~~~~~~~~~~~ - -The URL where the file can be retrieved. This is often useful in templates_; for -example, a bit of a template for displaying a ``Car`` (see above) might look -like:: - - <img src='{{ car.photo.url }}' alt='{{ car.name }}' /> - -.. _templates: ../templates/ - -``File.size`` -~~~~~~~~~~~~~ - -The size of the file in bytes. - -``File.open(mode=None)`` -~~~~~~~~~~~~~~~~~~~~~~~~ - -Open or reopen the file (which by definition also does ``File.seek(0)``). The -``mode`` argument allows the same values as Python's standard ``open()``. - -When reopening a file, ``mode`` will override whatever mode the file was -originally opened with; ``None`` means to reopen with the original mode. - -``File.read(num_bytes=None)`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Read content from the file. The optional ``size`` is the number of bytes to -read; if not specified, the file will be read to the end. - -``File.__iter__()`` -~~~~~~~~~~~~~~~~~~~ - -Iterate over the file yielding one line at a time. - -``File.chunks(chunk_size=None)`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Iterate over the file yielding "chunks" of a given size. ``chunk_size`` defaults -to 64 KB. - -This is especially useful with very large files since it allows them to be -streamed off disk and avoids storing the whole file in memory. - -``File.multiple_chunks(chunk_size=None)`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Returns ``True`` if the file is large enough to require multiple chunks to -access all of its content give some ``chunk_size``. - -``File.write(content)`` -~~~~~~~~~~~~~~~~~~~~~~~ - -Writes the specified content string to the file. Depending on the storage system -behind the scenes, this content might not be fully committed until ``close()`` -is called on the file. - -``File.close()`` -~~~~~~~~~~~~~~~~ - -Close the file. - -.. TODO: document the rest of the File methods. - -Additional ``ImageField`` attributes ------------------------------------- - -``File.width`` and ``File.height`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -These attributes provide the dimensions of the image. - -Additional methods on files attached to objects ------------------------------------------------ - -Any ``File`` that's associated with an object (as with ``Car.photo``, above) -will also have a couple of extra methods: - -``File.save(name, content, save=True)`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Saves a new file with the file name and contents provided. This will not replace -the existing file, but will create a new file and update the object to point to -it. If ``save`` is ``True``, the model's ``save()`` method will be called once -the file is saved. That is, these two lines:: - - >>> car.photo.save('myphoto.jpg', contents, save=False) - >>> car.save() - -are the same as this one line:: - - >>> car.photo.save('myphoto.jpg', contents, save=True) - -``File.delete(save=True)`` -~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Remove the file from the model instance and delete the underlying file. The -``save`` argument works as above. - -File storage -============ - -Behind the scenes, Django delegates decisions about how and where to store files -to a file storage system. This is the object that actually understands things -like file systems, opening and reading files, etc. - -Django's default file storage is given by the `DEFAULT_FILE_STORAGE setting`_; -if you don't explicitly provide a storage system, this is the one that will be -used. - -.. _default_file_storage setting: ../settings/#default-file-storage - -The built-in filesystem storage class -------------------------------------- - -Django ships with a built-in ``FileSystemStorage`` class (defined in -``django.core.files.storage``) which implements basic local filesystem file -storage. Its initializer takes two arguments: - -====================== =================================================== -Argument Description -====================== =================================================== -``location`` Optional. Absolute path to the directory that will - hold the files. If omitted, it will be set to the - value of your ``MEDIA_ROOT`` setting. -``base_url`` Optional. URL that serves the files stored at this - location. If omitted, it will default to the value - of your ``MEDIA_URL`` setting. -====================== =================================================== - -For example, the following code will store uploaded files under -``/media/photos`` regardless of what your ``MEDIA_ROOT`` setting is:: - - from django.db import models - from django.core.files.storage import FileSystemStorage - - fs = FileSystemStorage(location='/media/photos') - - class Car(models.Model): - ... - photo = models.ImageField(storage=fs) - -`Custom storage systems`_ work the same way: you can pass them in as the -``storage`` argument to a ``FileField``. - -.. _custom storage systems: `writing a custom storage system`_ - -Storage objects ---------------- - -Though most of the time you'll want to use a ``File`` object (which delegates to -the proper storage for that file), you can use file storage systems directly. -You can create an instance of some custom file storage class, or -- often more -useful -- you can use the global default storage system:: - - >>> from django.core.files.storage import default_storage - - >>> path = default_storage.save('/path/to/file', 'new content') - >>> path - u'/path/to/file' - - >>> default_storage.filesize(path) - 11 - >>> default_storage.open(path).read() - 'new content' - - >>> default_storage.delete(path) - >>> default_storage.exists(path) - False - -Storage objects define the following methods: - -``Storage.exists(name)`` -~~~~~~~~~~~~~~~~~~~~~~~~ - -``True`` if a file exists given some ``name``. - -``Storage.path(name)`` -~~~~~~~~~~~~~~~~~~~~~~ - -The local filesystem path where the file can be opened using Python's standard -``open()``. For storage systems that aren't accessible from the local -filesystem, this will raise ``NotImplementedError`` instead. - -``Storage.size(name)`` -~~~~~~~~~~~~~~~~~~~~~~ - -Returns the total size, in bytes, of the file referenced by ``name``. - -``Storage.url(name)`` -~~~~~~~~~~~~~~~~~~~~~ - -Returns the URL where the contents of the file referenced by ``name`` can be -accessed. - -``Storage.open(name, mode='rb')`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Opens the file given by ``name``. Note that although the returned file is -guaranteed to be a ``File`` object, it might actually be some subclass. In the -case of remote file storage this means that reading/writing could be quite slow, -so be warned. - -``Storage.save(name, content)`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Saves a new file using the storage system, preferably with the name specified. -If there already exists a file with this name ``name``, the storage system may -modify the filename as necessary to get a unique name. The actual name of the -stored file will be returned. - -``Storage.delete(name)`` -~~~~~~~~~~~~~~~~~~~~~~~~ - -Deletes the file referenced by ``name``. This method won't raise an exception if -the file doesn't exist. - -Writing a custom storage system -=============================== - -If you need to provide custom file storage -- a common example is storing files -on some remote system -- you can do so by defining a custom storage class. -You'll need to follow these steps: - -#. Your custom storage system must be a subclass of - ``django.core.files.storage.Storage``:: - - from django.core.files.storage import Storage - - class MyStorage(Storage): - ... - -#. Django must be able to instantiate your storage system without any arguments. - This means that any settings should be taken from ``django.conf.settings``:: - - from django.conf import settings - from django.core.files.storage import Storage - - class MyStorage(Storage): - def __init__(self, option=None): - if not option: - option = settings.CUSTOM_STORAGE_OPTIONS - ... - -#. Your storage class must implement the ``_open()`` and ``_save()`` methods, - along with any other methods appropriate to your storage class. See below for - more on these methods. - - In addition, if your class provides local file storage, it must override - the ``path()`` method. - -Custom storage system methods ------------------------------ - -Your custom storage system may override any of the storage methods explained -above in `storage objects`_. However, it's usually better to use the hooks -specifically designed for custom storage objects. These are: - -``_open(name, mode='rb')`` -~~~~~~~~~~~~~~~~~~~~~~~~~~ - -**Required**. - -Called by ``Storage.open()``, this is the actual mechanism the storage class -uses to open the file. This must return a ``File`` object, though in most cases, -you'll want to return some subclass here that implements logic specific to the -backend storage system. - -``_save(name, content)`` -~~~~~~~~~~~~~~~~~~~~~~~~ - -Called by ``Storage.save()``. The ``name`` will already have gone through -``get_valid_name()`` and ``get_available_name()``, and the ``content`` will be a -``File`` object itself. No return value is expected. - -``get_valid_name(name)`` ------------------------- - -Returns a filename suitable for use with the underlying storage system. The -``name`` argument passed to this method is the original filename sent to the -server, after having any path information removed. Override this to customize -how non-standard characters are converted to safe filenames. - -The code provided on ``Storage`` retains only alpha-numeric characters, periods -and underscores from the original filename, removing everything else. - -``get_available_name(name)`` ----------------------------- - -Returns a filename that is available in the storage mechanism, possibly taking -the provided filename into account. The ``name`` argument passed to this method -will have already cleaned to a filename valid for the storage system, according -to the ``get_valid_name()`` method described above. - -The code provided on ``Storage`` simply appends underscores to the filename -until it finds one that's available in the destination directory. diff --git a/docs/form_preview.txt b/docs/form_preview.txt deleted file mode 100644 index 171174704c..0000000000 --- a/docs/form_preview.txt +++ /dev/null @@ -1,95 +0,0 @@ -============ -Form preview -============ - -Django comes with an optional "form preview" application that helps automate -the following workflow: - -"Display an HTML form, force a preview, then do something with the submission." - -To force a preview of a form submission, all you have to do is write a short -Python class. - -Overview -========= - -Given a ``django.forms.Form`` subclass that you define, this application -takes care of the following workflow: - - 1. Displays the form as HTML on a Web page. - 2. Validates the form data when it's submitted via POST. - a. If it's valid, displays a preview page. - b. If it's not valid, redisplays the form with error messages. - 3. When the "confirmation" form is submitted from the preview page, calls - a hook that you define -- a ``done()`` method that gets passed the valid - data. - -The framework enforces the required preview by passing a shared-secret hash to -the preview page via hidden form fields. If somebody tweaks the form parameters -on the preview page, the form submission will fail the hash-comparison test. - -How to use ``FormPreview`` -========================== - - 1. Point Django at the default FormPreview templates. There are two ways to - do this: - - * Add ``'django.contrib.formtools'`` to your ``INSTALLED_APPS`` - setting. This will work if your ``TEMPLATE_LOADERS`` setting includes - the ``app_directories`` template loader (which is the case by - default). See the `template loader docs`_ for more. - - * Otherwise, determine the full filesystem path to the - ``django/contrib/formtools/templates`` directory, and add that - directory to your ``TEMPLATE_DIRS`` setting. - - 2. Create a ``FormPreview`` subclass that overrides the ``done()`` method:: - - from django.contrib.formtools.preview import FormPreview - from myapp.models import SomeModel - - class SomeModelFormPreview(FormPreview): - - def done(self, request, cleaned_data): - # Do something with the cleaned_data, then redirect - # to a "success" page. - return HttpResponseRedirect('/form/success') - - This method takes an ``HttpRequest`` object and a dictionary of the form - data after it has been validated and cleaned. It should return an - ``HttpResponseRedirect`` that is the end result of the form being - submitted. - - 3. Change your URLconf to point to an instance of your ``FormPreview`` - subclass:: - - from myapp.preview import SomeModelFormPreview - from myapp.models import SomeModel - from django import forms - - ...and add the following line to the appropriate model in your URLconf:: - - (r'^post/$', SomeModelFormPreview(SomeModelForm)), - - where ``SomeModelForm`` is a Form or ModelForm class for the model. - - 4. Run the Django server and visit ``/post/`` in your browser. - -.. _template loader docs: ../templates_python/#loader-types - -``FormPreview`` classes -======================= - -A ``FormPreview`` class is a simple Python class that represents the preview -workflow. ``FormPreview`` classes must subclass -``django.contrib.formtools.preview.FormPreview`` and override the ``done()`` -method. They can live anywhere in your codebase. - -``FormPreview`` templates -========================= - -By default, the form is rendered via the template ``formtools/form.html``, and -the preview page is rendered via the template ``formtools.preview.html``. -These values can be overridden for a particular form preview by setting -``preview_template`` and ``form_template`` attributes on the FormPreview -subclass. See ``django/contrib/formtools/templates`` for the default templates. diff --git a/docs/form_wizard.txt b/docs/form_wizard.txt deleted file mode 100644 index 661127e5b0..0000000000 --- a/docs/form_wizard.txt +++ /dev/null @@ -1,304 +0,0 @@ -=========== -Form wizard -=========== - -**New in Django development version.** - -Django comes with an optional "form wizard" application that splits forms_ -across multiple Web pages. It maintains state in hashed HTML -``<input type="hidden">`` fields, and the data isn't processed server-side -until the final form is submitted. - -You might want to use this if you have a lengthy form that would be too -unwieldy for display on a single page. The first page might ask the user for -core information, the second page might ask for less important information, -etc. - -The term "wizard," in this context, is `explained on Wikipedia`_. - -.. _explained on Wikipedia: http://en.wikipedia.org/wiki/Wizard_%28software%29 -.. _forms: ../forms/ - -How it works -============ - -Here's the basic workflow for how a user would use a wizard: - - 1. The user visits the first page of the wizard, fills in the form and - submits it. - 2. The server validates the data. If it's invalid, the form is displayed - again, with error messages. If it's valid, the server calculates a - secure hash of the data and presents the user with the next form, - saving the validated data and hash in ``<input type="hidden">`` fields. - 3. Step 1 and 2 repeat, for every subsequent form in the wizard. - 4. Once the user has submitted all the forms and all the data has been - validated, the wizard processes the data -- saving it to the database, - sending an e-mail, or whatever the application needs to do. - -Usage -===== - -This application handles as much machinery for you as possible. Generally, you -just have to do these things: - - 1. Define a number of ``django.forms`` ``Form`` classes -- one per wizard - page. - 2. Create a ``FormWizard`` class that specifies what to do once all of your - forms have been submitted and validated. This also lets you override some - of the wizard's behavior. - 3. Create some templates that render the forms. You can define a single, - generic template to handle every one of the forms, or you can define a - specific template for each form. - 4. Point your URLconf at your ``FormWizard`` class. - -Defining ``Form`` classes -========================= - -The first step in creating a form wizard is to create the ``Form`` classes. -These should be standard ``django.forms`` ``Form`` classes, covered in the -`forms documentation`_. - -These classes can live anywhere in your codebase, but convention is to put them -in a file called ``forms.py`` in your application. - -For example, let's write a "contact form" wizard, where the first page's form -collects the sender's e-mail address and subject, and the second page collects -the message itself. Here's what the ``forms.py`` might look like:: - - from django import forms - - class ContactForm1(forms.Form): - subject = forms.CharField(max_length=100) - sender = forms.EmailField() - - class ContactForm2(forms.Form): - message = forms.CharField(widget=forms.Textarea) - -**Important limitation:** Because the wizard uses HTML hidden fields to store -data between pages, you may not include a ``FileField`` in any form except the -last one. - -.. _forms documentation: ../forms/ - -Creating a ``FormWizard`` class -=============================== - -The next step is to create a ``FormWizard`` class, which should be a subclass -of ``django.contrib.formtools.wizard.FormWizard``. - -As your ``Form`` classes, this ``FormWizard`` class can live anywhere in your -codebase, but convention is to put it in ``forms.py``. - -The only requirement on this subclass is that it implement a ``done()`` method, -which specifies what should happen when the data for *every* form is submitted -and validated. This method is passed two arguments: - - * ``request`` -- an HttpRequest_ object - * ``form_list`` -- a list of ``django.forms`` ``Form`` classes - -In this simplistic example, rather than perform any database operation, the -method simply renders a template of the validated data:: - - from django.shortcuts import render_to_response - from django.contrib.formtools.wizard import FormWizard - - class ContactWizard(FormWizard): - def done(self, request, form_list): - return render_to_response('done.html', { - 'form_data': [form.cleaned_data for form in form_list], - }) - -Note that this method will be called via ``POST``, so it really ought to be a -good Web citizen and redirect after processing the data. Here's another -example:: - - from django.http import HttpResponseRedirect - from django.contrib.formtools.wizard import FormWizard - - class ContactWizard(FormWizard): - def done(self, request, form_list): - do_something_with_the_form_data(form_list) - return HttpResponseRedirect('/page-to-redirect-to-when-done/') - -See the section "Advanced ``FormWizard`` methods" below to learn about more -``FormWizard`` hooks. - -.. _HttpRequest: request_response/#httprequest-objects - -Creating templates for the forms -================================ - -Next, you'll need to create a template that renders the wizard's forms. By -default, every form uses a template called ``forms/wizard.html``. (You can -change this template name by overriding ``FormWizard.get_template()``, which is -documented below. This hook also allows you to use a different template for -each form.) - -This template expects the following context: - - * ``step_field`` -- The name of the hidden field containing the step. - * ``step0`` -- The current step (zero-based). - * ``step`` -- The current step (one-based). - * ``step_count`` -- The total number of steps. - * ``form`` -- The ``Form`` instance for the current step (either empty or - with errors). - * ``previous_fields`` -- A string representing every previous data field, - plus hashes for completed forms, all in the form of hidden fields. Note - that you'll need to run this through the ``safe`` template filter, to - prevent auto-escaping, because it's raw HTML. - -It will also be passed any objects in ``extra_context``, which is a dictionary -you can specify that contains extra values to add to the context. You can -specify it in two ways: - - * Set the ``extra_context`` attribute on your ``FormWizard`` subclass to a - dictionary. - - * Pass ``extra_context`` as extra parameters in the URLconf. - -Here's a full example template:: - - {% extends "base.html" %} - - {% block content %} - <p>Step {{ step }} of {{ step_count }}</p> - <form action="." method="post"> - <table> - {{ form }} - </table> - <input type="hidden" name="{{ step_field }}" value="{{ step0 }}" /> - {{ previous_fields|safe }} - <input type="submit"> - </form> - {% endblock %} - -Note that ``previous_fields``, ``step_field`` and ``step0`` are all required -for the wizard to work properly. - -Hooking the wizard into a URLconf -================================= - -Finally, give your new ``FormWizard`` object a URL in ``urls.py``. The wizard -takes a list of your form objects as arguments:: - - from django.conf.urls.defaults import * - from mysite.testapp.forms import ContactForm1, ContactForm2, ContactWizard - - urlpatterns = patterns('', - (r'^contact/$', ContactWizard([ContactForm1, ContactForm2])), - ) - -Advanced ``FormWizard`` methods -=============================== - -Aside from the ``done()`` method, ``FormWizard`` offers a few advanced method -hooks that let you customize how your wizard works. - -Some of these methods take an argument ``step``, which is a zero-based counter -representing the current step of the wizard. (E.g., the first form is ``0`` and -the second form is ``1``.) - -``prefix_for_step`` -~~~~~~~~~~~~~~~~~~~ - -Given the step, returns a ``Form`` prefix to use. By default, this simply uses -the step itself. For more, see the `form prefix documentation`_. - -Default implementation:: - - def prefix_for_step(self, step): - return str(step) - -.. _form prefix documentation: ../forms/#prefixes-for-forms - -``render_hash_failure`` -~~~~~~~~~~~~~~~~~~~~~~~ - -Renders a template if the hash check fails. It's rare that you'd need to -override this. - -Default implementation:: - - def render_hash_failure(self, request, step): - return self.render(self.get_form(step), request, step, - context={'wizard_error': 'We apologize, but your form has expired. Please continue filling out the form from this page.'}) - -``security_hash`` -~~~~~~~~~~~~~~~~~ - -Calculates the security hash for the given request object and ``Form`` instance. - -By default, this uses an MD5 hash of the form data and your -`SECRET_KEY setting`_. It's rare that somebody would need to override this. - -Example:: - - def security_hash(self, request, form): - return my_hash_function(request, form) - -.. _SECRET_KEY setting: ../settings/#secret-key - -``parse_params`` -~~~~~~~~~~~~~~~~ - -A hook for saving state from the request object and ``args`` / ``kwargs`` that -were captured from the URL by your URLconf. - -By default, this does nothing. - -Example:: - - def parse_params(self, request, *args, **kwargs): - self.my_state = args[0] - -``get_template`` -~~~~~~~~~~~~~~~~ - -Returns the name of the template that should be used for the given step. - -By default, this returns ``'forms/wizard.html'``, regardless of step. - -Example:: - - def get_template(self, step): - return 'myapp/wizard_%s.html' % step - -If ``get_template`` returns a list of strings, then the wizard will use the -template system's ``select_template()`` function, `explained in the template docs`_. -This means the system will use the first template that exists on the filesystem. -For example:: - - def get_template(self, step): - return ['myapp/wizard_%s.html' % step, 'myapp/wizard.html'] - -.. _explained in the template docs: ../templates_python/#the-python-api - -``render_template`` -~~~~~~~~~~~~~~~~~~~ - -Renders the template for the given step, returning an ``HttpResponse`` object. - -Override this method if you want to add a custom context, return a different -MIME type, etc. If you only need to override the template name, use -``get_template()`` instead. - -The template will be rendered with the context documented in the -"Creating templates for the forms" section above. - -``process_step`` -~~~~~~~~~~~~~~~~ - -Hook for modifying the wizard's internal state, given a fully validated ``Form`` -object. The Form is guaranteed to have clean, valid data. - -This method should *not* modify any of that data. Rather, it might want to set -``self.extra_context`` or dynamically alter ``self.form_list``, based on -previously submitted forms. - -Note that this method is called every time a page is rendered for *all* -submitted steps. - -The function signature:: - - def process_step(self, request, form, step): - # ... diff --git a/docs/forms.txt b/docs/forms.txt deleted file mode 100644 index f25d5c57d5..0000000000 --- a/docs/forms.txt +++ /dev/null @@ -1,2468 +0,0 @@ -================= -The forms library -================= - -``django.forms`` is Django's form-handling library. - -.. admonition:: Looking for oldforms? - - ``django.forms`` was once called ``newforms`` since it replaced Django's - original form/manipulator/validation framework. The old form handling - library is still available as `django.oldforms`_, but will be removed - in a future version of Django. - -.. _django.oldforms: ../oldforms/ - -Overview -======== - -``django.forms`` is intended to handle HTML form display, data processing -(validation) and redisplay. It's what you use if you want to perform -server-side validation for an HTML form. - -For example, if your Web site has a contact form that visitors can use to -send you e-mail, you'd use this library to implement the display of the HTML -form fields, along with the form validation. Any time you need to use an HTML -``<form>``, you can use this library. - -The library deals with these concepts: - - * **Widget** -- A class that corresponds to an HTML form widget, e.g. - ``<input type="text">`` or ``<textarea>``. This handles rendering of the - widget as HTML. - - * **Field** -- A class that is responsible for doing validation, e.g. - an ``EmailField`` that makes sure its data is a valid e-mail address. - - * **Form** -- A collection of fields that knows how to validate itself and - display itself as HTML. - - * **Media** -- A definition of the CSS and JavaScript resources that are - required to render a form. - -The library is decoupled from the other Django components, such as the database -layer, views and templates. It relies only on Django settings, a couple of -``django.utils`` helper functions and Django's internationalization hooks (but -you're not required to be using internationalization features to use this -library). - -Form objects -============ - -The primary way of using the ``forms`` library is to create a form object. -Do this by subclassing ``django.forms.Form`` and specifying the form's -fields, in a declarative style that you'll be familiar with if you've used -Django database models. In this section, we'll iteratively develop a form -object that you might use to implement "contact me" functionality on your -personal Web site. - -Start with this basic ``Form`` subclass, which we'll call ``ContactForm``:: - - from django import forms - - class ContactForm(forms.Form): - subject = forms.CharField(max_length=100) - message = forms.CharField() - sender = forms.EmailField() - cc_myself = forms.BooleanField(required=False) - -A form is composed of ``Field`` objects. In this case, our form has four -fields: ``subject``, ``message``, ``sender`` and ``cc_myself``. We'll explain -the different types of fields -- e.g., ``CharField`` and ``EmailField`` -- -shortly. - -Creating ``Form`` instances ---------------------------- - -A ``Form`` instance is either **bound** to a set of data, or **unbound**. - - * If it's **bound** to a set of data, it's capable of validating that data - and rendering the form as HTML with the data displayed in the HTML. - - * If it's **unbound**, it cannot do validation (because there's no data to - validate!), but it can still render the blank form as HTML. - -To create an unbound ``Form`` instance, simply instantiate the class:: - - >>> f = ContactForm() - -To bind data to a form, pass the data as a dictionary as the first parameter to -your ``Form`` class constructor:: - - >>> data = {'subject': 'hello', - ... 'message': 'Hi there', - ... 'sender': 'foo@example.com', - ... 'cc_myself': True} - >>> f = ContactForm(data) - -In this dictionary, the keys are the field names, which correspond to the -attributes in your ``Form`` class. The values are the data you're trying -to validate. These will usually be strings, but there's no requirement that -they be strings; the type of data you pass depends on the ``Field``, as we'll -see in a moment. - -If you need to distinguish between bound and unbound form instances at runtime, -check the value of the form's ``is_bound`` attribute:: - - >>> f = ContactForm() - >>> f.is_bound - False - >>> f = ContactForm({'subject': 'hello'}) - >>> f.is_bound - True - -Note that passing an empty dictionary creates a *bound* form with empty data:: - - >>> f = ContactForm({}) - >>> f.is_bound - True - -If you have a bound ``Form`` instance and want to change the data somehow, or -if you want to bind an unbound ``Form`` instance to some data, create another -``Form`` instance. There is no way to change data in a ``Form`` instance. Once -a ``Form`` instance has been created, you should consider its data immutable, -whether it has data or not. - -Using forms to validate data ----------------------------- - -The primary task of a ``Form`` object is to validate data. With a bound -``Form`` instance, call the ``is_valid()`` method to run validation and return -a boolean designating whether the data was valid:: - - >>> data = {'subject': 'hello', - ... 'message': 'Hi there', - ... 'sender': 'foo@example.com', - ... 'cc_myself': True} - >>> f = ContactForm(data) - >>> f.is_valid() - True - -Let's try with some invalid data. In this case, ``subject`` is blank (an error, -because all fields are required by default) and ``sender`` is not a valid -e-mail address:: - - >>> data = {'subject': '', - ... 'message': 'Hi there', - ... 'sender': 'invalid e-mail address', - ... 'cc_myself': True} - >>> f = ContactForm(data) - >>> f.is_valid() - False - -Access the ``errors`` attribute to get a dictionary of error messages:: - - >>> f.errors - {'sender': [u'Enter a valid e-mail address.'], 'subject': [u'This field is required.']} - -In this dictionary, the keys are the field names, and the values are lists of -Unicode strings representing the error messages. The error messages are stored -in lists because a field can have multiple error messages. - -You can access ``errors`` without having to call ``is_valid()`` first. The -form's data will be validated the first time either you call ``is_valid()`` or -access ``errors``. - -The validation routines will only get called once, regardless of how many times -you access ``errors`` or call ``is_valid()``. This means that if validation has -side effects, those side effects will only be triggered once. - -Behavior of unbound forms -~~~~~~~~~~~~~~~~~~~~~~~~~ - -It's meaningless to validate a form with no data, but, for the record, here's -what happens with unbound forms:: - - >>> f = ContactForm() - >>> f.is_valid() - False - >>> f.errors - {} - -Accessing "clean" data ----------------------- - -Each ``Field`` in a ``Form`` class is responsible not only for validating data, -but also for "cleaning" it -- normalizing it to a consistent format. This is a -nice feature, because it allows data for a particular field to be input in -a variety of ways, always resulting in consistent output. - -For example, ``DateField`` normalizes input into a Python ``datetime.date`` -object. Regardless of whether you pass it a string in the format -``'1994-07-15'``, a ``datetime.date`` object or a number of other formats, -``DateField`` will always normalize it to a ``datetime.date`` object as long as -it's valid. - -Once you've created a ``Form`` instance with a set of data and validated it, -you can access the clean data via the ``cleaned_data`` attribute of the ``Form`` -object:: - - >>> data = {'subject': 'hello', - ... 'message': 'Hi there', - ... 'sender': 'foo@example.com', - ... 'cc_myself': True} - >>> f = ContactForm(data) - >>> f.is_valid() - True - >>> f.cleaned_data - {'cc_myself': True, 'message': u'Hi there', 'sender': u'foo@example.com', 'subject': u'hello'} - -.. note:: - **New in Django development version** The ``cleaned_data`` attribute was - called ``clean_data`` in earlier releases. - -Note that any text-based field -- such as ``CharField`` or ``EmailField`` -- -always cleans the input into a Unicode string. We'll cover the encoding -implications later in this document. - -If your data does *not* validate, your ``Form`` instance will not have a -``cleaned_data`` attribute:: - - >>> data = {'subject': '', - ... 'message': 'Hi there', - ... 'sender': 'invalid e-mail address', - ... 'cc_myself': True} - >>> f = ContactForm(data) - >>> f.is_valid() - False - >>> f.cleaned_data - Traceback (most recent call last): - ... - AttributeError: 'ContactForm' object has no attribute 'cleaned_data' - -``cleaned_data`` will always *only* contain a key for fields defined in the -``Form``, even if you pass extra data when you define the ``Form``. In this -example, we pass a bunch of extra fields to the ``ContactForm`` constructor, -but ``cleaned_data`` contains only the form's fields:: - - >>> data = {'subject': 'hello', - ... 'message': 'Hi there', - ... 'sender': 'foo@example.com', - ... 'cc_myself': True, - ... 'extra_field_1': 'foo', - ... 'extra_field_2': 'bar', - ... 'extra_field_3': 'baz'} - >>> f = ContactForm(data) - >>> f.is_valid() - True - >>> f.cleaned_data # Doesn't contain extra_field_1, etc. - {'cc_myself': True, 'message': u'Hi there', 'sender': u'foo@example.com', 'subject': u'hello'} - -``cleaned_data`` will include a key and value for *all* fields defined in the -``Form``, even if the data didn't include a value for fields that are not -required. In this example, the data dictionary doesn't include a value for the -``nick_name`` field, but ``cleaned_data`` includes it, with an empty value:: - - >>> class OptionalPersonForm(Form): - ... first_name = CharField() - ... last_name = CharField() - ... nick_name = CharField(required=False) - >>> data = {'first_name': u'John', 'last_name': u'Lennon'} - >>> f = OptionalPersonForm(data) - >>> f.is_valid() - True - >>> f.cleaned_data - {'nick_name': u'', 'first_name': u'John', 'last_name': u'Lennon'} - -In this above example, the ``cleaned_data`` value for ``nick_name`` is set to an -empty string, because ``nick_name`` is ``CharField``, and ``CharField``\s treat -empty values as an empty string. Each field type knows what its "blank" value -is -- e.g., for ``DateField``, it's ``None`` instead of the empty string. For -full details on each field's behavior in this case, see the "Empty value" note -for each field in the "Built-in ``Field`` classes" section below. - -You can write code to perform validation for particular form fields (based on -their name) or for the form as a whole (considering combinations of various -fields). More information about this is in the `Custom form and field -validation`_ section, below. - -Behavior of unbound forms -~~~~~~~~~~~~~~~~~~~~~~~~~ - -It's meaningless to request "cleaned" data in a form with no data, but, for the -record, here's what happens with unbound forms:: - - >>> f = ContactForm() - >>> f.cleaned_data - Traceback (most recent call last): - ... - AttributeError: 'ContactForm' object has no attribute 'cleaned_data' - -Outputting forms as HTML ------------------------- - -The second task of a ``Form`` object is to render itself as HTML. To do so, -simply ``print`` it:: - - >>> f = ContactForm() - >>> print f - <tr><th><label for="id_subject">Subject:</label></th><td><input id="id_subject" type="text" name="subject" maxlength="100" /></td></tr> - <tr><th><label for="id_message">Message:</label></th><td><input type="text" name="message" id="id_message" /></td></tr> - <tr><th><label for="id_sender">Sender:</label></th><td><input type="text" name="sender" id="id_sender" /></td></tr> - <tr><th><label for="id_cc_myself">Cc myself:</label></th><td><input type="checkbox" name="cc_myself" id="id_cc_myself" /></td></tr> - -If the form is bound to data, the HTML output will include that data -appropriately. For example, if a field is represented by an -``<input type="text">``, the data will be in the ``value`` attribute. If a -field is represented by an ``<input type="checkbox">``, then that HTML will -include ``checked="checked"`` if appropriate:: - - >>> data = {'subject': 'hello', - ... 'message': 'Hi there', - ... 'sender': 'foo@example.com', - ... 'cc_myself': True} - >>> f = ContactForm(data) - >>> print f - <tr><th><label for="id_subject">Subject:</label></th><td><input id="id_subject" type="text" name="subject" maxlength="100" value="hello" /></td></tr> - <tr><th><label for="id_message">Message:</label></th><td><input type="text" name="message" id="id_message" value="Hi there" /></td></tr> - <tr><th><label for="id_sender">Sender:</label></th><td><input type="text" name="sender" id="id_sender" value="foo@example.com" /></td></tr> - <tr><th><label for="id_cc_myself">Cc myself:</label></th><td><input type="checkbox" name="cc_myself" id="id_cc_myself" checked="checked" /></td></tr> - -This default output is a two-column HTML table, with a ``<tr>`` for each field. -Notice the following: - - * For flexibility, the output does *not* include the ``<table>`` and - ``</table>`` tags, nor does it include the ``<form>`` and ``</form>`` - tags or an ``<input type="submit">`` tag. It's your job to do that. - - * Each field type has a default HTML representation. ``CharField`` and - ``EmailField`` are represented by an ``<input type="text">``. - ``BooleanField`` is represented by an ``<input type="checkbox">``. Note - these are merely sensible defaults; you can specify which HTML to use for - a given field by using widgets, which we'll explain shortly. - - * The HTML ``name`` for each tag is taken directly from its attribute name - in the ``ContactForm`` class. - - * The text label for each field -- e.g. ``'Subject:'``, ``'Message:'`` and - ``'Cc myself:'`` is generated from the field name by converting all - underscores to spaces and upper-casing the first letter. Again, note - these are merely sensible defaults; you can also specify labels manually. - - * Each text label is surrounded in an HTML ``<label>`` tag, which points - to the appropriate form field via its ``id``. Its ``id``, in turn, is - generated by prepending ``'id_'`` to the field name. The ``id`` - attributes and ``<label>`` tags are included in the output by default, to - follow best practices, but you can change that behavior. - -Although ``<table>`` output is the default output style when you ``print`` a -form, other output styles are available. Each style is available as a method on -a form object, and each rendering method returns a Unicode object. - -``as_p()`` -~~~~~~~~~~ - -``Form.as_p()`` renders the form as a series of ``<p>`` tags, with each ``<p>`` -containing one field:: - - >>> f = ContactForm() - >>> f.as_p() - u'<p><label for="id_subject">Subject:</label> <input id="id_subject" type="text" name="subject" maxlength="100" /></p>\n<p><label for="id_message">Message:</label> <input type="text" name="message" id="id_message" /></p>\n<p><label for="id_sender">Sender:</label> <input type="text" name="sender" id="id_sender" /></p>\n<p><label for="id_cc_myself">Cc myself:</label> <input type="checkbox" name="cc_myself" id="id_cc_myself" /></p>' - >>> print f.as_p() - <p><label for="id_subject">Subject:</label> <input id="id_subject" type="text" name="subject" maxlength="100" /></p> - <p><label for="id_message">Message:</label> <input type="text" name="message" id="id_message" /></p> - <p><label for="id_sender">Sender:</label> <input type="text" name="sender" id="id_sender" /></p> - <p><label for="id_cc_myself">Cc myself:</label> <input type="checkbox" name="cc_myself" id="id_cc_myself" /></p> - -``as_ul()`` -~~~~~~~~~~~ - -``Form.as_ul()`` renders the form as a series of ``<li>`` tags, with each -``<li>`` containing one field. It does *not* include the ``<ul>`` or ``</ul>``, -so that you can specify any HTML attributes on the ``<ul>`` for flexibility:: - - >>> f = ContactForm() - >>> f.as_ul() - u'<li><label for="id_subject">Subject:</label> <input id="id_subject" type="text" name="subject" maxlength="100" /></li>\n<li><label for="id_message">Message:</label> <input type="text" name="message" id="id_message" /></li>\n<li><label for="id_sender">Sender:</label> <input type="text" name="sender" id="id_sender" /></li>\n<li><label for="id_cc_myself">Cc myself:</label> <input type="checkbox" name="cc_myself" id="id_cc_myself" /></li>' - >>> print f.as_ul() - <li><label for="id_subject">Subject:</label> <input id="id_subject" type="text" name="subject" maxlength="100" /></li> - <li><label for="id_message">Message:</label> <input type="text" name="message" id="id_message" /></li> - <li><label for="id_sender">Sender:</label> <input type="text" name="sender" id="id_sender" /></li> - <li><label for="id_cc_myself">Cc myself:</label> <input type="checkbox" name="cc_myself" id="id_cc_myself" /></li> - -``as_table()`` -~~~~~~~~~~~~~~ - -Finally, ``Form.as_table()`` outputs the form as an HTML ``<table>``. This is -exactly the same as ``print``. In fact, when you ``print`` a form object, it -calls its ``as_table()`` method behind the scenes:: - - >>> f = ContactForm() - >>> f.as_table() - u'<tr><th><label for="id_subject">Subject:</label></th><td><input id="id_subject" type="text" name="subject" maxlength="100" /></td></tr>\n<tr><th><label for="id_message">Message:</label></th><td><input type="text" name="message" id="id_message" /></td></tr>\n<tr><th><label for="id_sender">Sender:</label></th><td><input type="text" name="sender" id="id_sender" /></td></tr>\n<tr><th><label for="id_cc_myself">Cc myself:</label></th><td><input type="checkbox" name="cc_myself" id="id_cc_myself" /></td></tr>' - >>> print f.as_table() - <tr><th><label for="id_subject">Subject:</label></th><td><input id="id_subject" type="text" name="subject" maxlength="100" /></td></tr> - <tr><th><label for="id_message">Message:</label></th><td><input type="text" name="message" id="id_message" /></td></tr> - <tr><th><label for="id_sender">Sender:</label></th><td><input type="text" name="sender" id="id_sender" /></td></tr> - <tr><th><label for="id_cc_myself">Cc myself:</label></th><td><input type="checkbox" name="cc_myself" id="id_cc_myself" /></td></tr> - -Configuring HTML ``<label>`` tags -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -An HTML ``<label>`` tag designates which label text is associated with which -form element. This small enhancement makes forms more usable and more accessible -to assistive devices. It's always a good idea to use ``<label>`` tags. - -By default, the form rendering methods include HTML ``id`` attributes on the -form elements and corresponding ``<label>`` tags around the labels. The ``id`` -attribute values are generated by prepending ``id_`` to the form field names. -This behavior is configurable, though, if you want to change the ``id`` -convention or remove HTML ``id`` attributes and ``<label>`` tags entirely. - -Use the ``auto_id`` argument to the ``Form`` constructor to control the label -and ``id`` behavior. This argument must be ``True``, ``False`` or a string. - -If ``auto_id`` is ``False``, then the form output will not include ``<label>`` -tags nor ``id`` attributes:: - - >>> f = ContactForm(auto_id=False) - >>> print f.as_table() - <tr><th>Subject:</th><td><input type="text" name="subject" maxlength="100" /></td></tr> - <tr><th>Message:</th><td><input type="text" name="message" /></td></tr> - <tr><th>Sender:</th><td><input type="text" name="sender" /></td></tr> - <tr><th>Cc myself:</th><td><input type="checkbox" name="cc_myself" /></td></tr> - >>> print f.as_ul() - <li>Subject: <input type="text" name="subject" maxlength="100" /></li> - <li>Message: <input type="text" name="message" /></li> - <li>Sender: <input type="text" name="sender" /></li> - <li>Cc myself: <input type="checkbox" name="cc_myself" /></li> - >>> print f.as_p() - <p>Subject: <input type="text" name="subject" maxlength="100" /></p> - <p>Message: <input type="text" name="message" /></p> - <p>Sender: <input type="text" name="sender" /></p> - <p>Cc myself: <input type="checkbox" name="cc_myself" /></p> - -If ``auto_id`` is set to ``True``, then the form output *will* include -``<label>`` tags and will simply use the field name as its ``id`` for each form -field:: - - >>> f = ContactForm(auto_id=True) - >>> print f.as_table() - <tr><th><label for="subject">Subject:</label></th><td><input id="subject" type="text" name="subject" maxlength="100" /></td></tr> - <tr><th><label for="message">Message:</label></th><td><input type="text" name="message" id="message" /></td></tr> - <tr><th><label for="sender">Sender:</label></th><td><input type="text" name="sender" id="sender" /></td></tr> - <tr><th><label for="cc_myself">Cc myself:</label></th><td><input type="checkbox" name="cc_myself" id="cc_myself" /></td></tr> - >>> print f.as_ul() - <li><label for="subject">Subject:</label> <input id="subject" type="text" name="subject" maxlength="100" /></li> - <li><label for="message">Message:</label> <input type="text" name="message" id="message" /></li> - <li><label for="sender">Sender:</label> <input type="text" name="sender" id="sender" /></li> - <li><label for="cc_myself">Cc myself:</label> <input type="checkbox" name="cc_myself" id="cc_myself" /></li> - >>> print f.as_p() - <p><label for="subject">Subject:</label> <input id="subject" type="text" name="subject" maxlength="100" /></p> - <p><label for="message">Message:</label> <input type="text" name="message" id="message" /></p> - <p><label for="sender">Sender:</label> <input type="text" name="sender" id="sender" /></p> - <p><label for="cc_myself">Cc myself:</label> <input type="checkbox" name="cc_myself" id="cc_myself" /></p> - -If ``auto_id`` is set to a string containing the format character ``'%s'``, -then the form output will include ``<label>`` tags, and will generate ``id`` -attributes based on the format string. For example, for a format string -``'field_%s'``, a field named ``subject`` will get the ``id`` value -``'field_subject'``. Continuing our example:: - - >>> f = ContactForm(auto_id='id_for_%s') - >>> print f.as_table() - <tr><th><label for="id_for_subject">Subject:</label></th><td><input id="id_for_subject" type="text" name="subject" maxlength="100" /></td></tr> - <tr><th><label for="id_for_message">Message:</label></th><td><input type="text" name="message" id="id_for_message" /></td></tr> - <tr><th><label for="id_for_sender">Sender:</label></th><td><input type="text" name="sender" id="id_for_sender" /></td></tr> - <tr><th><label for="id_for_cc_myself">Cc myself:</label></th><td><input type="checkbox" name="cc_myself" id="id_for_cc_myself" /></td></tr> - >>> print f.as_ul() - <li><label for="id_for_subject">Subject:</label> <input id="id_for_subject" type="text" name="subject" maxlength="100" /></li> - <li><label for="id_for_message">Message:</label> <input type="text" name="message" id="id_for_message" /></li> - <li><label for="id_for_sender">Sender:</label> <input type="text" name="sender" id="id_for_sender" /></li> - <li><label for="id_for_cc_myself">Cc myself:</label> <input type="checkbox" name="cc_myself" id="id_for_cc_myself" /></li> - >>> print f.as_p() - <p><label for="id_for_subject">Subject:</label> <input id="id_for_subject" type="text" name="subject" maxlength="100" /></p> - <p><label for="id_for_message">Message:</label> <input type="text" name="message" id="id_for_message" /></p> - <p><label for="id_for_sender">Sender:</label> <input type="text" name="sender" id="id_for_sender" /></p> - <p><label for="id_for_cc_myself">Cc myself:</label> <input type="checkbox" name="cc_myself" id="id_for_cc_myself" /></p> - -If ``auto_id`` is set to any other true value -- such as a string that doesn't -include ``%s`` -- then the library will act as if ``auto_id`` is ``True``. - -By default, ``auto_id`` is set to the string ``'id_%s'``. - -Normally, a colon (``:``) will be appended after any label name when a form is -rendered. It's possible to change the colon to another character, or omit it -entirely, using the ``label_suffix`` parameter:: - - >>> f = ContactForm(auto_id='id_for_%s', label_suffix='') - >>> print f.as_ul() - <li><label for="id_for_subject">Subject</label> <input id="id_for_subject" type="text" name="subject" maxlength="100" /></li> - <li><label for="id_for_message">Message</label> <input type="text" name="message" id="id_for_message" /></li> - <li><label for="id_for_sender">Sender</label> <input type="text" name="sender" id="id_for_sender" /></li> - <li><label for="id_for_cc_myself">Cc myself</label> <input type="checkbox" name="cc_myself" id="id_for_cc_myself" /></li> - >>> f = ContactForm(auto_id='id_for_%s', label_suffix=' ->') - >>> print f.as_ul() - <li><label for="id_for_subject">Subject -></label> <input id="id_for_subject" type="text" name="subject" maxlength="100" /></li> - <li><label for="id_for_message">Message -></label> <input type="text" name="message" id="id_for_message" /></li> - <li><label for="id_for_sender">Sender -></label> <input type="text" name="sender" id="id_for_sender" /></li> - <li><label for="id_for_cc_myself">Cc myself -></label> <input type="checkbox" name="cc_myself" id="id_for_cc_myself" /></li> - -Note that the label suffix is added only if the last character of the -label isn't a punctuation character (``.``, ``!``, ``?`` or ``:``) - -Notes on field ordering -~~~~~~~~~~~~~~~~~~~~~~~ - -In the ``as_p()``, ``as_ul()`` and ``as_table()`` shortcuts, the fields are -displayed in the order in which you define them in your form class. For -example, in the ``ContactForm`` example, the fields are defined in the order -``subject``, ``message``, ``sender``, ``cc_myself``. To reorder the HTML -output, just change the order in which those fields are listed in the class. - -How errors are displayed -~~~~~~~~~~~~~~~~~~~~~~~~ - -If you render a bound ``Form`` object, the act of rendering will automatically -run the form's validation if it hasn't already happened, and the HTML output -will include the validation errors as a ``<ul class="errorlist">`` near the -field. The particular positioning of the error messages depends on the output -method you're using:: - - >>> data = {'subject': '', - ... 'message': 'Hi there', - ... 'sender': 'invalid e-mail address', - ... 'cc_myself': True} - >>> f = ContactForm(data, auto_id=False) - >>> print f.as_table() - <tr><th>Subject:</th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="text" name="subject" maxlength="100" /></td></tr> - <tr><th>Message:</th><td><input type="text" name="message" value="Hi there" /></td></tr> - <tr><th>Sender:</th><td><ul class="errorlist"><li>Enter a valid e-mail address.</li></ul><input type="text" name="sender" value="invalid e-mail address" /></td></tr> - <tr><th>Cc myself:</th><td><input checked="checked" type="checkbox" name="cc_myself" /></td></tr> - >>> print f.as_ul() - <li><ul class="errorlist"><li>This field is required.</li></ul>Subject: <input type="text" name="subject" maxlength="100" /></li> - <li>Message: <input type="text" name="message" value="Hi there" /></li> - <li><ul class="errorlist"><li>Enter a valid e-mail address.</li></ul>Sender: <input type="text" name="sender" value="invalid e-mail address" /></li> - <li>Cc myself: <input checked="checked" type="checkbox" name="cc_myself" /></li> - >>> print f.as_p() - <p><ul class="errorlist"><li>This field is required.</li></ul></p> - <p>Subject: <input type="text" name="subject" maxlength="100" /></p> - <p>Message: <input type="text" name="message" value="Hi there" /></p> - <p><ul class="errorlist"><li>Enter a valid e-mail address.</li></ul></p> - <p>Sender: <input type="text" name="sender" value="invalid e-mail address" /></p> - <p>Cc myself: <input checked="checked" type="checkbox" name="cc_myself" /></p> - -Customizing the error list format -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -By default, forms use ``django.forms.util.ErrorList`` to format validation -errors. If you'd like to use an alternate class for displaying errors, you can -pass that in at construction time:: - - >>> from django.forms.util import ErrorList - >>> class DivErrorList(ErrorList): - ... def __unicode__(self): - ... return self.as_divs() - ... def as_divs(self): - ... if not self: return u'' - ... return u'<div class="errorlist">%s</div>' % ''.join([u'<div class="error">%s</div>' % e for e in self]) - >>> f = ContactForm(data, auto_id=False, error_class=DivErrorList) - >>> f.as_p() - <div class="errorlist"><div class="error">This field is required.</div></div> - <p>Subject: <input type="text" name="subject" maxlength="100" /></p> - <p>Message: <input type="text" name="message" value="Hi there" /></p> - <div class="errorlist"><div class="error">Enter a valid e-mail address.</div></div> - <p>Sender: <input type="text" name="sender" value="invalid e-mail address" /></p> - <p>Cc myself: <input checked="checked" type="checkbox" name="cc_myself" /></p> - -More granular output -~~~~~~~~~~~~~~~~~~~~ - -The ``as_p()``, ``as_ul()`` and ``as_table()`` methods are simply shortcuts for -lazy developers -- they're not the only way a form object can be displayed. - -To display the HTML for a single field in your form, use dictionary lookup -syntax using the field's name as the key, and print the resulting object:: - - >>> f = ContactForm() - >>> print f['subject'] - <input id="id_subject" type="text" name="subject" maxlength="100" /> - >>> print f['message'] - <input type="text" name="message" id="id_message" /> - >>> print f['sender'] - <input type="text" name="sender" id="id_sender" /> - >>> print f['cc_myself'] - <input type="checkbox" name="cc_myself" id="id_cc_myself" /> - -Call ``str()`` or ``unicode()`` on the field to get its rendered HTML as a -string or Unicode object, respectively:: - - >>> str(f['subject']) - '<input id="id_subject" type="text" name="subject" maxlength="100" />' - >>> unicode(f['subject']) - u'<input id="id_subject" type="text" name="subject" maxlength="100" />' - -The field-specific output honors the form object's ``auto_id`` setting:: - - >>> f = ContactForm(auto_id=False) - >>> print f['message'] - <input type="text" name="message" /> - >>> f = ContactForm(auto_id='id_%s') - >>> print f['message'] - <input type="text" name="message" id="id_message" /> - -For a field's list of errors, access the field's ``errors`` attribute. This -is a list-like object that is displayed as an HTML ``<ul class="errorlist">`` -when printed:: - - >>> data = {'subject': 'hi', 'message': '', 'sender': '', 'cc_myself': ''} - >>> f = ContactForm(data, auto_id=False) - >>> print f['message'] - <input type="text" name="message" /> - >>> f['message'].errors - [u'This field is required.'] - >>> print f['message'].errors - <ul class="errorlist"><li>This field is required.</li></ul> - >>> f['subject'].errors - [] - >>> print f['subject'].errors - - >>> str(f['subject'].errors) - '' - -Using forms in views and templates ----------------------------------- - -Let's put this all together and use the ``ContactForm`` example in a Django -view and template. - -Simple view example -~~~~~~~~~~~~~~~~~~~ - -This example view displays the contact form by default and validates/processes -it if accessed via a POST request:: - - def contact(request): - if request.method == 'POST': - form = ContactForm(request.POST) - if form.is_valid(): - # Do form processing here... - return HttpResponseRedirect('/url/on_success/') - else: - form = ContactForm() - return render_to_response('contact.html', {'form': form}) - -Simple template example -~~~~~~~~~~~~~~~~~~~~~~~ - -The template in the above view example, ``contact.html``, is responsible for -displaying the form as HTML. To do this, we can use the techniques outlined in -the "Outputting forms as HTML" section above. - -The simplest way to display a form's HTML is to use the variable on its own, -like this:: - - <form method="post" action=""> - <table>{{ form }}</table> - <input type="submit" /> - </form> - -The above template code will display the form as an HTML table, using the -``form.as_table()`` method explained previously. This works because Django's -template system displays an object's ``__str__()`` value, and the ``Form`` -class' ``__str__()`` method calls its ``as_table()`` method. - -The following is equivalent but a bit more explicit:: - - <form method="post" action=""> - <table>{{ form.as_table }}</table> - <input type="submit" /> - </form> - -``form.as_ul`` and ``form.as_p`` are also available, as you may expect. - -Note that in the above two examples, we included the ``<form>``, ``<table>`` -``<input type="submit" />``, ``</table>`` and ``</form>`` tags. The form -convenience methods (``as_table()``, ``as_ul()`` and ``as_p()``) do not include -that HTML. - -Complex template output -~~~~~~~~~~~~~~~~~~~~~~~ - -As we've stressed several times, the ``as_table()``, ``as_ul()`` and ``as_p()`` -methods are just shortcuts for the common case. You can also work with the -individual fields for complete template control over the form's design. - -The easiest way is to iterate over the form's fields, with -``{% for field in form %}``. For example:: - - <form method="post" action=""> - <dl> - {% for field in form %} - <dt>{{ field.label_tag }}</dt> - <dd>{{ field }}</dd> - {% if field.help_text %}<dd>{{ field.help_text }}</dd>{% endif %} - {% if field.errors %}<dd class="myerrors">{{ field.errors }}</dd>{% endif %} - {% endfor %} - </dl> - <input type="submit" /> - </form> - -This iteration technique is useful if you want to apply the same HTML -formatting to each field, or if you don't know the names of the form fields -ahead of time. Note that the fields will be iterated over in the order in which -they're defined in the ``Form`` class. - -Alternatively, you can arrange the form's fields explicitly, by name. Do that -by accessing ``{{ form.fieldname }}``, where ``fieldname`` is the field's name. -For example:: - - <form method="post" action=""> - <ul class="myformclass"> - <li>{{ form.sender.label_tag }} {{ form.sender }}</li> - <li class="helptext">{{ form.sender.help_text }}</li> - {% if form.sender.errors %}<ul class="errorlist">{{ form.sender.errors }}</ul>{% endif %} - - <li>{{ form.subject.label_tag }} {{ form.subject }}</li> - <li class="helptext">{{ form.subject.help_text }}</li> - {% if form.subject.errors %}<ul class="errorlist">{{ form.subject.errors }}</ul>{% endif %} - - ... - </ul> - </form> - -Highlighting required fields in templates -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -It's common to show a user which fields are required. Here's an example of how -to do that, using the above example modified to insert an asterisk after the -label of each required field:: - - <form method="post" action=""> - <dl> - {% for field in form %} - <dt>{{ field.label_tag }}{% if field.field.required %}*{% endif %}</dt> - <dd>{{ field }}</dd> - {% if field.help_text %}<dd>{{ field.help_text }}</dd>{% endif %} - {% if field.errors %}<dd class="myerrors">{{ field.errors }}</dd>{% endif %} - {% endfor %} - </dl> - <input type="submit" /> - </form> - -The ``{% if field.field.required %}*{% endif %}`` fragment is the relevant -addition here. It adds the asterisk only if the field is required. - -Note that we check ``field.field.required`` and not ``field.required``. In the -template, ``field`` is a ``forms.forms.BoundField`` instance, which holds -the actual ``Field`` instance in its ``field`` attribute. - -Binding uploaded files to a form --------------------------------- - -**New in Django development version** - -Dealing with forms that have ``FileField`` and ``ImageField`` fields -is a little more complicated than a normal form. - -Firstly, in order to upload files, you'll need to make sure that your -``<form>`` element correctly defines the ``enctype`` as -``"multipart/form-data"``:: - - <form enctype="multipart/form-data" method="post" action="/foo/"> - -Secondly, when you use the form, you need to bind the file data. File -data is handled separately to normal form data, so when your form -contains a ``FileField`` and ``ImageField``, you will need to specify -a second argument when you bind your form. So if we extend our -ContactForm to include an ``ImageField`` called ``mugshot``, we -need to bind the file data containing the mugshot image:: - - # Bound form with an image field - >>> from django.core.files.uploadedfile import SimpleUploadedFile - >>> data = {'subject': 'hello', - ... 'message': 'Hi there', - ... 'sender': 'foo@example.com', - ... 'cc_myself': True} - >>> file_data = {'mugshot': SimpleUploadedFile('face.jpg', <file data>)} - >>> f = ContactFormWithMugshot(data, file_data) - -In practice, you will usually specify ``request.FILES`` as the source -of file data (just like you use ``request.POST`` as the source of -form data):: - - # Bound form with an image field, data from the request - >>> f = ContactFormWithMugshot(request.POST, request.FILES) - -Constructing an unbound form is the same as always -- just omit both -form data *and* file data:: - - # Unbound form with a image field - >>> f = ContactFormWithMugshot() - -Testing for multipart forms -~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -If you're writing reusable views or templates, you may not know ahead of time -whether your form is a multipart form or not. The ``is_multipart()`` method -tells you whether the form requires multipart encoding for submission:: - - >>> f = ContactFormWithMugshot() - >>> f.is_multipart() - True - -Here's an example of how you might use this in a template:: - - {% if form.is_multipart %} - <form enctype="multipart/form-data" method="post" action="/foo/"> - {% else %} - <form method="post" action="/foo/"> - {% endif %} - {{ form }} - </form> - -Subclassing forms ------------------ - -If you have multiple ``Form`` classes that share fields, you can use -subclassing to remove redundancy. - -When you subclass a custom ``Form`` class, the resulting subclass will -include all fields of the parent class(es), followed by the fields you define -in the subclass. - -In this example, ``ContactFormWithPriority`` contains all the fields from -``ContactForm``, plus an additional field, ``priority``. The ``ContactForm`` -fields are ordered first:: - - >>> class ContactFormWithPriority(ContactForm): - ... priority = forms.CharField() - >>> f = ContactFormWithPriority(auto_id=False) - >>> print f.as_ul() - <li>Subject: <input type="text" name="subject" maxlength="100" /></li> - <li>Message: <input type="text" name="message" /></li> - <li>Sender: <input type="text" name="sender" /></li> - <li>Cc myself: <input type="checkbox" name="cc_myself" /></li> - <li>Priority: <input type="text" name="priority" /></li> - -It's possible to subclass multiple forms, treating forms as "mix-ins." In this -example, ``BeatleForm`` subclasses both ``PersonForm`` and ``InstrumentForm`` -(in that order), and its field list includes the fields from the parent -classes:: - - >>> class PersonForm(Form): - ... first_name = CharField() - ... last_name = CharField() - >>> class InstrumentForm(Form): - ... instrument = CharField() - >>> class BeatleForm(PersonForm, InstrumentForm): - ... haircut_type = CharField() - >>> b = BeatleForm(auto_id=False) - >>> print b.as_ul() - <li>First name: <input type="text" name="first_name" /></li> - <li>Last name: <input type="text" name="last_name" /></li> - <li>Instrument: <input type="text" name="instrument" /></li> - <li>Haircut type: <input type="text" name="haircut_type" /></li> - -Prefixes for forms ------------------- - -You can put several Django forms inside one ``<form>`` tag. To give each -``Form`` its own namespace, use the ``prefix`` keyword argument:: - - >>> mother = PersonForm(prefix="mother") - >>> father = PersonForm(prefix="father") - >>> print mother.as_ul() - <li><label for="id_mother-first_name">First name:</label> <input type="text" name="mother-first_name" id="id_mother-first_name" /></li> - <li><label for="id_mother-last_name">Last name:</label> <input type="text" name="mother-last_name" id="id_mother-last_name" /></li> - >>> print father.as_ul() - <li><label for="id_father-first_name">First name:</label> <input type="text" name="father-first_name" id="id_father-first_name" /></li> - <li><label for="id_father-last_name">Last name:</label> <input type="text" name="father-last_name" id="id_father-last_name" /></li> - -Fields -====== - -When you create a ``Form`` class, the most important part is defining the -fields of the form. Each field has custom validation logic, along with a few -other hooks. - -Although the primary way you'll use ``Field`` classes is in ``Form`` classes, -you can also instantiate them and use them directly to get a better idea of -how they work. Each ``Field`` instance has a ``clean()`` method, which takes -a single argument and either raises a ``django.forms.ValidationError`` -exception or returns the clean value:: - - >>> f = forms.EmailField() - >>> f.clean('foo@example.com') - u'foo@example.com' - >>> f.clean(u'foo@example.com') - u'foo@example.com' - >>> f.clean('invalid e-mail address') - Traceback (most recent call last): - ... - ValidationError: [u'Enter a valid e-mail address.'] - -If you've used Django's old forms/validation framework, take care in noticing -this ``ValidationError`` is different than the previous ``ValidationError``. -This one lives at ``django.forms.ValidationError`` rather than -``django.core.validators.ValidationError``. - -Core field arguments --------------------- - -Each ``Field`` class constructor takes at least these arguments. Some -``Field`` classes take additional, field-specific arguments, but the following -should *always* be accepted: - -``required`` -~~~~~~~~~~~~ - -By default, each ``Field`` class assumes the value is required, so if you pass -an empty value -- either ``None`` or the empty string (``""``) -- then -``clean()`` will raise a ``ValidationError`` exception:: - - >>> f = forms.CharField() - >>> f.clean('foo') - u'foo' - >>> f.clean('') - Traceback (most recent call last): - ... - ValidationError: [u'This field is required.'] - >>> f.clean(None) - Traceback (most recent call last): - ... - ValidationError: [u'This field is required.'] - >>> f.clean(' ') - u' ' - >>> f.clean(0) - u'0' - >>> f.clean(True) - u'True' - >>> f.clean(False) - u'False' - -To specify that a field is *not* required, pass ``required=False`` to the -``Field`` constructor:: - - >>> f = forms.CharField(required=False) - >>> f.clean('foo') - u'foo' - >>> f.clean('') - u'' - >>> f.clean(None) - u'' - >>> f.clean(0) - u'0' - >>> f.clean(True) - u'True' - >>> f.clean(False) - u'False' - -If a ``Field`` has ``required=False`` and you pass ``clean()`` an empty value, -then ``clean()`` will return a *normalized* empty value rather than raising -``ValidationError``. For ``CharField``, this will be a Unicode empty string. -For other ``Field`` classes, it might be ``None``. (This varies from field to -field.) - -``label`` -~~~~~~~~~ - -The ``label`` argument lets you specify the "human-friendly" label for this -field. This is used when the ``Field`` is displayed in a ``Form``. - -As explained in "Outputting forms as HTML" above, the default label for a -``Field`` is generated from the field name by converting all underscores to -spaces and upper-casing the first letter. Specify ``label`` if that default -behavior doesn't result in an adequate label. - -Here's a full example ``Form`` that implements ``label`` for two of its fields. -We've specified ``auto_id=False`` to simplify the output:: - - >>> class CommentForm(forms.Form): - ... name = forms.CharField(label='Your name') - ... url = forms.URLField(label='Your Web site', required=False) - ... comment = forms.CharField() - >>> f = CommentForm(auto_id=False) - >>> print f - <tr><th>Your name:</th><td><input type="text" name="name" /></td></tr> - <tr><th>Your Web site:</th><td><input type="text" name="url" /></td></tr> - <tr><th>Comment:</th><td><input type="text" name="comment" /></td></tr> - -``initial`` -~~~~~~~~~~~ - -The ``initial`` argument lets you specify the initial value to use when -rendering this ``Field`` in an unbound ``Form``. - -The use-case for this is when you want to display an "empty" form in which a -field is initialized to a particular value. For example:: - - >>> class CommentForm(forms.Form): - ... name = forms.CharField(initial='Your name') - ... url = forms.URLField(initial='http://') - ... comment = forms.CharField() - >>> f = CommentForm(auto_id=False) - >>> print f - <tr><th>Name:</th><td><input type="text" name="name" value="Your name" /></td></tr> - <tr><th>Url:</th><td><input type="text" name="url" value="http://" /></td></tr> - <tr><th>Comment:</th><td><input type="text" name="comment" /></td></tr> - -You may be thinking, why not just pass a dictionary of the initial values as -data when displaying the form? Well, if you do that, you'll trigger validation, -and the HTML output will include any validation errors:: - - >>> class CommentForm(forms.Form): - ... name = forms.CharField() - ... url = forms.URLField() - ... comment = forms.CharField() - >>> default_data = {'name': 'Your name', 'url': 'http://'} - >>> f = CommentForm(default_data, auto_id=False) - >>> print f - <tr><th>Name:</th><td><input type="text" name="name" value="Your name" /></td></tr> - <tr><th>Url:</th><td><ul class="errorlist"><li>Enter a valid URL.</li></ul><input type="text" name="url" value="http://" /></td></tr> - <tr><th>Comment:</th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="text" name="comment" /></td></tr> - -This is why ``initial`` values are only displayed for unbound forms. For bound -forms, the HTML output will use the bound data. - -Also note that ``initial`` values are *not* used as "fallback" data in -validation if a particular field's value is not given. ``initial`` values are -*only* intended for initial form display:: - - >>> class CommentForm(forms.Form): - ... name = forms.CharField(initial='Your name') - ... url = forms.URLField(initial='http://') - ... comment = forms.CharField() - >>> data = {'name': '', 'url': '', 'comment': 'Foo'} - >>> f = CommentForm(data) - >>> f.is_valid() - False - # The form does *not* fall back to using the initial values. - >>> f.errors - {'url': [u'This field is required.'], 'name': [u'This field is required.']} - -``widget`` -~~~~~~~~~~ - -The ``widget`` argument lets you specify a ``Widget`` class to use when -rendering this ``Field``. See `Widgets`_ below for more information. - -``help_text`` -~~~~~~~~~~~~~ - -The ``help_text`` argument lets you specify descriptive text for this -``Field``. If you provide ``help_text``, it will be displayed next to the -``Field`` when the ``Field`` is rendered by one of the convenience ``Form`` -methods (e.g., ``as_ul()``). - -Here's a full example ``Form`` that implements ``help_text`` for two of its -fields. We've specified ``auto_id=False`` to simplify the output:: - - >>> class HelpTextContactForm(forms.Form): - ... subject = forms.CharField(max_length=100, help_text='100 characters max.') - ... message = forms.CharField() - ... sender = forms.EmailField(help_text='A valid e-mail address, please.') - ... cc_myself = forms.BooleanField(required=False) - >>> f = HelpTextContactForm(auto_id=False) - >>> print f.as_table() - <tr><th>Subject:</th><td><input type="text" name="subject" maxlength="100" /><br />100 characters max.</td></tr> - <tr><th>Message:</th><td><input type="text" name="message" /></td></tr> - <tr><th>Sender:</th><td><input type="text" name="sender" /><br />A valid e-mail address, please.</td></tr> - <tr><th>Cc myself:</th><td><input type="checkbox" name="cc_myself" /></td></tr> - >>> print f.as_ul() - <li>Subject: <input type="text" name="subject" maxlength="100" /> 100 characters max.</li> - <li>Message: <input type="text" name="message" /></li> - <li>Sender: <input type="text" name="sender" /> A valid e-mail address, please.</li> - <li>Cc myself: <input type="checkbox" name="cc_myself" /></li> - >>> print f.as_p() - <p>Subject: <input type="text" name="subject" maxlength="100" /> 100 characters max.</p> - <p>Message: <input type="text" name="message" /></p> - <p>Sender: <input type="text" name="sender" /> A valid e-mail address, please.</p> - <p>Cc myself: <input type="checkbox" name="cc_myself" /></p> - -``error_messages`` -~~~~~~~~~~~~~~~~~~ - -**New in Django development version** - -The ``error_messages`` argument lets you override the default messages that the -field will raise. Pass in a dictionary with keys matching the error messages you -want to override. For example, here is the default error message:: - - >>> generic = forms.CharField() - >>> generic.clean('') - Traceback (most recent call last): - ... - ValidationError: [u'This field is required.'] - -And here is a custom error message:: - - >>> name = forms.CharField(error_messages={'required': 'Please enter your name'}) - >>> name.clean('') - Traceback (most recent call last): - ... - ValidationError: [u'Please enter your name'] - -In the `built-in Field classes`_ section below, each ``Field`` defines the -error message keys it uses. - -Dynamic initial values ----------------------- - -The ``initial`` argument to ``Field`` (explained above) lets you hard-code the -initial value for a ``Field`` -- but what if you want to declare the initial -value at runtime? For example, you might want to fill in a ``username`` field -with the username of the current session. - -To accomplish this, use the ``initial`` argument to a ``Form``. This argument, -if given, should be a dictionary mapping field names to initial values. Only -include the fields for which you're specifying an initial value; it's not -necessary to include every field in your form. For example:: - - >>> class CommentForm(forms.Form): - ... name = forms.CharField() - ... url = forms.URLField() - ... comment = forms.CharField() - >>> f = CommentForm(initial={'name': 'your username'}, auto_id=False) - >>> print f - <tr><th>Name:</th><td><input type="text" name="name" value="your username" /></td></tr> - <tr><th>Url:</th><td><input type="text" name="url" /></td></tr> - <tr><th>Comment:</th><td><input type="text" name="comment" /></td></tr> - >>> f = CommentForm(initial={'name': 'another username'}, auto_id=False) - >>> print f - <tr><th>Name:</th><td><input type="text" name="name" value="another username" /></td></tr> - <tr><th>Url:</th><td><input type="text" name="url" /></td></tr> - <tr><th>Comment:</th><td><input type="text" name="comment" /></td></tr> - -Just like the ``initial`` parameter to ``Field``, these values are only -displayed for unbound forms, and they're not used as fallback values if a -particular value isn't provided. - -Finally, note that if a ``Field`` defines ``initial`` *and* you include -``initial`` when instantiating the ``Form``, then the latter ``initial`` will -have precedence. In this example, ``initial`` is provided both at the field -level and at the form instance level, and the latter gets precedence:: - - >>> class CommentForm(forms.Form): - ... name = forms.CharField(initial='class') - ... url = forms.URLField() - ... comment = forms.CharField() - >>> f = CommentForm(initial={'name': 'instance'}, auto_id=False) - >>> print f - <tr><th>Name:</th><td><input type="text" name="name" value="instance" /></td></tr> - <tr><th>Url:</th><td><input type="text" name="url" /></td></tr> - <tr><th>Comment:</th><td><input type="text" name="comment" /></td></tr> - -Built-in ``Field`` classes --------------------------- - -Naturally, the ``forms`` library comes with a set of ``Field`` classes that -represent common validation needs. This section documents each built-in field. - -For each field, we describe the default widget used if you don't specify -``widget``. We also specify the value returned when you provide an empty value -(see the section on ``required`` above to understand what that means). - -``BooleanField`` -~~~~~~~~~~~~~~~~ - - * Default widget: ``CheckboxInput`` - * Empty value: ``False`` - * Normalizes to: A Python ``True`` or ``False`` value. - * Validates that the check box is checked (i.e. the value is ``True``) if - the field has ``required=True``. - * Error message keys: ``required`` - -**New in Django development version:** The empty value for a ``CheckboxInput`` -(and hence the standard ``BooleanField``) has changed to return ``False`` -instead of ``None`` in the development version. - -.. note:: - Since all ``Field`` subclasses have ``required=True`` by default, the - validation condition here is important. If you want to include a checkbox - in your form that can be either checked or unchecked, you must remember to - pass in ``required=False`` when creating the ``BooleanField``. - -``CharField`` -~~~~~~~~~~~~~ - - * Default widget: ``TextInput`` - * Empty value: ``''`` (an empty string) - * Normalizes to: A Unicode object. - * Validates ``max_length`` or ``min_length``, if they are provided. - Otherwise, all inputs are valid. - * Error message keys: ``required``, ``max_length``, ``min_length`` - -Has two optional arguments for validation, ``max_length`` and ``min_length``. -If provided, these arguments ensure that the string is at most or at least the -given length. - -``ChoiceField`` -~~~~~~~~~~~~~~~ - - * Default widget: ``Select`` - * Empty value: ``''`` (an empty string) - * Normalizes to: A Unicode object. - * Validates that the given value exists in the list of choices. - * Error message keys: ``required``, ``invalid_choice`` - -Takes one extra argument, ``choices``, which is an iterable (e.g., a list or -tuple) of 2-tuples to use as choices for this field. This argument accepts -the same formats as the ``choices`` argument to a model field. See the -`model API documentation on choices`_ for more details. - -.. _model API documentation on choices: ../model-api#choices - -``DateField`` -~~~~~~~~~~~~~ - - * Default widget: ``TextInput`` - * Empty value: ``None`` - * Normalizes to: A Python ``datetime.date`` object. - * Validates that the given value is either a ``datetime.date``, - ``datetime.datetime`` or string formatted in a particular date format. - * Error message keys: ``required``, ``invalid`` - -Takes one optional argument, ``input_formats``, which is a list of formats used -to attempt to convert a string to a valid ``datetime.date`` object. - -If no ``input_formats`` argument is provided, the default input formats are:: - - '%Y-%m-%d', '%m/%d/%Y', '%m/%d/%y', # '2006-10-25', '10/25/2006', '10/25/06' - '%b %d %Y', '%b %d, %Y', # 'Oct 25 2006', 'Oct 25, 2006' - '%d %b %Y', '%d %b, %Y', # '25 Oct 2006', '25 Oct, 2006' - '%B %d %Y', '%B %d, %Y', # 'October 25 2006', 'October 25, 2006' - '%d %B %Y', '%d %B, %Y', # '25 October 2006', '25 October, 2006' - -``DateTimeField`` -~~~~~~~~~~~~~~~~~ - - * Default widget: ``DateTimeInput`` - * Empty value: ``None`` - * Normalizes to: A Python ``datetime.datetime`` object. - * Validates that the given value is either a ``datetime.datetime``, - ``datetime.date`` or string formatted in a particular datetime format. - * Error message keys: ``required``, ``invalid`` - -Takes one optional argument, ``input_formats``, which is a list of formats used -to attempt to convert a string to a valid ``datetime.datetime`` object. - -If no ``input_formats`` argument is provided, the default input formats are:: - - '%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59' - '%Y-%m-%d %H:%M', # '2006-10-25 14:30' - '%Y-%m-%d', # '2006-10-25' - '%m/%d/%Y %H:%M:%S', # '10/25/2006 14:30:59' - '%m/%d/%Y %H:%M', # '10/25/2006 14:30' - '%m/%d/%Y', # '10/25/2006' - '%m/%d/%y %H:%M:%S', # '10/25/06 14:30:59' - '%m/%d/%y %H:%M', # '10/25/06 14:30' - '%m/%d/%y', # '10/25/06' - -**New in Django development version:** The ``DateTimeField`` used to use a -``TextInput`` widget by default. This has now changed. - -``DecimalField`` -~~~~~~~~~~~~~~~~ - -**New in Django development version** - - * Default widget: ``TextInput`` - * Empty value: ``None`` - * Normalizes to: A Python ``decimal``. - * Validates that the given value is a decimal. Leading and trailing - whitespace is ignored. - * Error message keys: ``required``, ``invalid``, ``max_value``, - ``min_value``, ``max_digits``, ``max_decimal_places``, - ``max_whole_digits`` - -Takes four optional arguments: ``max_value``, ``min_value``, ``max_digits``, -and ``decimal_places``. The first two define the limits for the fields value. -``max_digits`` is the maximum number of digits (those before the decimal -point plus those after the decimal point, with leading zeros stripped) -permitted in the value, whilst ``decimal_places`` is the maximum number of -decimal places permitted. - -``EmailField`` -~~~~~~~~~~~~~~ - - * Default widget: ``TextInput`` - * Empty value: ``''`` (an empty string) - * Normalizes to: A Unicode object. - * Validates that the given value is a valid e-mail address, using a - moderately complex regular expression. - * Error message keys: ``required``, ``invalid`` - -Has two optional arguments for validation, ``max_length`` and ``min_length``. -If provided, these arguments ensure that the string is at most or at least the -given length. - -``FileField`` -~~~~~~~~~~~~~ - -**New in Django development version** - - * Default widget: ``FileInput`` - * Empty value: ``None`` - * Normalizes to: An ``UploadedFile`` object that wraps the file content - and file name into a single object. - * Validates that non-empty file data has been bound to the form. - * Error message keys: ``required``, ``invalid``, ``missing``, ``empty`` - -To learn more about the ``UploadedFile`` object, see the `file uploads documentation`_. - -When you use a ``FileField`` in a form, you must also remember to -`bind the file data to the form`_. - -.. _file uploads documentation: ../upload_handling/ -.. _`bind the file data to the form`: `Binding uploaded files to a form`_ - -``FilePathField`` -~~~~~~~~~~~~~~~~~ - -**New in Django development version** - - * Default widget: ``Select`` - * Empty value: ``None`` - * Normalizes to: A unicode object - * Validates that the selected choice exists in the list of choices. - * Error message keys: ``required``, ``invalid_choice`` - -The field allows choosing from files inside a certain directory. It takes three -extra arguments: - - ============== ========== =============================================== - Argument Required? Description - ============== ========== =============================================== - ``path`` Yes The absolute path to the directory whose - contents you want listed. This directory must - exist. - - ``recursive`` No If ``False`` (the default) only the direct - contents of ``path`` will be offered as choices. - If ``True``, the directory will be descended - into recursively and all descendants will be - listed as choices. - - ``match`` No A regular expression pattern; only files with - names matching this expression will be allowed - as choices. - ============== ========== =============================================== - -``FloatField`` -~~~~~~~~~~~~~~ - - * Default widget: ``TextInput`` - * Empty value: ``None`` - * Normalizes to: A Python float. - * Validates that the given value is an float. Leading and trailing - whitespace is allowed, as in Python's ``float()`` function. - * Error message keys: ``required``, ``invalid``, ``max_value``, - ``min_value`` - -Takes two optional arguments for validation, ``max_value`` and ``min_value``. -These control the range of values permitted in the field. - -``ImageField`` -~~~~~~~~~~~~~~ - -**New in Django development version** - - * Default widget: ``FileInput`` - * Empty value: ``None`` - * Normalizes to: An ``UploadedFile`` object that wraps the file content - and file name into a single object. - * Validates that file data has been bound to the form, and that the - file is of an image format understood by PIL. - * Error message keys: ``required``, ``invalid``, ``missing``, ``empty``, - ``invalid_image`` - -Using an ImageField requires that the `Python Imaging Library`_ is installed. - -When you use an ``ImageField`` in a form, you must also remember to -`bind the file data to the form`_. - -.. _Python Imaging Library: http://www.pythonware.com/products/pil/ - -``IntegerField`` -~~~~~~~~~~~~~~~~ - - * Default widget: ``TextInput`` - * Empty value: ``None`` - * Normalizes to: A Python integer or long integer. - * Validates that the given value is an integer. Leading and trailing - whitespace is allowed, as in Python's ``int()`` function. - * Error message keys: ``required``, ``invalid``, ``max_value``, - ``min_value`` - -Takes two optional arguments for validation, ``max_value`` and ``min_value``. -These control the range of values permitted in the field. - -``IPAddressField`` -~~~~~~~~~~~~~~~~~~ - - * Default widget: ``TextInput`` - * Empty value: ``''`` (an empty string) - * Normalizes to: A Unicode object. - * Validates that the given value is a valid IPv4 address, using a regular - expression. - * Error message keys: ``required``, ``invalid`` - -``MultipleChoiceField`` -~~~~~~~~~~~~~~~~~~~~~~~ - - * Default widget: ``SelectMultiple`` - * Empty value: ``[]`` (an empty list) - * Normalizes to: A list of Unicode objects. - * Validates that every value in the given list of values exists in the list - of choices. - * Error message keys: ``required``, ``invalid_choice``, ``invalid_list`` - -Takes one extra argument, ``choices``, which is an iterable (e.g., a list or -tuple) of 2-tuples to use as choices for this field. This argument accepts -the same formats as the ``choices`` argument to a model field. See the -`model API documentation on choices`_ for more details. - -``NullBooleanField`` -~~~~~~~~~~~~~~~~~~~~ - - * Default widget: ``NullBooleanSelect`` - * Empty value: ``None`` - * Normalizes to: A Python ``True``, ``False`` or ``None`` value. - * Validates nothing (i.e., it never raises a ``ValidationError``). - -``RegexField`` -~~~~~~~~~~~~~~ - - * Default widget: ``TextInput`` - * Empty value: ``''`` (an empty string) - * Normalizes to: A Unicode object. - * Validates that the given value matches against a certain regular - expression. - * Error message keys: ``required``, ``invalid`` - -Takes one required argument, ``regex``, which is a regular expression specified -either as a string or a compiled regular expression object. - -Also takes the following optional arguments: - - ====================== ===================================================== - Argument Description - ====================== ===================================================== - ``max_length`` Ensures the string has at most this many characters. - ``min_length`` Ensures the string has at least this many characters. - ====================== ===================================================== - -The optional argument ``error_message`` is also accepted for backwards -compatibility. The preferred way to provide an error message is to use the -``error_messages`` argument, passing a dictionary with ``'invalid'`` as a key -and the error message as the value. - -``TimeField`` -~~~~~~~~~~~~~ - - * Default widget: ``TextInput`` - * Empty value: ``None`` - * Normalizes to: A Python ``datetime.time`` object. - * Validates that the given value is either a ``datetime.time`` or string - formatted in a particular time format. - * Error message keys: ``required``, ``invalid`` - -Takes one optional argument, ``input_formats``, which is a list of formats used -to attempt to convert a string to a valid ``datetime.time`` object. - -If no ``input_formats`` argument is provided, the default input formats are:: - - '%H:%M:%S', # '14:30:59' - '%H:%M', # '14:30' - -``URLField`` -~~~~~~~~~~~~ - - * Default widget: ``TextInput`` - * Empty value: ``''`` (an empty string) - * Normalizes to: A Unicode object. - * Validates that the given value is a valid URL. - * Error message keys: ``required``, ``invalid``, ``invalid_link`` - -Takes the following optional arguments: - - ======================== ===================================================== - Argument Description - ======================== ===================================================== - ``max_length`` Ensures the string has at most this many characters. - ``min_length`` Ensures the string has at least this many characters. - ``verify_exists`` If ``True``, the validator will attempt to load the - given URL, raising ``ValidationError`` if the page - gives a 404. Defaults to ``False``. - ``validator_user_agent`` String used as the user-agent used when checking for - a URL's existence. Defaults to the value of the - ``URL_VALIDATOR_USER_AGENT`` setting. - ======================== ===================================================== - -Slightly complex built-in ``Field`` classes -------------------------------------------- - -The following are not yet documented here. See the unit tests, linked-to from -the bottom of this document, for examples of their use. - -``ComboField`` -~~~~~~~~~~~~~~ - -``MultiValueField`` -~~~~~~~~~~~~~~~~~~~ - -``SplitDateTimeField`` -~~~~~~~~~~~~~~~~~~~~~~ - -Fields which handle relationships ---------------------------------- - -For representing relationships between models, two fields are -provided which can derive their choices from a ``QuerySet``, and which -place one or more model objects into the ``cleaned_data`` dictionary -of forms in which they're used. Both of these fields have an -additional required argument: - -``queryset`` - A ``QuerySet`` of model objects from which the choices for the - field will be derived, and which will be used to validate the - user's selection. - -``ModelChoiceField`` -~~~~~~~~~~~~~~~~~~~~ - -Allows the selection of a single model object, suitable for -representing a foreign key. - -The ``__unicode__`` method of the model will be called to generate -string representations of the objects for use in the field's choices; -to provide customized representations, subclass ``ModelChoiceField`` -and override ``label_from_instance``. This method will receive a model -object, and should return a string suitable for representing it. For -example:: - - class MyModelChoiceField(ModelChoiceField): - def label_from_instance(self, obj): - return "My Object #%i" % obj.id - -``ModelMultipleChoiceField`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Allows the selection of one or more model objects, suitable for -representing a many-to-many relation. As with ``ModelChoiceField``, -you can use ``label_from_instance`` to customize the object -representations. - -Creating custom fields ----------------------- - -If the built-in ``Field`` classes don't meet your needs, you can easily create -custom ``Field`` classes. To do this, just create a subclass of -``django.forms.Field``. Its only requirements are that it implement a -``clean()`` method and that its ``__init__()`` method accept the core arguments -mentioned above (``required``, ``label``, ``initial``, ``widget``, -``help_text``). - -Custom form and field validation ---------------------------------- - -Form validation happens when the data is cleaned. If you want to customize -this process, there are various places you can change, each one serving a -different purpose. Three types of cleaning methods are run during form -processing. These are normally executed when you call the ``is_valid()`` -method on a form. There are other things that can trigger cleaning and -validation (accessing the ``errors`` attribute or calling ``full_clean()`` -directly), but normally they won't be needed. - -In general, any cleaning method can raise ``ValidationError`` if there is a -problem with the data it is processing, passing the relevant error message to -the ``ValidationError`` constructor. If no ``ValidationError`` is raised, the -method should return the cleaned (normalized) data as a Python object. - -If you detect multiple errors during a cleaning method and wish to signal all -of them to the form submitter, it is possible to pass a list of errors to the -``ValidationError`` constructor. - -The three types of cleaning methods are: - - * The ``clean()`` method on a Field subclass. This is responsible - for cleaning the data in a way that is generic for that type of field. - For example, a FloatField will turn the data into a Python ``float`` or - raise a ``ValidationError``. - - * The ``clean_<fieldname>()`` method in a form subclass -- where - ``<fieldname>`` is replaced with the name of the form field attribute. - This method does any cleaning that is specific to that particular - attribute, unrelated to the type of field that it is. This method is not - passed any parameters. You will need to look up the value of the field - in ``self.cleaned_data`` and remember that it will be a Python object - at this point, not the original string submitted in the form (it will be - in ``cleaned_data`` because the general field ``clean()`` method, above, - has already cleaned the data once). - - For example, if you wanted to validate that the contents of a - ``CharField`` called ``serialnumber`` was unique, - ``clean_serialnumber()`` would be the right place to do this. You don't - need a specific field (it's just a ``CharField``), but you want a - formfield-specific piece of validation and, possibly, - cleaning/normalizing the data. - - * The Form subclass's ``clean()`` method. This method can perform - any validation that requires access to multiple fields from the form at - once. This is where you might put in things to check that if field ``A`` - is supplied, field ``B`` must contain a valid e-mail address and the - like. The data that this method returns is the final ``cleaned_data`` - attribute for the form, so don't forget to return the full list of - cleaned data if you override this method (by default, ``Form.clean()`` - just returns ``self.cleaned_data``). - - Note that any errors raised by your ``Form.clean()`` override will not - be associated with any field in particular. They go into a special - "field" (called ``__all__``), which you can access via the - ``non_field_errors()`` method if you need to. - -These methods are run in the order given above, one field at a time. That is, -for each field in the form (in the order they are declared in the form -definition), the ``Field.clean()`` method (or its override) is run, then -``clean_<fieldname>()``. Finally, once those two methods are run for every -field, the ``Form.clean()`` method, or its override, is executed. - -As mentioned above, any of these methods can raise a ``ValidationError``. For -any field, if the ``Field.clean()`` method raises a ``ValidationError``, any -field-specific cleaning method is not called. However, the cleaning methods -for all remaining fields are still executed. - -The ``clean()`` method for the ``Form`` class or subclass is always run. If -that method raises a ``ValidationError``, ``cleaned_data`` will be an empty -dictionary. - -The previous paragraph means that if you are overriding ``Form.clean()``, you -should iterate through ``self.cleaned_data.items()``, possibly considering the -``_errors`` dictionary attribute on the form as well. In this way, you will -already know which fields have passed their individual validation requirements. - -A simple example -~~~~~~~~~~~~~~~~ - -Here's a simple example of a custom field that validates its input is a string -containing comma-separated e-mail addresses, with at least one address. We'll -keep it simple and assume e-mail validation is contained in a function called -``is_valid_email()``. The full class:: - - from django import forms - - class MultiEmailField(forms.Field): - def clean(self, value): - if not value: - raise forms.ValidationError('Enter at least one e-mail address.') - emails = value.split(',') - for email in emails: - if not is_valid_email(email): - raise forms.ValidationError('%s is not a valid e-mail address.' % email) - return emails - -Let's alter the ongoing ``ContactForm`` example to demonstrate how you'd use -this in a form. Simply use ``MultiEmailField`` instead of ``forms.EmailField``, -like so:: - - class ContactForm(forms.Form): - subject = forms.CharField(max_length=100) - message = forms.CharField() - senders = MultiEmailField() - cc_myself = forms.BooleanField(required=False) - -Widgets -======= - -A widget is Django's representation of a HTML input element. The widget -handles the rendering of the HTML, and the extraction of data from a GET/POST -dictionary that corresponds to the widget. - -Django provides a representation of all the basic HTML widgets, plus some -commonly used groups of widgets: - - ============================ =========================================== - Widget HTML Equivalent - ============================ =========================================== - ``TextInput`` ``<input type='text' ...`` - ``PasswordInput`` ``<input type='password' ...`` - ``HiddenInput`` ``<input type='hidden' ...`` - ``MultipleHiddenInput`` Multiple ``<input type='hidden' ...`` - instances. - ``FileInput`` ``<input type='file' ...`` - ``DateTimeInput`` ``<input type='text' ...`` - ``Textarea`` ``<textarea>...</textarea>`` - ``CheckboxInput`` ``<input type='checkbox' ...`` - ``Select`` ``<select><option ...`` - ``NullBooleanSelect`` Select widget with options 'Unknown', - 'Yes' and 'No' - ``SelectMultiple`` ``<select multiple='multiple'><option ...`` - ``RadioSelect`` ``<ul><li><input type='radio' ...`` - ``CheckboxSelectMultiple`` ``<ul><li><input type='checkbox' ...`` - ``MultiWidget`` Wrapper around multiple other widgets - ``SplitDateTimeWidget`` Wrapper around two ``TextInput`` widgets: - one for the Date, and one for the Time. - ============================ =========================================== - -**New in Django development version:** The ``DateTimeInput`` has been added -since the last release. - -Specifying widgets ------------------- - -Whenever you specify a field on a form, Django will use a default widget -that is appropriate to the type of data that is to be displayed. To find -which widget is used on which field, see the documentation for the -built-in Field classes. - -However, if you want to use a different widget for a field, you can - -just use the 'widget' argument on the field definition. For example:: - - class CommentForm(forms.Form): - name = forms.CharField() - url = forms.URLField() - comment = forms.CharField(widget=forms.Textarea) - -This would specify a form with a comment that uses a larger Textarea widget, -rather than the default TextInput widget. - -Customizing widget instances ----------------------------- - -When Django renders a widget as HTML, it only renders the bare minimum -HTML - Django doesn't add a class definition, or any other widget-specific -attributes. This means that all 'TextInput' widgets will appear the same -on your Web page. - -If you want to make one widget look different to another, you need to -specify additional attributes for each widget. When you specify a -widget, you can provide a list of attributes that will be added to the -rendered HTML for the widget. - -For example, take the following simple form:: - - class CommentForm(forms.Form): - name = forms.CharField() - url = forms.URLField() - comment = forms.CharField() - -This form will include three default TextInput widgets, with default rendering - -no CSS class, no extra attributes. This means that the input boxes provided for -each widget will be rendered exactly the same:: - - >>> f = CommentForm(auto_id=False) - >>> f.as_table() - <tr><th>Name:</th><td><input type="text" name="name" /></td></tr> - <tr><th>Url:</th><td><input type="text" name="url"/></td></tr> - <tr><th>Comment:</th><td><input type="text" name="comment" /></td></tr> - -On a real Web page, you probably don't want every widget to look the same. You -might want a larger input element for the comment, and you might want the -'name' widget to have some special CSS class. To do this, you specify a -custom widget for your fields, and specify some attributes to use -when rendering those widgets:: - - class CommentForm(forms.Form): - name = forms.CharField( - widget=forms.TextInput(attrs={'class':'special'})) - url = forms.URLField() - comment = forms.CharField( - widget=forms.TextInput(attrs={'size':'40'})) - -Django will then include the extra attributes in the rendered output:: - - >>> f = CommentForm(auto_id=False) - >>> f.as_table() - <tr><th>Name:</th><td><input type="text" name="name" class="special"/></td></tr> - <tr><th>Url:</th><td><input type="text" name="url"/></td></tr> - <tr><th>Comment:</th><td><input type="text" name="comment" size="40"/></td></tr> - -Custom Widgets --------------- - -When you start to write a lot of forms, you will probably find that you will -reuse certain sets of widget attributes over and over again. Rather than -repeat these attribute definitions every time you need them, Django allows -you to capture those definitions as a custom widget. - -For example, if you find that you are including a lot of comment fields on -forms, you could capture the idea of a ``TextInput`` with a specific -default ``size`` attribute as a custom extension to the ``TextInput`` widget:: - - class CommentWidget(forms.TextInput): - def __init__(self, *args, **kwargs): - attrs = kwargs.setdefault('attrs',{}) - if 'size' not in attrs: - attrs['size'] = 40 - super(CommentWidget, self).__init__(*args, **kwargs) - -We allow the ``size`` attribute to be overridden by the user, but, by default, -this widget will behave as if ``attrs={'size': 40}`` was always passed into the -constructor. - -Then you can use this widget in your forms:: - - class CommentForm(forms.Form): - name = forms.CharField() - url = forms.URLField() - comment = forms.CharField(widget=CommentWidget) - -You can even customize your custom widget, in the same way as you would -any other widget. Adding a once-off class to your ``CommentWidget`` is as -simple as adding an attribute definition:: - - class CommentForm(forms.Form): - name = forms.CharField(max_length=20) - url = forms.URLField() - comment = forms.CharField( - widget=CommentWidget(attrs={'class': 'special'})) - -Django also makes it easy to specify a custom field type that uses your custom -widget. For example, you could define a customized field type for comments -by defining:: - - class CommentInput(forms.CharField): - widget = CommentWidget - -You can then use this field whenever you have a form that requires a comment:: - - class CommentForm(forms.Form): - name = forms.CharField() - url = forms.URLField() - comment = CommentInput() - -Generating forms for models -=========================== - -The prefered way of generating forms that work with models is explained in the -`ModelForms documentation`_. - -.. _ModelForms documentation: ../modelforms/ - -Media -===== - -Rendering an attractive and easy-to-use web form requires more than just -HTML - it also requires CSS stylesheets, and if you want to use fancy -"Web2.0" widgets, you may also need to include some JavaScript on each -page. The exact combination of CSS and JavaScript that is required for -any given page will depend upon the widgets that are in use on that page. - -This is where Django media definitions come in. Django allows you to -associate different media files with the forms and widgets that require -that media. For example, if you want to use a calendar to render DateFields, -you can define a custom Calendar widget. This widget can then be associated -with the CSS and JavaScript that is required to render the calendar. When -the Calendar widget is used on a form, Django is able to identify the CSS and -JavaScript files that are required, and provide the list of file names -in a form suitable for easy inclusion on your web page. - -.. admonition:: Media and Django Admin - - The Django Admin application defines a number of customized widgets - for calendars, filtered selections, and so on. These widgets define - media requirements, and the Django Admin uses the custom widgets - in place of the Django defaults. The Admin templates will only include - those media files that are required to render the widgets on any - given page. - - If you like the widgets that the Django Admin application uses, - feel free to use them in your own application! They're all stored - in ``django.contrib.admin.widgets``. - -.. admonition:: Which JavaScript toolkit? - - Many JavaScript toolkits exist, and many of them include widgets (such - as calendar widgets) that can be used to enhance your application. - Django has deliberately avoided blessing any one JavaScript toolkit. - Each toolkit has its own relative strengths and weaknesses - use - whichever toolkit suits your requirements. Django is able to integrate - with any JavaScript toolkit. - -Media as a static definition ----------------------------- - -The easiest way to define media is as a static definition. Using this method, -the media declaration is an inner class. The properties of the inner class -define the media requirements. - -Here's a simple example:: - - class CalendarWidget(forms.TextInput): - class Media: - css = { - 'all': ('pretty.css',) - } - js = ('animations.js', 'actions.js') - -This code defines a ``CalendarWidget``, which will be based on ``TextInput``. -Every time the CalendarWidget is used on a form, that form will be directed -to include the CSS file ``pretty.css``, and the JavaScript files -``animations.js`` and ``actions.js``. - -This static media definition is converted at runtime into a widget property -named ``media``. The media for a CalendarWidget instance can be retrieved -through this property:: - - >>> w = CalendarWidget() - >>> print w.media - <link href="http://media.example.com/pretty.css" type="text/css" media="all" rel="stylesheet" /> - <script type="text/javascript" src="http://media.example.com/animations.js"></script> - <script type="text/javascript" src="http://media.example.com/actions.js"></script> - -Here's a list of all possible ``Media`` options. There are no required options. - -``css`` -~~~~~~~ - -A dictionary describing the CSS files required for various forms of output -media. - -The values in the dictionary should be a tuple/list of file names. See -`the section on media paths`_ for details of how to specify paths to media -files. - -.. _the section on media paths: `Paths in media definitions`_ - -The keys in the dictionary are the output media types. These are the same -types accepted by CSS files in media declarations: 'all', 'aural', 'braille', -'embossed', 'handheld', 'print', 'projection', 'screen', 'tty' and 'tv'. If -you need to have different stylesheets for different media types, provide -a list of CSS files for each output medium. The following example would -provide two CSS options -- one for the screen, and one for print:: - - class Media: - css = { - 'screen': ('pretty.css',), - 'print': ('newspaper.css',) - } - -If a group of CSS files are appropriate for multiple output media types, -the dictionary key can be a comma separated list of output media types. -In the following example, TV's and projectors will have the same media -requirements:: - - class Media: - css = { - 'screen': ('pretty.css',), - 'tv,projector': ('lo_res.css',), - 'print': ('newspaper.css',) - } - -If this last CSS definition were to be rendered, it would become the following HTML:: - - <link href="http://media.example.com/pretty.css" type="text/css" media="screen" rel="stylesheet" /> - <link href="http://media.example.com/lo_res.css" type="text/css" media="tv,projector" rel="stylesheet" /> - <link href="http://media.example.com/newspaper.css" type="text/css" media="print" rel="stylesheet" /> - -``js`` -~~~~~~ - -A tuple describing the required JavaScript files. See -`the section on media paths`_ for details of how to specify paths to media -files. - -``extend`` -~~~~~~~~~~ - -A boolean defining inheritance behavior for media declarations. - -By default, any object using a static media definition will inherit all the -media associated with the parent widget. This occurs regardless of how the -parent defines its media requirements. For example, if we were to extend our -basic Calendar widget from the example above:: - - class FancyCalendarWidget(CalendarWidget): - class Media: - css = { - 'all': ('fancy.css',) - } - js = ('whizbang.js',) - - >>> w = FancyCalendarWidget() - >>> print w.media - <link href="http://media.example.com/pretty.css" type="text/css" media="all" rel="stylesheet" /> - <link href="http://media.example.com/fancy.css" type="text/css" media="all" rel="stylesheet" /> - <script type="text/javascript" src="http://media.example.com/animations.js"></script> - <script type="text/javascript" src="http://media.example.com/actions.js"></script> - <script type="text/javascript" src="http://media.example.com/whizbang.js"></script> - -The FancyCalendar widget inherits all the media from it's parent widget. If -you don't want media to be inherited in this way, add an ``extend=False`` -declaration to the media declaration:: - - class FancyCalendar(Calendar): - class Media: - extend = False - css = { - 'all': ('fancy.css',) - } - js = ('whizbang.js',) - - >>> w = FancyCalendarWidget() - >>> print w.media - <link href="http://media.example.com/fancy.css" type="text/css" media="all" rel="stylesheet" /> - <script type="text/javascript" src="http://media.example.com/whizbang.js"></script> - -If you require even more control over media inheritance, define your media -using a `dynamic property`_. Dynamic properties give you complete control over -which media files are inherited, and which are not. - -.. _dynamic property: `Media as a dynamic property`_ - -Media as a dynamic property ---------------------------- - -If you need to perform some more sophisticated manipulation of media -requirements, you can define the media property directly. This is done -by defining a model property that returns an instance of ``forms.Media``. -The constructor for ``forms.Media`` accepts ``css`` and ``js`` keyword -arguments in the same format as that used in a static media definition. - -For example, the static media definition for our Calendar Widget could -also be defined in a dynamic fashion:: - - class CalendarWidget(forms.TextInput): - def _media(self): - return forms.Media(css={'all': ('pretty.css',)}, - js=('animations.js', 'actions.js')) - media = property(_media) - -See the section on `Media objects`_ for more details on how to construct -return values for dynamic media properties. - -Paths in media definitions --------------------------- - -Paths used to specify media can be either relative or absolute. If a path -starts with '/', 'http://' or 'https://', it will be interpreted as an absolute -path, and left as-is. All other paths will be prepended with the value of -``settings.MEDIA_URL``. For example, if the MEDIA_URL for your site was -``http://media.example.com/``:: - - class CalendarWidget(forms.TextInput): - class Media: - css = { - 'all': ('/css/pretty.css',), - } - js = ('animations.js', 'http://othersite.com/actions.js') - - >>> w = CalendarWidget() - >>> print w.media - <link href="/css/pretty.css" type="text/css" media="all" rel="stylesheet" /> - <script type="text/javascript" src="http://media.example.com/animations.js"></script> - <script type="text/javascript" src="http://othersite.com/actions.js"></script> - -Media objects -------------- - -When you interrogate the media attribute of a widget or form, the value that -is returned is a ``forms.Media`` object. As we have already seen, the string -representation of a Media object is the HTML required to include media -in the ``<head>`` block of your HTML page. - -However, Media objects have some other interesting properties. - -Media subsets -~~~~~~~~~~~~~ - -If you only want media of a particular type, you can use the subscript operator -to filter out a medium of interest. For example:: - - >>> w = CalendarWidget() - >>> print w.media - <link href="http://media.example.com/pretty.css" type="text/css" media="all" rel="stylesheet" /> - <script type="text/javascript" src="http://media.example.com/animations.js"></script> - <script type="text/javascript" src="http://media.example.com/actions.js"></script> - - >>> print w.media['css'] - <link href="http://media.example.com/pretty.css" type="text/css" media="all" rel="stylesheet" /> - -When you use the subscript operator, the value that is returned is a new -Media object -- but one that only contains the media of interest. - -Combining media objects -~~~~~~~~~~~~~~~~~~~~~~~ - -Media objects can also be added together. When two media objects are added, -the resulting Media object contains the union of the media from both files:: - - class CalendarWidget(forms.TextInput): - class Media: - css = { - 'all': ('pretty.css',) - } - js = ('animations.js', 'actions.js') - - class OtherWidget(forms.TextInput): - class Media: - js = ('whizbang.js',) - - >>> w1 = CalendarWidget() - >>> w2 = OtherWidget() - >>> print w1.media + w2.media - <link href="http://media.example.com/pretty.css" type="text/css" media="all" rel="stylesheet" /> - <script type="text/javascript" src="http://media.example.com/animations.js"></script> - <script type="text/javascript" src="http://media.example.com/actions.js"></script> - <script type="text/javascript" src="http://media.example.com/whizbang.js"></script> - -Media on Forms --------------- - -Widgets aren't the only objects that can have media definitions -- forms -can also define media. The rules for media definitions on forms are the -same as the rules for widgets: declarations can be static or dynamic; -path and inheritance rules for those declarations are exactly the same. - -Regardless of whether you define a media declaration, *all* Form objects -have a media property. The default value for this property is the result -of adding the media definitions for all widgets that are part of the form:: - - class ContactForm(forms.Form): - date = DateField(widget=CalendarWidget) - name = CharField(max_length=40, widget=OtherWidget) - - >>> f = ContactForm() - >>> f.media - <link href="http://media.example.com/pretty.css" type="text/css" media="all" rel="stylesheet" /> - <script type="text/javascript" src="http://media.example.com/animations.js"></script> - <script type="text/javascript" src="http://media.example.com/actions.js"></script> - <script type="text/javascript" src="http://media.example.com/whizbang.js"></script> - -If you want to associate additional media with a form -- for example, CSS for form -layout -- simply add a media declaration to the form:: - - class ContactForm(forms.Form): - date = DateField(widget=CalendarWidget) - name = CharField(max_length=40, widget=OtherWidget) - - class Media: - css = { - 'all': ('layout.css',) - } - - >>> f = ContactForm() - >>> f.media - <link href="http://media.example.com/pretty.css" type="text/css" media="all" rel="stylesheet" /> - <link href="http://media.example.com/layout.css" type="text/css" media="all" rel="stylesheet" /> - <script type="text/javascript" src="http://media.example.com/animations.js"></script> - <script type="text/javascript" src="http://media.example.com/actions.js"></script> - <script type="text/javascript" src="http://media.example.com/whizbang.js"></script> - -Formsets -======== - -A formset is a layer of abstraction to working with multiple forms on the same -page. It can be best compared to a data grid. Let's say you have the following -form:: - - >>> from django import forms - >>> class ArticleForm(forms.Form): - ... title = forms.CharField() - ... pub_date = forms.DateField() - -You might want to allow the user to create several articles at once. To create -a formset out of an ``ArticleForm`` you would do:: - - >>> from django.forms.formsets import formset_factory - >>> ArticleFormSet = formset_factory(ArticleForm) - -You now have created a formset named ``ArticleFormSet``. The formset gives you -the ability to iterate over the forms in the formset and display them as you -would with a regular form:: - - >>> formset = ArticleFormSet() - >>> for form in formset.forms: - ... print form.as_table() - <tr><th><label for="id_form-0-title">Title:</label></th><td><input type="text" name="form-0-title" id="id_form-0-title" /></td></tr> - <tr><th><label for="id_form-0-pub_date">Pub date:</label></th><td><input type="text" name="form-0-pub_date" id="id_form-0-pub_date" /></td></tr> - -As you can see it only displayed one form. This is because by default the -``formset_factory`` defines one extra form. This can be controlled with the -``extra`` parameter:: - - >>> ArticleFormSet = formset_factory(ArticleForm, extra=2) - -Using initial data with a formset ---------------------------------- - -Initial data is what drives the main usability of a formset. As shown above -you can define the number of extra forms. What this means is that you are -telling the formset how many additional forms to show in addition to the -number of forms it generates from the initial data. Lets take a look at an -example:: - - >>> ArticleFormSet = formset_factory(ArticleForm, extra=2) - >>> formset = ArticleFormSet(initial=[ - ... {'title': u'Django is now open source', - ... 'pub_date': datetime.date.today()}, - ... ]) - - >>> for form in formset.forms: - ... print form.as_table() - <tr><th><label for="id_form-0-title">Title:</label></th><td><input type="text" name="form-0-title" value="Django is now open source" id="id_form-0-title" /></td></tr> - <tr><th><label for="id_form-0-pub_date">Pub date:</label></th><td><input type="text" name="form-0-pub_date" value="2008-05-12" id="id_form-0-pub_date" /></td></tr> - <tr><th><label for="id_form-1-title">Title:</label></th><td><input type="text" name="form-1-title" id="id_form-1-title" /></td></tr> - <tr><th><label for="id_form-1-pub_date">Pub date:</label></th><td><input type="text" name="form-1-pub_date" id="id_form-1-pub_date" /></td></tr> - <tr><th><label for="id_form-2-title">Title:</label></th><td><input type="text" name="form-2-title" id="id_form-2-title" /></td></tr> - <tr><th><label for="id_form-2-pub_date">Pub date:</label></th><td><input type="text" name="form-2-pub_date" id="id_form-2-pub_date" /></td></tr> - -There are now a total of three forms showing above. One for the initial data -that was passed in and two extra forms. Also note that we are passing in a -list of dictionaries as the initial data. - -Limiting the maximum number of forms ------------------------------------- - -The ``max_num`` parameter to ``formset_factory`` gives you the ability to -force the maximum number of forms the formset will display:: - - >>> ArticleFormSet = formset_factory(ArticleForm, extra=2, max_num=1) - >>> formset = ArticleFormset() - >>> for form in formset.forms: - ... print form.as_table() - <tr><th><label for="id_form-0-title">Title:</label></th><td><input type="text" name="form-0-title" id="id_form-0-title" /></td></tr> - <tr><th><label for="id_form-0-pub_date">Pub date:</label></th><td><input type="text" name="form-0-pub_date" id="id_form-0-pub_date" /></td></tr> - -The default value of ``max_num`` is ``0`` which is the same as saying put no -limit on the number forms displayed. - -Formset validation ------------------- - -Validation with a formset is about identical to a regular ``Form``. There is -an ``is_valid`` method on the formset to provide a convenient way to validate -each form in the formset:: - - >>> ArticleFormSet = formset_factory(ArticleForm) - >>> formset = ArticleFormSet({}) - >>> formset.is_valid() - True - -We passed in no data to the formset which is resulting in a valid form. The -formset is smart enough to ignore extra forms that were not changed. If we -attempt to provide an article, but fail to do so:: - - >>> data = { - ... 'form-TOTAL_FORMS': u'1', - ... 'form-INITIAL_FORMS': u'1', - ... 'form-0-title': u'Test', - ... 'form-0-pub_date': u'', - ... } - >>> formset = ArticleFormSet(data) - >>> formset.is_valid() - False - >>> formset.errors - [{'pub_date': [u'This field is required.']}] - -As we can see the formset properly performed validation and gave us the -expected errors. - -Understanding the ManagementForm -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -You may have noticed the additional data that was required in the formset's -data above. This data is coming from the ``ManagementForm``. This form is -dealt with internally to the formset. If you don't use it, it will result in -an exception:: - - >>> data = { - ... 'form-0-title': u'Test', - ... 'form-0-pub_date': u'', - ... } - >>> formset = ArticleFormSet(data) - Traceback (most recent call last): - ... - django.forms.util.ValidationError: [u'ManagementForm data is missing or has been tampered with'] - -It is used to keep track of how many form instances are being displayed. If -you are adding new forms via JavaScript, you should increment the count fields -in this form as well. - -Custom formset validation -~~~~~~~~~~~~~~~~~~~~~~~~~ - -A formset has a ``clean`` method similar to the one on a ``Form`` class. This -is where you define your own validation that deals at the formset level:: - - >>> from django.forms.formsets import BaseFormSet - - >>> class BaseArticleFormSet(BaseFormSet): - ... def clean(self): - ... raise forms.ValidationError, u'An error occured.' - - >>> ArticleFormSet = formset_factory(ArticleForm, formset=BaseArticleFormSet) - >>> formset = ArticleFormSet({}) - >>> formset.is_valid() - False - >>> formset.non_form_errors() - [u'An error occured.'] - -The formset ``clean`` method is called after all the ``Form.clean`` methods -have been called. The errors will be found using the ``non_form_errors()`` -method on the formset. - -Dealing with ordering and deletion of forms -------------------------------------------- - -Common use cases with a formset is dealing with ordering and deletion of the -form instances. This has been dealt with for you. The ``formset_factory`` -provides two optional parameters ``can_order`` and ``can_delete`` that will do -the extra work of adding the extra fields and providing simpler ways of -getting to that data. - -``can_order`` -~~~~~~~~~~~~~ - -Default: ``False`` - -Lets create a formset with the ability to order:: - - >>> ArticleFormSet = formset_factory(ArticleForm, can_order=True) - >>> formset = ArticleFormSet(initial=[ - ... {'title': u'Article #1', 'pub_date': datetime.date(2008, 5, 10)}, - ... {'title': u'Article #2', 'pub_date': datetime.date(2008, 5, 11)}, - ... ]) - >>> for form in formset.forms: - ... print form.as_table() - <tr><th><label for="id_form-0-title">Title:</label></th><td><input type="text" name="form-0-title" value="Article #1" id="id_form-0-title" /></td></tr> - <tr><th><label for="id_form-0-pub_date">Pub date:</label></th><td><input type="text" name="form-0-pub_date" value="2008-05-10" id="id_form-0-pub_date" /></td></tr> - <tr><th><label for="id_form-0-ORDER">Order:</label></th><td><input type="text" name="form-0-ORDER" value="1" id="id_form-0-ORDER" /></td></tr> - <tr><th><label for="id_form-1-title">Title:</label></th><td><input type="text" name="form-1-title" value="Article #2" id="id_form-1-title" /></td></tr> - <tr><th><label for="id_form-1-pub_date">Pub date:</label></th><td><input type="text" name="form-1-pub_date" value="2008-05-11" id="id_form-1-pub_date" /></td></tr> - <tr><th><label for="id_form-1-ORDER">Order:</label></th><td><input type="text" name="form-1-ORDER" value="2" id="id_form-1-ORDER" /></td></tr> - <tr><th><label for="id_form-2-title">Title:</label></th><td><input type="text" name="form-2-title" id="id_form-2-title" /></td></tr> - <tr><th><label for="id_form-2-pub_date">Pub date:</label></th><td><input type="text" name="form-2-pub_date" id="id_form-2-pub_date" /></td></tr> - <tr><th><label for="id_form-2-ORDER">Order:</label></th><td><input type="text" name="form-2-ORDER" id="id_form-2-ORDER" /></td></tr> - -This adds an additional field to each form. This new field is named ``ORDER`` -and is an ``forms.IntegerField``. For the forms that came from the initial -data it automatically assigned them a numeric value. Lets look at what will -happen when the user changes these values:: - - >>> data = { - ... 'form-TOTAL_FORMS': u'3', - ... 'form-INITIAL_FORMS': u'2', - ... 'form-0-title': u'Article #1', - ... 'form-0-pub_date': u'2008-05-10', - ... 'form-0-ORDER': u'2', - ... 'form-1-title': u'Article #2', - ... 'form-1-pub_date': u'2008-05-11', - ... 'form-1-ORDER': u'1', - ... 'form-2-title': u'Article #3', - ... 'form-2-pub_date': u'2008-05-01', - ... 'form-2-ORDER': u'0', - ... } - - >>> formset = ArticleFormSet(data, initial=[ - ... {'title': u'Article #1', 'pub_date': datetime.date(2008, 5, 10)}, - ... {'title': u'Article #2', 'pub_date': datetime.date(2008, 5, 11)}, - ... ]) - >>> formset.is_valid() - True - >>> for form in formset.ordered_forms: - ... print form.cleaned_data - {'pub_date': datetime.date(2008, 5, 1), 'ORDER': 0, 'title': u'Article #3'} - {'pub_date': datetime.date(2008, 5, 11), 'ORDER': 1, 'title': u'Article #2'} - {'pub_date': datetime.date(2008, 5, 10), 'ORDER': 2, 'title': u'Article #1'} - -``can_delete`` -~~~~~~~~~~~~~~ - -Default: ``False`` - -Lets create a formset with the ability to delete:: - - >>> ArticleFormSet = formset_factory(ArticleForm, can_delete=True) - >>> formset = ArticleFormSet(initial=[ - ... {'title': u'Article #1', 'pub_date': datetime.date(2008, 5, 10)}, - ... {'title': u'Article #2', 'pub_date': datetime.date(2008, 5, 11)}, - ... ]) - >>> for form in formset.forms: - .... print form.as_table() - <input type="hidden" name="form-TOTAL_FORMS" value="3" id="id_form-TOTAL_FORMS" /><input type="hidden" name="form-INITIAL_FORMS" value="2" id="id_form-INITIAL_FORMS" /> - <tr><th><label for="id_form-0-title">Title:</label></th><td><input type="text" name="form-0-title" value="Article #1" id="id_form-0-title" /></td></tr> - <tr><th><label for="id_form-0-pub_date">Pub date:</label></th><td><input type="text" name="form-0-pub_date" value="2008-05-10" id="id_form-0-pub_date" /></td></tr> - <tr><th><label for="id_form-0-DELETE">Delete:</label></th><td><input type="checkbox" name="form-0-DELETE" id="id_form-0-DELETE" /></td></tr> - <tr><th><label for="id_form-1-title">Title:</label></th><td><input type="text" name="form-1-title" value="Article #2" id="id_form-1-title" /></td></tr> - <tr><th><label for="id_form-1-pub_date">Pub date:</label></th><td><input type="text" name="form-1-pub_date" value="2008-05-11" id="id_form-1-pub_date" /></td></tr> - <tr><th><label for="id_form-1-DELETE">Delete:</label></th><td><input type="checkbox" name="form-1-DELETE" id="id_form-1-DELETE" /></td></tr> - <tr><th><label for="id_form-2-title">Title:</label></th><td><input type="text" name="form-2-title" id="id_form-2-title" /></td></tr> - <tr><th><label for="id_form-2-pub_date">Pub date:</label></th><td><input type="text" name="form-2-pub_date" id="id_form-2-pub_date" /></td></tr> - <tr><th><label for="id_form-2-DELETE">Delete:</label></th><td><input type="checkbox" name="form-2-DELETE" id="id_form-2-DELETE" /></td></tr> - -Similar to ``can_order`` this adds a new field to each form named ``DELETE`` -and is a ``forms.BooleanField``. When data comes through marking any of the -delete fields you can access them with ``deleted_forms``:: - - >>> data = { - ... 'form-TOTAL_FORMS': u'3', - ... 'form-INITIAL_FORMS': u'2', - ... 'form-0-title': u'Article #1', - ... 'form-0-pub_date': u'2008-05-10', - ... 'form-0-DELETE': u'on', - ... 'form-1-title': u'Article #2', - ... 'form-1-pub_date': u'2008-05-11', - ... 'form-1-DELETE': u'', - ... 'form-2-title': u'', - ... 'form-2-pub_date': u'', - ... 'form-2-DELETE': u'', - ... } - - >>> formset = ArticleFormSet(data, initial=[ - ... {'title': u'Article #1', 'pub_date': datetime.date(2008, 5, 10)}, - ... {'title': u'Article #2', 'pub_date': datetime.date(2008, 5, 11)}, - ... ]) - >>> [form.cleaned_data for form in formset.deleted_forms] - [{'DELETE': True, 'pub_date': datetime.date(2008, 5, 10), 'title': u'Article #1'}] - -Adding additional fields to a formset -------------------------------------- - -If you need to add additional fields to the formset this can be easily -accomplished. The formset base class provides an ``add_fields`` method. You -can simply override this method to add your own fields or even redefine the -default fields/attributes of the order and deletion fields:: - - >>> class BaseArticleFormSet(BaseFormSet): - ... def add_fields(self, form, index): - ... super(BaseArticleFormSet, self).add_fields(form, index) - ... form.fields["my_field"] = forms.CharField() - - >>> ArticleFormSet = formset_factory(ArticleForm, formset=BaseArticleFormSet) - >>> formset = ArticleFormSet() - >>> for form in formset.forms: - ... print form.as_table() - <tr><th><label for="id_form-0-title">Title:</label></th><td><input type="text" name="form-0-title" id="id_form-0-title" /></td></tr> - <tr><th><label for="id_form-0-pub_date">Pub date:</label></th><td><input type="text" name="form-0-pub_date" id="id_form-0-pub_date" /></td></tr> - <tr><th><label for="id_form-0-my_field">My field:</label></th><td><input type="text" name="form-0-my_field" id="id_form-0-my_field" /></td></tr> - -Using a formset in views and templates --------------------------------------- - -Using a formset inside a view is as easy as using a regular ``Form`` class. -The only thing you will want to be aware of is making sure to use the -management form inside the template. Lets look at a sample view:: - - def manage_articles(request): - ArticleFormSet = formset_factory(ArticleForm) - if request.method == 'POST': - formset = ArticleFormSet(request.POST, request.FILES) - if formset.is_valid(): - # do something with the formset.cleaned_data - else: - formset = ArticleFormSet() - return render_to_response('manage_articles.html', {'formset': formset}) - -The ``manage_articles.html`` template might look like this:: - - <form method="POST" action=""> - {{ formset.management_form }} - <table> - {% for form in formset.forms %} - {{ form }} - {% endfor %} - </table> - </form> - -However the above can be slightly shortcutted and let the formset itself deal -with the management form:: - - <form method="POST" action=""> - <table> - {{ formset }} - </table> - </form> - -The above ends up calling the ``as_table`` method on the formset class. diff --git a/docs/generic_views.txt b/docs/generic_views.txt deleted file mode 100644 index 8c0fec2ded..0000000000 --- a/docs/generic_views.txt +++ /dev/null @@ -1,1273 +0,0 @@ -============= -Generic views -============= - -Writing Web applications can be monotonous, because we repeat certain patterns -again and again. In Django, the most common of these patterns have been -abstracted into "generic views" that let you quickly provide common views of -an object without actually needing to write any Python code. - -Django's generic views contain the following: - - * A set of views for doing list/detail interfaces (for example, - Django's `documentation index`_ and `detail pages`_). - - * A set of views for year/month/day archive pages and associated - detail and "latest" pages (for example, the Django weblog's year_, - month_, day_, detail_, and latest_ pages). - - * A set of views for creating, editing, and deleting objects. - -.. _`documentation index`: http://www.djangoproject.com/documentation/ -.. _`detail pages`: http://www.djangoproject.com/documentation/faq/ -.. _year: http://www.djangoproject.com/weblog/2005/ -.. _month: http://www.djangoproject.com/weblog/2005/jul/ -.. _day: http://www.djangoproject.com/weblog/2005/jul/20/ -.. _detail: http://www.djangoproject.com/weblog/2005/jul/20/autoreload/ -.. _latest: http://www.djangoproject.com/weblog/ - -All of these views are used by creating configuration dictionaries in -your URLconf files and passing those dictionaries as the third member of the -URLconf tuple for a given pattern. For example, here's the URLconf for the -simple weblog app that drives the blog on djangoproject.com:: - - from django.conf.urls.defaults import * - from django_website.apps.blog.models import Entry - - info_dict = { - 'queryset': Entry.objects.all(), - 'date_field': 'pub_date', - } - - urlpatterns = patterns('django.views.generic.date_based', - (r'^(?P<year>\d{4})/(?P<month>[a-z]{3})/(?P<day>\w{1,2})/(?P<slug>[-\w]+)/$', 'object_detail', info_dict), - (r'^(?P<year>\d{4})/(?P<month>[a-z]{3})/(?P<day>\w{1,2})/$', 'archive_day', info_dict), - (r'^(?P<year>\d{4})/(?P<month>[a-z]{3})/$', 'archive_month', info_dict), - (r'^(?P<year>\d{4})/$', 'archive_year', info_dict), - (r'^$', 'archive_index', info_dict), - ) - -As you can see, this URLconf defines a few options in ``info_dict``. -``'queryset'`` gives the generic view a ``QuerySet`` of objects to use (in this -case, all of the ``Entry`` objects) and tells the generic view which model is -being used. - -Documentation of each generic view follows, along with a list of all keyword -arguments that a generic view expects. Remember that as in the example above, -arguments may either come from the URL pattern (as ``month``, ``day``, -``year``, etc. do above) or from the additional-information dictionary (as for -``queryset``, ``date_field``, etc.). - -Most generic views require the ``queryset`` key, which is a ``QuerySet`` -instance; see the `database API docs`_ for more information about ``Queryset`` -objects. - -Most views also take an optional ``extra_context`` dictionary that you can use -to pass any auxiliary information you wish to the view. The values in the -``extra_context`` dictionary can be either functions (or other callables) or -other objects. Functions are evaluated just before they are passed to the -template. However, note that QuerySets retrieve and cache their data when they -are first evaluated, so if you want to pass in a QuerySet via -``extra_context`` that is always fresh you need to wrap it in a function or -lambda that returns the QuerySet. - -.. _database API docs: ../db-api/ - -"Simple" generic views -====================== - -The ``django.views.generic.simple`` module contains simple views to handle a -couple of common cases: rendering a template when no view logic is needed, -and issuing a redirect. - -``django.views.generic.simple.direct_to_template`` --------------------------------------------------- - -Description -~~~~~~~~~~~ - -Renders a given template, passing it a ``{{ params }}`` template variable, -which is a dictionary of the parameters captured in the URL. - -Required arguments -~~~~~~~~~~~~~~~~~~ - -``template`` - The full name of a template to use. - -Optional arguments -~~~~~~~~~~~~~~~~~~ - -``extra_context`` - A dictionary of values to add to the template context. By default, this is - an empty dictionary. If a value in the dictionary is callable, the generic - view will call it just before rendering the template. - -``mimetype`` - The MIME type to use for the resulting document. Defaults to the value of - the ``DEFAULT_CONTENT_TYPE`` setting. - -**Example:** - -Given the following URL patterns:: - - urlpatterns = patterns('django.views.generic.simple', - (r'^foo/$', 'direct_to_template', {'template': 'foo_index.html'}), - (r'^foo/(?P<id>\d+)/$', 'direct_to_template', {'template': 'foo_detail.html'}), - ) - -... a request to ``/foo/`` would render the template ``foo_index.html``, and a -request to ``/foo/15/`` would render the ``foo_detail.html`` with a context -variable ``{{ params.id }}`` that is set to ``15``. - -``django.views.generic.simple.redirect_to`` -------------------------------------------- - -Description -~~~~~~~~~~~ - -Redirects to a given URL. - -The given URL may contain dictionary-style string formatting, which will be -interpolated against the parameters captured in the URL. - -If the given URL is ``None``, Django will return an ``HttpResponseGone`` (410). - -Required arguments -~~~~~~~~~~~~~~~~~~ - -``url`` - The URL to redirect to, as a string. Or ``None`` to raise a 410 (Gone) - HTTP error. - -**Example:** - -This example redirects from ``/foo/<id>/`` to ``/bar/<id>/``:: - - urlpatterns = patterns('django.views.generic.simple', - ('^foo/(?P<id>\d+)/$', 'redirect_to', {'url': '/bar/%(id)s/'}), - ) - -This example returns a 410 HTTP error for requests to ``/bar/``:: - - urlpatterns = patterns('django.views.generic.simple', - ('^bar/$', 'redirect_to', {'url': None}), - ) - -Date-based generic views -======================== - -Date-based generic views (in the module ``django.views.generic.date_based``) -are views for displaying drilldown pages for date-based data. - -``django.views.generic.date_based.archive_index`` -------------------------------------------------- - -Description -~~~~~~~~~~~ - -A top-level index page showing the "latest" objects, by date. Objects with -a date in the *future* are not included unless you set ``allow_future`` to -``True``. - -Required arguments -~~~~~~~~~~~~~~~~~~ - -``queryset`` - A ``QuerySet`` of objects for which the archive serves. - -``date_field`` - The name of the ``DateField`` or ``DateTimeField`` in the ``QuerySet``'s - model that the date-based archive should use to determine the objects on - the page. - -Optional arguments -~~~~~~~~~~~~~~~~~~ - -``num_latest`` - The number of latest objects to send to the template context. By default, - it's 15. - -``template_name`` - The full name of a template to use in rendering the page. This lets you - override the default template name (see below). - -``template_loader`` - The template loader to use when loading the template. By default, it's - ``django.template.loader``. - -``extra_context`` - A dictionary of values to add to the template context. By default, this is - an empty dictionary. If a value in the dictionary is callable, the generic - view will call it just before rendering the template. - -``allow_empty`` - A boolean specifying whether to display the page if no objects are - available. If this is ``False`` and no objects are available, the view will - raise a 404 instead of displaying an empty page. By default, this is - ``True``. - -``context_processors`` - A list of template-context processors to apply to the view's template. See - the `RequestContext docs`_. - -``mimetype`` - The MIME type to use for the resulting document. Defaults to the value of - the ``DEFAULT_CONTENT_TYPE`` setting. - -``allow_future`` - A boolean specifying whether to include "future" objects on this page, - where "future" means objects in which the field specified in ``date_field`` - is greater than the current date/time. By default, this is ``False``. - -``template_object_name`` (**New in Django development version**) - Designates the name of the template variable to use in the template - context. By default, this is ``'latest'``. - -Template name -~~~~~~~~~~~~~ - -If ``template_name`` isn't specified, this view will use the template -``<app_label>/<model_name>_archive.html`` by default, where: - - * ``<model_name>`` is your model's name in all lowercase. For a model - ``StaffMember``, that'd be ``staffmember``. - - * ``<app_label>`` is the right-most part of the full Python path to - your model's app. For example, if your model lives in - ``apps/blog/models.py``, that'd be ``blog``. - -Template context -~~~~~~~~~~~~~~~~ - -In addition to ``extra_context``, the template's context will be: - -``date_list`` - A list of ``datetime.date`` objects representing all years that have - objects available according to ``queryset``. These are ordered in reverse. - This is equivalent to ``queryset.dates(date_field, 'year')[::-1]``. - -``latest`` - The ``num_latest`` objects in the system, ordered descending by - ``date_field``. For example, if ``num_latest`` is ``10``, then ``latest`` - will be a list of the latest 10 objects in ``queryset``. - - **New in Django development version:** This variable's name depends on the - ``template_object_name`` parameter, which is ``'latest'`` by default. - If ``template_object_name`` is ``'foo'``, this variable's name will be - ``foo``. - -.. _RequestContext docs: ../templates_python/#subclassing-context-requestcontext - -``django.views.generic.date_based.archive_year`` ------------------------------------------------- - -Description -~~~~~~~~~~~ - -A yearly archive page showing all available months in a given year. Objects -with a date in the *future* are not displayed unless you set ``allow_future`` -to ``True``. - -Required arguments -~~~~~~~~~~~~~~~~~~ - -``year`` - The four-digit year for which the archive serves. - -``queryset`` - A ``QuerySet`` of objects for which the archive serves. - -``date_field`` - The name of the ``DateField`` or ``DateTimeField`` in the ``QuerySet``'s - model that the date-based archive should use to determine the objects on - the page. - -Optional arguments -~~~~~~~~~~~~~~~~~~ - -``template_name`` - The full name of a template to use in rendering the page. This lets you - override the default template name (see below). - -``template_loader`` - The template loader to use when loading the template. By default, it's - ``django.template.loader``. - -``extra_context`` - A dictionary of values to add to the template context. By default, this is - an empty dictionary. If a value in the dictionary is callable, the generic - view will call it just before rendering the template. - -``allow_empty`` - A boolean specifying whether to display the page if no objects are - available. If this is ``False`` and no objects are available, the view will - raise a 404 instead of displaying an empty page. By default, this is - ``False``. - -``context_processors`` - A list of template-context processors to apply to the view's template. See - the `RequestContext docs`_. - -``template_object_name`` - Designates the name of the template variable to use in the template - context. By default, this is ``'object'``. The view will append ``'_list'`` - to the value of this parameter in determining the variable's name. - -``make_object_list`` - A boolean specifying whether to retrieve the full list of objects for this - year and pass those to the template. If ``True``, this list of objects will - be made available to the template as ``object_list``. (The name - ``object_list`` may be different; see the docs for ``object_list`` in the - "Template context" section below.) By default, this is ``False``. - -``mimetype`` - The MIME type to use for the resulting document. Defaults to the value of - the ``DEFAULT_CONTENT_TYPE`` setting. - -``allow_future`` - A boolean specifying whether to include "future" objects on this page, - where "future" means objects in which the field specified in ``date_field`` - is greater than the current date/time. By default, this is ``False``. - -Template name -~~~~~~~~~~~~~ - -If ``template_name`` isn't specified, this view will use the template -``<app_label>/<model_name>_archive_year.html`` by default. - -Template context -~~~~~~~~~~~~~~~~ - -In addition to ``extra_context``, the template's context will be: - -``date_list`` - A list of ``datetime.date`` objects representing all months that have - objects available in the given year, according to ``queryset``, in - ascending order. - -``year`` - The given year, as a four-character string. - -``object_list`` - If the ``make_object_list`` parameter is ``True``, this will be set to a - list of objects available for the given year, ordered by the date field. - This variable's name depends on the ``template_object_name`` parameter, - which is ``'object'`` by default. If ``template_object_name`` is ``'foo'``, - this variable's name will be ``foo_list``. - - If ``make_object_list`` is ``False``, ``object_list`` will be passed to the - template as an empty list. - -``django.views.generic.date_based.archive_month`` -------------------------------------------------- - -Description -~~~~~~~~~~~ - -A monthly archive page showing all objects in a given month. Objects with a -date in the *future* are not displayed unless you set ``allow_future`` to -``True``. - -Required arguments -~~~~~~~~~~~~~~~~~~ - -``year`` - The four-digit year for which the archive serves (a string). - -``month`` - The month for which the archive serves, formatted according to the - ``month_format`` argument. - -``queryset`` - A ``QuerySet`` of objects for which the archive serves. - -``date_field`` - The name of the ``DateField`` or ``DateTimeField`` in the ``QuerySet``'s - model that the date-based archive should use to determine the objects on - the page. - -Optional arguments -~~~~~~~~~~~~~~~~~~ - -``month_format`` - A format string that regulates what format the ``month`` parameter uses. - This should be in the syntax accepted by Python's ``time.strftime``. (See - the `strftime docs`_.) It's set to ``"%b"`` by default, which is a three- - letter month abbreviation. To change it to use numbers, use ``"%m"``. - -``template_name`` - The full name of a template to use in rendering the page. This lets you - override the default template name (see below). - -``template_loader`` - The template loader to use when loading the template. By default, it's - ``django.template.loader``. - -``extra_context`` - A dictionary of values to add to the template context. By default, this is - an empty dictionary. If a value in the dictionary is callable, the generic - view will call it just before rendering the template. - -``allow_empty`` - A boolean specifying whether to display the page if no objects are - available. If this is ``False`` and no objects are available, the view will - raise a 404 instead of displaying an empty page. By default, this is - ``False``. - -``context_processors`` - A list of template-context processors to apply to the view's template. See - the `RequestContext docs`_. - -``template_object_name`` - Designates the name of the template variable to use in the template - context. By default, this is ``'object'``. The view will append ``'_list'`` - to the value of this parameter in determining the variable's name. - -``mimetype`` - The MIME type to use for the resulting document. Defaults to the value of - the ``DEFAULT_CONTENT_TYPE`` setting. - -``allow_future`` - A boolean specifying whether to include "future" objects on this page, - where "future" means objects in which the field specified in ``date_field`` - is greater than the current date/time. By default, this is ``False``. - -Template name -~~~~~~~~~~~~~ - -If ``template_name`` isn't specified, this view will use the template -``<app_label>/<model_name>_archive_month.html`` by default. - -Template context -~~~~~~~~~~~~~~~~ - -In addition to ``extra_context``, the template's context will be: - -``month`` - A ``datetime.date`` object representing the given month. - -``next_month`` - A ``datetime.date`` object representing the first day of the next month. If - the next month is in the future, this will be ``None``. - -``previous_month`` - A ``datetime.date`` object representing the first day of the previous - month. Unlike ``next_month``, this will never be ``None``. - -``object_list`` - A list of objects available for the given month. This variable's name - depends on the ``template_object_name`` parameter, which is ``'object'`` by - default. If ``template_object_name`` is ``'foo'``, this variable's name - will be ``foo_list``. - -.. _strftime docs: http://www.python.org/doc/current/lib/module-time.html#l2h-1941 - -``django.views.generic.date_based.archive_week`` ------------------------------------------------- - -Description -~~~~~~~~~~~ - -A weekly archive page showing all objects in a given week. Objects with a date -in the *future* are not displayed unless you set ``allow_future`` to ``True``. - -Required arguments -~~~~~~~~~~~~~~~~~~ - -``year`` - The four-digit year for which the archive serves (a string). - -``week`` - The week of the year for which the archive serves (a string). Weeks start - with Sunday. - -``queryset`` - A ``QuerySet`` of objects for which the archive serves. - -``date_field`` - The name of the ``DateField`` or ``DateTimeField`` in the ``QuerySet``'s - model that the date-based archive should use to determine the objects on - the page. - -Optional arguments -~~~~~~~~~~~~~~~~~~ - -``template_name`` - The full name of a template to use in rendering the page. This lets you - override the default template name (see below). - -``template_loader`` - The template loader to use when loading the template. By default, it's - ``django.template.loader``. - -``extra_context`` - A dictionary of values to add to the template context. By default, this is - an empty dictionary. If a value in the dictionary is callable, the generic - view will call it just before rendering the template. - -``allow_empty`` - A boolean specifying whether to display the page if no objects are - available. If this is ``False`` and no objects are available, the view will - raise a 404 instead of displaying an empty page. By default, this is - ``True``. - -``context_processors`` - A list of template-context processors to apply to the view's template. See - the `RequestContext docs`_. - -``template_object_name`` - Designates the name of the template variable to use in the template - context. By default, this is ``'object'``. The view will append ``'_list'`` - to the value of this parameter in determining the variable's name. - -``mimetype`` - The MIME type to use for the resulting document. Defaults to the value of - the ``DEFAULT_CONTENT_TYPE`` setting. - -``allow_future`` - A boolean specifying whether to include "future" objects on this page, - where "future" means objects in which the field specified in ``date_field`` - is greater than the current date/time. By default, this is ``False``. - -Template name -~~~~~~~~~~~~~ - -If ``template_name`` isn't specified, this view will use the template -``<app_label>/<model_name>_archive_week.html`` by default. - -Template context -~~~~~~~~~~~~~~~~ - -In addition to ``extra_context``, the template's context will be: - -``week`` - A ``datetime.date`` object representing the first day of the given week. - -``object_list`` - A list of objects available for the given week. This variable's name - depends on the ``template_object_name`` parameter, which is ``'object'`` by - default. If ``template_object_name`` is ``'foo'``, this variable's name - will be ``foo_list``. - -``django.views.generic.date_based.archive_day`` ------------------------------------------------ - -Description -~~~~~~~~~~~ - -A day archive page showing all objects in a given day. Days in the future throw -a 404 error, regardless of whether any objects exist for future days, unless -you set ``allow_future`` to ``True``. - -Required arguments -~~~~~~~~~~~~~~~~~~ - -``year`` - The four-digit year for which the archive serves (a string). - -``month`` - The month for which the archive serves, formatted according to the - ``month_format`` argument. - -``day`` - The day for which the archive serves, formatted according to the - ``day_format`` argument. - -``queryset`` - A ``QuerySet`` of objects for which the archive serves. - -``date_field`` - The name of the ``DateField`` or ``DateTimeField`` in the ``QuerySet``'s - model that the date-based archive should use to determine the objects on - the page. - -Optional arguments -~~~~~~~~~~~~~~~~~~ - -``month_format`` - A format string that regulates what format the ``month`` parameter uses. - This should be in the syntax accepted by Python's ``time.strftime``. (See - the `strftime docs`_.) It's set to ``"%b"`` by default, which is a three- - letter month abbreviation. To change it to use numbers, use ``"%m"``. - -``day_format`` - Like ``month_format``, but for the ``day`` parameter. It defaults to - ``"%d"`` (day of the month as a decimal number, 01-31). - -``template_name`` - The full name of a template to use in rendering the page. This lets you - override the default template name (see below). - -``template_loader`` - The template loader to use when loading the template. By default, it's - ``django.template.loader``. - -``extra_context`` - A dictionary of values to add to the template context. By default, this is - an empty dictionary. If a value in the dictionary is callable, the generic - view will call it just before rendering the template. - -``allow_empty`` - A boolean specifying whether to display the page if no objects are - available. If this is ``False`` and no objects are available, the view will - raise a 404 instead of displaying an empty page. By default, this is - ``False``. - -``context_processors`` - A list of template-context processors to apply to the view's template. See - the `RequestContext docs`_. - -``template_object_name`` - Designates the name of the template variable to use in the template - context. By default, this is ``'object'``. The view will append - ``'_list'`` to the value of this parameter in determining the variable's - name. - -``mimetype`` - The MIME type to use for the resulting document. Defaults to the value of - the ``DEFAULT_CONTENT_TYPE`` setting. - -``allow_future`` - A boolean specifying whether to include "future" objects on this page, - where "future" means objects in which the field specified in ``date_field`` - is greater than the current date/time. By default, this is ``False``. - -Template name -~~~~~~~~~~~~~ - -If ``template_name`` isn't specified, this view will use the template -``<app_label>/<model_name>_archive_day.html`` by default. - -Template context -~~~~~~~~~~~~~~~~ - -In addition to ``extra_context``, the template's context will be: - -``day`` - A ``datetime.date`` object representing the given day. - -``next_day`` - A ``datetime.date`` object representing the next day. If the next day is in - the future, this will be ``None``. - -``previous_day`` - A ``datetime.date`` object representing the given day. Unlike ``next_day``, - this will never be ``None``. - -``object_list`` - A list of objects available for the given day. This variable's name depends - on the ``template_object_name`` parameter, which is ``'object'`` by - default. If ``template_object_name`` is ``'foo'``, this variable's name - will be ``foo_list``. - -``django.views.generic.date_based.archive_today`` -------------------------------------------------- - -Description -~~~~~~~~~~~ - -A day archive page showing all objects for *today*. This is exactly the same as -``archive_day``, except the ``year``/``month``/``day`` arguments are not used, -and today's date is used instead. - -``django.views.generic.date_based.object_detail`` -------------------------------------------------- - -Description -~~~~~~~~~~~ - -A page representing an individual object. If the object has a date value in the -future, the view will throw a 404 error by default, unless you set -``allow_future`` to ``True``. - -Required arguments -~~~~~~~~~~~~~~~~~~ - -``year`` - The object's four-digit year (a string). - -``month`` - The object's month , formatted according to the ``month_format`` argument. - -``day`` - The object's day , formatted according to the ``day_format`` argument. - -``queryset`` - A ``QuerySet`` that contains the object. - -``date_field`` - The name of the ``DateField`` or ``DateTimeField`` in the ``QuerySet``'s - model that the generic view should use to look up the object according to - ``year``, ``month`` and ``day``. - -Either ``object_id`` or (``slug`` *and* ``slug_field``) is required. - If you provide ``object_id``, it should be the value of the primary-key - field for the object being displayed on this page. - - Otherwise, ``slug`` should be the slug of the given object, and - ``slug_field`` should be the name of the slug field in the ``QuerySet``'s - model. By default, ``slug_field`` is ``'slug'``. - -Optional arguments -~~~~~~~~~~~~~~~~~~ - -``month_format`` - A format string that regulates what format the ``month`` parameter uses. - This should be in the syntax accepted by Python's ``time.strftime``. (See - the `strftime docs`_.) It's set to ``"%b"`` by default, which is a three- - letter month abbreviation. To change it to use numbers, use ``"%m"``. - -``day_format`` - Like ``month_format``, but for the ``day`` parameter. It defaults to - ``"%d"`` (day of the month as a decimal number, 01-31). - -``template_name`` - The full name of a template to use in rendering the page. This lets you - override the default template name (see below). - -``template_name_field`` - The name of a field on the object whose value is the template name to use. - This lets you store template names in the data. In other words, if your - object has a field ``'the_template'`` that contains a string - ``'foo.html'``, and you set ``template_name_field`` to ``'the_template'``, - then the generic view for this object will use the template ``'foo.html'``. - - It's a bit of a brain-bender, but it's useful in some cases. - -``template_loader`` - The template loader to use when loading the template. By default, it's - ``django.template.loader``. - -``extra_context`` - A dictionary of values to add to the template context. By default, this is - an empty dictionary. If a value in the dictionary is callable, the generic - view will call it just before rendering the template. - -``context_processors`` - A list of template-context processors to apply to the view's template. See - the `RequestContext docs`_. - -``template_object_name`` - Designates the name of the template variable to use in the template - context. By default, this is ``'object'``. - -``mimetype`` - The MIME type to use for the resulting document. Defaults to the value of - the ``DEFAULT_CONTENT_TYPE`` setting. - -``allow_future`` - A boolean specifying whether to include "future" objects on this page, - where "future" means objects in which the field specified in ``date_field`` - is greater than the current date/time. By default, this is ``False``. - -Template name -~~~~~~~~~~~~~ - -If ``template_name`` isn't specified, this view will use the template -``<app_label>/<model_name>_detail.html`` by default. - -Template context -~~~~~~~~~~~~~~~~ - -In addition to ``extra_context``, the template's context will be: - -``object`` - The object. This variable's name depends on the ``template_object_name`` - parameter, which is ``'object'`` by default. If ``template_object_name`` is - ``'foo'``, this variable's name will be ``foo``. - -List/detail generic views -========================= - -The list-detail generic-view framework (in the -``django.views.generic.list_detail`` module) is similar to the date-based one, -except the former simply has two views: a list of objects and an individual -object page. - -``django.views.generic.list_detail.object_list`` ------------------------------------------------- - -Description -~~~~~~~~~~~ - -A page representing a list of objects. - -Required arguments -~~~~~~~~~~~~~~~~~~ - -``queryset`` - A ``QuerySet`` that represents the objects. - -Optional arguments -~~~~~~~~~~~~~~~~~~ - -``paginate_by`` - An integer specifying how many objects should be displayed per page. If - this is given, the view will paginate objects with ``paginate_by`` objects - per page. The view will expect either a ``page`` query string parameter - (via ``GET``) or a ``page`` variable specified in the URLconf. See `Notes - on pagination`_ below. - -``page`` - The current (1-based) page number, as an integer, or the string ``'last'``. - See `Notes on pagination`_ below. - -``template_name`` - The full name of a template to use in rendering the page. This lets you - override the default template name (see below). - -``template_loader`` - The template loader to use when loading the template. By default, it's - ``django.template.loader``. - -``extra_context`` - A dictionary of values to add to the template context. By default, this is - an empty dictionary. If a value in the dictionary is callable, the generic - view will call it just before rendering the template. - -``allow_empty`` - A boolean specifying whether to display the page if no objects are - available. If this is ``False`` and no objects are available, the view will - raise a 404 instead of displaying an empty page. By default, this is - ``True``. - -``context_processors`` - A list of template-context processors to apply to the view's template. See - the `RequestContext docs`_. - -``template_object_name`` - Designates the name of the template variable to use in the template - context. By default, this is ``'object'``. The view will append ``'_list'`` - to the value of this parameter in determining the variable's name. - -``mimetype`` - The MIME type to use for the resulting document. Defaults to the value of - the ``DEFAULT_CONTENT_TYPE`` setting. - -Template name -~~~~~~~~~~~~~ - -If ``template_name`` isn't specified, this view will use the template -``<app_label>/<model_name>_list.html`` by default. - -Template context -~~~~~~~~~~~~~~~~ - -In addition to ``extra_context``, the template's context will be: - -``object_list`` - The list of objects. This variable's name depends on the - ``template_object_name`` parameter, which is ``'object'`` by default. If - ``template_object_name`` is ``'foo'``, this variable's name will be - ``foo_list``. - -``is_paginated`` - A boolean representing whether the results are paginated. Specifically, - this is set to ``False`` if the number of available objects is less than or - equal to ``paginate_by``. - -If the results are paginated, the context will contain these extra variables: - -``paginator`` (**New in Django development version**) - An instance of ``django.core.paginator.Paginator``. - -``page_obj`` (**New in Django development version**) - An instance of ``django.core.paginator.Page``. - -See the `pagination documentation`_ for more information on the ``Paginator`` -and ``Page`` objects. - -Notes on pagination -~~~~~~~~~~~~~~~~~~~ - -If ``paginate_by`` is specified, Django will paginate the results. You can -specify the page number in the URL in one of two ways: - - * Use the ``page`` parameter in the URLconf. For example, this is what - your URLconf might look like:: - - (r'^objects/page(?P<page>[0-9]+)/$', 'object_list', dict(info_dict)) - - * Pass the page number via the ``page`` query-string parameter. For - example, a URL would look like this:: - - /objects/?page=3 - - * To loop over all the available page numbers, use the ``page_range`` - variable. You can iterate over the list provided by ``page_range`` - to create a link to every page of results. - -These values and lists are 1-based, not 0-based, so the first page would be -represented as page ``1``. - -For more on pagination, read the `pagination documentation`_. - -.. _`pagination documentation`: ../pagination/ - -**New in Django development version:** - -As a special case, you are also permitted to use ``last`` as a value for -``page``:: - - /objects/?page=last - -This allows you to access the final page of results without first having to -determine how many pages there are. - -Note that ``page`` *must* be either a valid page number or the value ``last``; -any other value for ``page`` will result in a 404 error. - -``django.views.generic.list_detail.object_detail`` --------------------------------------------------- - -A page representing an individual object. - -Description -~~~~~~~~~~~ - -A page representing an individual object. - -Required arguments -~~~~~~~~~~~~~~~~~~ - -``queryset`` - A ``QuerySet`` that contains the object. - -Either ``object_id`` or (``slug`` *and* ``slug_field``) - If you provide ``object_id``, it should be the value of the primary-key - field for the object being displayed on this page. - - Otherwise, ``slug`` should be the slug of the given object, and - ``slug_field`` should be the name of the slug field in the ``QuerySet``'s - model. By default, ``slug_field`` is ``'slug'``. - -Optional arguments -~~~~~~~~~~~~~~~~~~ - -``template_name`` - The full name of a template to use in rendering the page. This lets you - override the default template name (see below). - -``template_name_field`` - The name of a field on the object whose value is the template name to use. - This lets you store template names in the data. In other words, if your - object has a field ``'the_template'`` that contains a string - ``'foo.html'``, and you set ``template_name_field`` to ``'the_template'``, - then the generic view for this object will use the template ``'foo.html'``. - - It's a bit of a brain-bender, but it's useful in some cases. - -``template_loader`` - The template loader to use when loading the template. By default, it's - ``django.template.loader``. - -``extra_context`` - A dictionary of values to add to the template context. By default, this is - an empty dictionary. If a value in the dictionary is callable, the generic - view will call it just before rendering the template. - -``context_processors`` - A list of template-context processors to apply to the view's template. See - the `RequestContext docs`_. - -``template_object_name`` - Designates the name of the template variable to use in the template - context. By default, this is ``'object'``. - -``mimetype`` - The MIME type to use for the resulting document. Defaults to the value of - the ``DEFAULT_CONTENT_TYPE`` setting. - -Template name -~~~~~~~~~~~~~ - -If ``template_name`` isn't specified, this view will use the template -``<app_label>/<model_name>_detail.html`` by default. - -Template context -~~~~~~~~~~~~~~~~ - -In addition to ``extra_context``, the template's context will be: - -``object`` - The object. This variable's name depends on the ``template_object_name`` - parameter, which is ``'object'`` by default. If ``template_object_name`` is - ``'foo'``, this variable's name will be ``foo``. - -Create/update/delete generic views -================================== - -The ``django.views.generic.create_update`` module contains a set of functions -for creating, editing and deleting objects. - -**Changed in Django development version:** - -``django.views.generic.create_update.create_object`` and -``django.views.generic.create_update.update_object`` now use the new `forms -library`_ to build and display the form. - -.. _forms library: ../forms/ - -``django.views.generic.create_update.create_object`` ----------------------------------------------------- - -Description -~~~~~~~~~~~ - -A page that displays a form for creating an object, redisplaying the form with -validation errors (if there are any) and saving the object. - -Required arguments -~~~~~~~~~~~~~~~~~~ - -Either ``form_class`` or ``model`` - If you provide ``form_class``, it should be a ``django.forms.ModelForm`` - subclass. Use this argument when you need to customize the model's form. - See the `ModelForm docs`_ for more information. - - Otherwise, ``model`` should be a Django model class and the form used will - be a standard ``ModelForm`` for ``model``. - -Optional arguments -~~~~~~~~~~~~~~~~~~ - -``post_save_redirect`` - A URL to which the view will redirect after saving the object. By default, - it's ``object.get_absolute_url()``. - - ``post_save_redirect`` may contain dictionary string formatting, which will - be interpolated against the object's field attributes. For example, you - could use ``post_save_redirect="/polls/%(slug)s/"``. - -``login_required`` - A boolean that designates whether a user must be logged in, in order to see - the page and save changes. This hooks into the Django `authentication - system`_. By default, this is ``False``. - - If this is ``True``, and a non-logged-in user attempts to visit this page - or save the form, Django will redirect the request to ``/accounts/login/``. - -``template_name`` - The full name of a template to use in rendering the page. This lets you - override the default template name (see below). - -``template_loader`` - The template loader to use when loading the template. By default, it's - ``django.template.loader``. - -``extra_context`` - A dictionary of values to add to the template context. By default, this is - an empty dictionary. If a value in the dictionary is callable, the generic - view will call it just before rendering the template. - -``context_processors`` - A list of template-context processors to apply to the view's template. See - the `RequestContext docs`_. - -Template name -~~~~~~~~~~~~~ - -If ``template_name`` isn't specified, this view will use the template -``<app_label>/<model_name>_form.html`` by default. - -Template context -~~~~~~~~~~~~~~~~ - -In addition to ``extra_context``, the template's context will be: - -``form`` - A ``django.forms.ModelForm`` instance representing the form for creating - the object. This lets you refer to form fields easily in the template - system. - - For example, if the model has two fields, ``name`` and ``address``:: - - <form action="" method="post"> - <p>{{ form.name.label_tag }} {{ form.name }}</p> - <p>{{ form.address.label_tag }} {{ form.address }}</p> - </form> - - See the `forms documentation`_ for more information about using ``Form`` - objects in templates. - -.. _authentication system: ../authentication/ -.. _ModelForm docs: ../modelforms/ -.. _forms documentation: ../forms/ - -``django.views.generic.create_update.update_object`` ----------------------------------------------------- - -Description -~~~~~~~~~~~ - -A page that displays a form for editing an existing object, redisplaying the -form with validation errors (if there are any) and saving changes to the -object. This uses a form automatically generated from the object's -model class. - -Required arguments -~~~~~~~~~~~~~~~~~~ - -Either ``form_class`` or ``model`` - If you provide ``form_class``, it should be a ``django.forms.ModelForm`` - subclass. Use this argument when you need to customize the model's form. - See the `ModelForm docs`_ for more information. - - Otherwise, ``model`` should be a Django model class and the form used will - be a standard ``ModelForm`` for ``model``. - -Either ``object_id`` or (``slug`` *and* ``slug_field``) - If you provide ``object_id``, it should be the value of the primary-key - field for the object being displayed on this page. - - Otherwise, ``slug`` should be the slug of the given object, and - ``slug_field`` should be the name of the slug field in the ``QuerySet``'s - model. By default, ``slug_field`` is ``'slug'``. - -Optional arguments -~~~~~~~~~~~~~~~~~~ - -``post_save_redirect`` - A URL to which the view will redirect after saving the object. By default, - it's ``object.get_absolute_url()``. - - ``post_save_redirect`` may contain dictionary string formatting, which will - be interpolated against the object's field attributes. For example, you - could use ``post_save_redirect="/polls/%(slug)s/"``. - -``login_required`` - A boolean that designates whether a user must be logged in, in order to see - the page and save changes. This hooks into the Django `authentication - system`_. By default, this is ``False``. - - If this is ``True``, and a non-logged-in user attempts to visit this page - or save the form, Django will redirect the request to ``/accounts/login/``. - -``template_name`` - The full name of a template to use in rendering the page. This lets you - override the default template name (see below). - -``template_loader`` - The template loader to use when loading the template. By default, it's - ``django.template.loader``. - -``extra_context`` - A dictionary of values to add to the template context. By default, this is - an empty dictionary. If a value in the dictionary is callable, the generic - view will call it just before rendering the template. - -``context_processors``: A list of template-context processors to apply to - the view's template. See the `RequestContext docs`_. - -``template_object_name`` - Designates the name of the template variable to use in the template - context. By default, this is ``'object'``. - -Template name -~~~~~~~~~~~~~ - -If ``template_name`` isn't specified, this view will use the template -``<app_label>/<model_name>_form.html`` by default. - -Template context -~~~~~~~~~~~~~~~~ - -In addition to ``extra_context``, the template's context will be: - -``form`` - A ``django.forms.ModelForm`` instance representing the form for editing the - object. This lets you refer to form fields easily in the template system. - - For example, if the model has two fields, ``name`` and ``address``:: - - <form action="" method="post"> - <p>{{ form.name.label_tag }} {{ form.name }}</p> - <p>{{ form.address.label_tag }} {{ form.address }}</p> - </form> - - See the `forms documentation`_ for more information about using ``Form`` - objects in templates. - -``object`` - The original object being edited. This variable's name depends on the - ``template_object_name`` parameter, which is ``'object'`` by default. If - ``template_object_name`` is ``'foo'``, this variable's name will be - ``foo``. - -``django.views.generic.create_update.delete_object`` ----------------------------------------------------- - -Description -~~~~~~~~~~~ - -A view that displays a confirmation page and deletes an existing object. The -given object will only be deleted if the request method is ``POST``. If this -view is fetched via ``GET``, it will display a confirmation page that should -contain a form that POSTs to the same URL. - -Required arguments -~~~~~~~~~~~~~~~~~~ - -``model`` - The Django model class of the object that the form will create. - -Either ``object_id`` or (``slug`` *and* ``slug_field``) - If you provide ``object_id``, it should be the value of the primary-key - field for the object being displayed on this page. - - Otherwise, ``slug`` should be the slug of the given object, and - ``slug_field`` should be the name of the slug field in the ``QuerySet``'s - model. By default, ``slug_field`` is ``'slug'``. - -``post_delete_redirect`` - A URL to which the view will redirect after deleting the object. - -Optional arguments -~~~~~~~~~~~~~~~~~~ - -``login_required`` - A boolean that designates whether a user must be logged in, in order to see - the page and save changes. This hooks into the Django `authentication - system`_. By default, this is ``False``. - - If this is ``True``, and a non-logged-in user attempts to visit this page - or save the form, Django will redirect the request to ``/accounts/login/``. - -``template_name`` - The full name of a template to use in rendering the page. This lets you - override the default template name (see below). - -``template_loader`` - The template loader to use when loading the template. By default, it's - ``django.template.loader``. - -``extra_context`` - A dictionary of values to add to the template context. By default, this is - an empty dictionary. If a value in the dictionary is callable, the generic - view will call it just before rendering the template. - -``context_processors`` - A list of template-context processors to apply to the view's template. See - the `RequestContext docs`_. - -``template_object_name`` - Designates the name of the template variable to use in the template - context. By default, this is ``'object'``. - -Template name -~~~~~~~~~~~~~ - -If ``template_name`` isn't specified, this view will use the template -``<app_label>/<model_name>_confirm_delete.html`` by default. - -Template context -~~~~~~~~~~~~~~~~ - -In addition to ``extra_context``, the template's context will be: - -``object`` - The original object that's about to be deleted. This variable's name - depends on the ``template_object_name`` parameter, which is ``'object'`` by - default. If ``template_object_name`` is ``'foo'``, this variable's name - will be ``foo``. diff --git a/docs/glossary.txt b/docs/glossary.txt new file mode 100644 index 0000000000..c67c522ef7 --- /dev/null +++ b/docs/glossary.txt @@ -0,0 +1,80 @@ +.. _glossary: + +======== +Glossary +======== + +.. glossary:: + + field + An attribute on a :term:`model`; a given field usually maps directly to + a single database column. + + See :ref:`topics-db-models`. + + generic view + A higher-order :term:`view` function that abstracts common idioms and patterns + found in view development and abstracts them. + + See :ref:`ref-generic-views`. + + model + Models store your application's data. + + See :ref:`topics-db-models`. + + MTV + See :ref:`mtv`. + + MVC + `Model-view-controller`__; a software pattern. Django :ref:`follows MVC + to some extent <mtv>`. + + __ http://en.wikipedia.org/wiki/Model-view-controller + + project + A Python package -- i.e. a directory of code -- that contains all the + settings for an instance of Django. This would include database + configuration, Django-specific options and application-specific + settings. + + property + Also known as "managed attributes", and a feature of Python since + version 2.2. From `the property documentation`__: + + Properties are a neat way to implement attributes whose usage + resembles attribute access, but whose implementation uses method + calls. [...] You + could only do this by overriding ``__getattr__`` and + ``__setattr__``; but overriding ``__setattr__`` slows down all + attribute assignments considerably, and overriding ``__getattr__`` + is always a bit tricky to get right. Properties let you do this + painlessly, without having to override ``__getattr__`` or + ``__setattr__``. + + __ http://www.python.org/download/releases/2.2/descrintro/#property + + queryset + An object representing some set of rows to be fetched from the database. + + See :ref:`topics-db-queries`. + + slug + A short label for something, containing only letters, numbers, + underscores or hyphens. They're generally used in URLs. For + example, in a typical blog entry URL: + + .. parsed-literal:: + + http://www.djangoproject.com/weblog/2008/apr/12/**spring**/ + + the last bit (``spring``) is the slug. + + template + A chunk of text that separates the presentation of a document from its + data. + + See :ref:`topics-templates`. + + view + A function responsible for rending a page. \ No newline at end of file diff --git a/docs/apache_auth.txt b/docs/howto/apache-auth.txt similarity index 91% rename from docs/apache_auth.txt rename to docs/howto/apache-auth.txt index 62fd191896..585e5b32c4 100644 --- a/docs/apache_auth.txt +++ b/docs/howto/apache-auth.txt @@ -1,10 +1,13 @@ +.. _howto-apache-auth: + ========================================================= Authenticating against Django's user database from Apache ========================================================= Since keeping multiple authentication databases in sync is a common problem when dealing with Apache, you can configuring Apache to authenticate against Django's -`authentication system`_ directly. For example, you could: +:ref:`authentication system <topics-auth>` directly. For example, you +could: * Serve static/media files directly from Apache only to authenticated users. @@ -13,12 +16,17 @@ dealing with Apache, you can configuring Apache to authenticate against Django's * Allow certain users to connect to a WebDAV share created with mod_dav_. +.. _Subversion: http://subversion.tigris.org/ +.. _mod_dav: http://httpd.apache.org/docs/2.0/mod/mod_dav.html + Configuring Apache ================== To check against Django's authorization database from a Apache configuration file, you'll need to use mod_python's ``PythonAuthenHandler`` directive along -with the standard ``Auth*`` and ``Require`` directives:: +with the standard ``Auth*`` and ``Require`` directives: + +.. code-block:: apache <Location /example/> AuthType Basic @@ -43,6 +51,8 @@ with the standard ``Auth*`` and ``Require`` directives:: the ``AuthUserFile`` directive and pointing it to ``/dev/null``. Depending on which other authentication modules you have loaded, you might need one or more of the following directives:: + + .. code-block:: apache AuthBasicAuthoritative Off AuthDefaultAuthoritative Off @@ -94,8 +104,9 @@ location to users marked as staff members. You can use a set of Defaults to ``off``. ``DjangoPermissionName`` The name of a permission to require for - access. See `custom permissions`_ for - more information. + access. See :ref:`custom permissions + <custom-permissions>` for more + information. By default no specific permission will be required. @@ -109,8 +120,3 @@ are equivalent:: SetEnv DJANGO_SETTINGS_MODULE mysite.settings PythonOption DJANGO_SETTINGS_MODULE mysite.settings - -.. _authentication system: ../authentication/ -.. _Subversion: http://subversion.tigris.org/ -.. _mod_dav: http://httpd.apache.org/docs/2.0/mod/mod_dav.html -.. _custom permissions: ../authentication/#custom-permissions diff --git a/docs/howto/custom-file-storage.txt b/docs/howto/custom-file-storage.txt new file mode 100644 index 0000000000..c5f6b740a8 --- /dev/null +++ b/docs/howto/custom-file-storage.txt @@ -0,0 +1,78 @@ +.. _howto-custom-file-storage: + +Writing a custom storage system +=============================== + +If you need to provide custom file storage -- a common example is storing files +on some remote system -- you can do so by defining a custom storage class. +You'll need to follow these steps: + +#. Your custom storage system must be a subclass of + ``django.core.files.storage.Storage``:: + + from django.core.files.storage import Storage + + class MyStorage(Storage): + ... + +#. Django must be able to instantiate your storage system without any arguments. + This means that any settings should be taken from ``django.conf.settings``:: + + from django.conf import settings + from django.core.files.storage import Storage + + class MyStorage(Storage): + def __init__(self, option=None): + if not option: + option = settings.CUSTOM_STORAGE_OPTIONS + ... + +#. Your storage class must implement the ``_open()`` and ``_save()`` methods, + along with any other methods appropriate to your storage class. See below for + more on these methods. + + In addition, if your class provides local file storage, it must override + the ``path()`` method. + +Your custom storage system may override any of the storage methods explained in +:ref:`ref-files-storage`. However, it's usually better to use the hooks +specifically designed for custom storage objects. These are: + +``_open(name, mode='rb')`` +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**Required**. + +Called by ``Storage.open()``, this is the actual mechanism the storage class +uses to open the file. This must return a ``File`` object, though in most cases, +you'll want to return some subclass here that implements logic specific to the +backend storage system. + +``_save(name, content)`` +~~~~~~~~~~~~~~~~~~~~~~~~ + +Called by ``Storage.save()``. The ``name`` will already have gone through +``get_valid_name()`` and ``get_available_name()``, and the ``content`` will be a +``File`` object itself. No return value is expected. + +``get_valid_name(name)`` +------------------------ + +Returns a filename suitable for use with the underlying storage system. The +``name`` argument passed to this method is the original filename sent to the +server, after having any path information removed. Override this to customize +how non-standard characters are converted to safe filenames. + +The code provided on ``Storage`` retains only alpha-numeric characters, periods +and underscores from the original filename, removing everything else. + +``get_available_name(name)`` +---------------------------- + +Returns a filename that is available in the storage mechanism, possibly taking +the provided filename into account. The ``name`` argument passed to this method +will have already cleaned to a filename valid for the storage system, according +to the ``get_valid_name()`` method described above. + +The code provided on ``Storage`` simply appends underscores to the filename +until it finds one that's available in the destination directory. diff --git a/docs/howto/custom-management-commands.txt b/docs/howto/custom-management-commands.txt new file mode 100644 index 0000000000..00f656b92e --- /dev/null +++ b/docs/howto/custom-management-commands.txt @@ -0,0 +1,33 @@ +.. _howto-custom-management-commands: + +Writing custom django-admin commands +==================================== + +**New in Django development version** + +Applications can register their own actions with ``manage.py``. For example, +you might want to add a ``manage.py`` action for a Django app that you're +distributing. + +To do this, just add a ``management/commands`` directory to your application. +Each Python module in that directory will be auto-discovered and registered as +a command that can be executed as an action when you run ``manage.py``:: + + blog/ + __init__.py + models.py + management/ + __init__.py + commands/ + __init__.py + explode.py + views.py + +In this example, the ``explode`` command will be made available to any project +that includes the ``blog`` application in ``settings.INSTALLED_APPS``. + +The ``explode.py`` module has only one requirement -- it must define a class +called ``Command`` that extends ``django.core.management.base.BaseCommand``. + +For more details on how to define your own commands, look at the code for the +existing ``django-admin.py`` commands, in ``/django/core/management/commands``. \ No newline at end of file diff --git a/docs/custom_model_fields.txt b/docs/howto/custom-model-fields.txt similarity index 65% rename from docs/custom_model_fields.txt rename to docs/howto/custom-model-fields.txt index 5dec22f6e3..aa14c3cb4e 100644 --- a/docs/custom_model_fields.txt +++ b/docs/howto/custom-model-fields.txt @@ -1,23 +1,28 @@ -=================== -Custom model fields -=================== +.. _howto-custom-model-fields: + +=========================== +Writing custom model fields +=========================== **New in Django development version** Introduction ============ -The `model reference`_ documentation explains how to use Django's standard -field classes -- ``CharField``, ``DateField``, etc. For many purposes, those -classes are all you'll need. Sometimes, though, the Django version won't meet -your precise requirements, or you'll want to use a field that is entirely -different from those shipped with Django. +The :ref:`model reference <topics-db-models>` documentation explains how to use +Django's standard field classes -- :class:`~django.db.models.CharField`, +:class:`~django.db.models.DateField`, etc. For many purposes, those classes are +all you'll need. Sometimes, though, the Django version won't meet your precise +requirements, or you'll want to use a field that is entirely different from +those shipped with Django. Django's built-in field types don't cover every possible database column type -- only the common types, such as ``VARCHAR`` and ``INTEGER``. For more obscure column types, such as geographic polygons or even user-created types such as `PostgreSQL custom types`_, you can define your own Django ``Field`` subclasses. +.. _PostgreSQL custom types: http://www.postgresql.org/docs/8.2/interactive/sql-createtype.html + Alternatively, you may have a complex Python object that can somehow be serialized to fit into a standard database column type. This is another case where a ``Field`` subclass will help you use your object with your models. @@ -40,9 +45,11 @@ Our class looks something like this:: self.east = east self.south = south self.west = west - + # ... (other possibly useful methods omitted) ... +.. _Bridge: http://en.wikipedia.org/wiki/Contract_bridge + This is just an ordinary Python class, with nothing Django-specific about it. We'd like to be able to do things like this in our models (we assume the ``hand`` attribute on the model is an instance of ``Hand``):: @@ -68,10 +75,6 @@ model support for existing classes where you cannot change the source code. strings, or floats, for example. This case is similar to our ``Hand`` example and we'll note any differences as we go along. -.. _model reference: ../model_api/ -.. _PostgreSQL custom types: http://www.postgresql.org/docs/8.2/interactive/sql-createtype.html -.. _Bridge: http://en.wikipedia.org/wiki/Contract_bridge - Background theory ================= @@ -103,15 +106,13 @@ What does a field class do? --------------------------- All of Django's fields (and when we say *fields* in this document, we always -mean model fields and not `form fields`_) are subclasses of -``django.db.models.Field``. Most of the information that Django records about a -field is common to all fields -- name, help text, validator lists, uniqueness -and so forth. Storing all that information is handled by ``Field``. We'll get -into the precise details of what ``Field`` can do later on; for now, suffice it -to say that everything descends from ``Field`` and then customizes key pieces -of the class behavior. - -.. _form fields: ../forms/#fields +mean model fields and not :ref:`form fields <ref-forms-fields>`) are subclasses +of :class:`django.db.models.Field`. Most of the information that Django records +about a field is common to all fields -- name, help text, validator lists, +uniqueness and so forth. Storing all that information is handled by ``Field``. +We'll get into the precise details of what ``Field`` can do later on; for now, +suffice it to say that everything descends from ``Field`` and then customizes +key pieces of the class behavior. It's important to realize that a Django field class is not what is stored in your model attributes. The model attributes contain normal Python objects. The @@ -120,7 +121,7 @@ when the model class is created (the precise details of how this is done are unimportant here). This is because the field classes aren't necessary when you're just creating and modifying attributes. Instead, they provide the machinery for converting between the attribute value and what is stored in the -database or sent to the serializer. +database or sent to the :ref:`serializer <topics-serialization>`. Keep this in mind when creating your own custom fields. The Django ``Field`` subclass you write provides the machinery for converting between your Python @@ -139,22 +140,25 @@ classes when you want a custom field: how to convert your first class back and forth between its permanent storage form and the Python form. -Writing a ``Field`` subclass -============================= +Writing a field subclass +======================== -When planning your ``Field`` subclass, first give some thought to which -existing ``Field`` class your new field is most similar to. Can you subclass an -existing Django field and save yourself some work? If not, you should subclass -the ``Field`` class, from which everything is descended. +When planning your :class:`~django.db.models.Field` subclass, first give some +thought to which existing :class:`~django.db.models.Field` class your new field +is most similar to. Can you subclass an existing Django field and save yourself +some work? If not, you should subclass the :class:`~django.db.models.Field` +class, from which everything is descended. -Initializing your new field is a matter of separating out any arguments that -are specific to your case from the common arguments and passing the latter to -the ``__init__()`` method of ``Field`` (or your parent class). +Initializing your new field is a matter of separating out any arguments that are +specific to your case from the common arguments and passing the latter to the +:meth:`~django.db.models.Field.__init__` method of +:class:`~django.db.models.Field` (or your parent class). In our example, we'll call our field ``HandField``. (It's a good idea to call -your ``Field`` subclass ``(Something)Field``, so it's easily identifiable as a -``Field`` subclass.) It doesn't behave like any existing field, so we'll -subclass directly from ``Field``:: +your :class:`~django.db.models.Field` subclass ``<Something>Field``, so it's +easily identifiable as a :class:`~django.db.models.Field` subclass.) It doesn't +behave like any existing field, so we'll subclass directly from +:class:`~django.db.models.Field`:: from django.db import models @@ -169,10 +173,13 @@ card values plus their suits; 104 characters in total. .. note:: Many of Django's model fields accept options that they don't do anything - with. For example, you can pass both ``editable`` and ``auto_now`` to a - ``DateField`` and it will simply ignore the ``editable`` parameter - (``auto_now`` being set implies ``editable=False``). No error is raised in - this case. + with. For example, you can pass both + :attr:`~django.db.models.Field.editable` and + :attr:`~django.db.models.Field.auto_now` to a + :class:`django.db.models.DateField` and it will simply ignore the + :attr:`~django.db.models.Field.editable` parameter + (:attr:`~django.db.models.Field.auto_now` being set implies + ``editable=False``). No error is raised in this case. This behavior simplifies the field classes, because they don't need to check for options that aren't necessary. They just pass all the options to @@ -180,41 +187,42 @@ card values plus their suits; 104 characters in total. you want your fields to be more strict about the options they select, or to use the simpler, more permissive behavior of the current fields. -The ``Field.__init__()`` method takes the following parameters, in this -order: +The :meth:`~django.db.models.Field.__init__` method takes the following +parameters: - * ``verbose_name`` - * ``name`` - * ``primary_key`` - * ``max_length`` - * ``unique`` - * ``blank`` - * ``null`` - * ``db_index`` - * ``core`` - * ``rel``: Used for related fields (like ``ForeignKey``). For advanced use - only. - * ``default`` - * ``editable`` - * ``serialize``: If ``False``, the field will not be serialized when the - model is passed to Django's serializers_. Defaults to ``True``. - * ``prepopulate_from`` - * ``unique_for_date`` - * ``unique_for_month`` - * ``unique_for_year`` - * ``validator_list`` - * ``choices`` - * ``help_text`` - * ``db_column`` - * ``db_tablespace``: Currently only used with the Oracle backend and only - for index creation. You can usually ignore this option. + * :attr:`~django.db.models.Field.verbose_name` + * :attr:`~django.db.models.Field.name` + * :attr:`~django.db.models.Field.primary_key` + * :attr:`~django.db.models.Field.max_length` + * :attr:`~django.db.models.Field.unique` + * :attr:`~django.db.models.Field.blank` + * :attr:`~django.db.models.Field.null` + * :attr:`~django.db.models.Field.db_index` + * :attr:`~django.db.models.Field.core` + * :attr:`~django.db.models.Field.rel`: Used for related fields (like + :attr:`~django.db.models.Field.ForeignKey`). For advanced use only. + * :attr:`~django.db.models.Field.default` + * :attr:`~django.db.models.Field.editable` + * :attr:`~django.db.models.Field.serialize`: If + :attr:`~django.db.models.Field.False`, the field will not be serialized + when the model is passed to Django's :ref:`serializers + <topics-serialization>`. Defaults to + :attr:`~django.db.models.Field.True`. + * :attr:`~django.db.models.Field.prepopulate_from` + * :attr:`~django.db.models.Field.unique_for_date` + * :attr:`~django.db.models.Field.unique_for_month` + * :attr:`~django.db.models.Field.unique_for_year` + * :attr:`~django.db.models.Field.validator_list` + * :attr:`~django.db.models.Field.choices` + * :attr:`~django.db.models.Field.help_text` + * :attr:`~django.db.models.Field.db_column` + * :attr:`~django.db.models.Field.db_tablespace`: Currently only used with + the Oracle backend and only for index creation. You can usually ignore + this option. All of the options without an explanation in the above list have the same -meaning they do for normal Django fields. See the `model documentation`_ for -examples and details. - -.. _serializers: ../serialization/ -.. _model documentation: ../model-api/ +meaning they do for normal Django fields. See the :ref:`field documentation +<ref-models-fields>` for examples and details. The ``SubfieldBase`` metaclass ------------------------------ @@ -226,13 +234,16 @@ possible. If you're only working with custom database column types and your model fields appear in Python as standard Python types direct from the database backend, you don't need to worry about this section. -If you're handling custom Python types, such as our ``Hand`` class, we need -to make sure that when Django initializes an instance of our model and assigns -a database value to our custom field attribute, we convert that value into the +If you're handling custom Python types, such as our ``Hand`` class, we need to +make sure that when Django initializes an instance of our model and assigns a +database value to our custom field attribute, we convert that value into the appropriate Python object. The details of how this happens internally are a little complex, but the code you need to write in your ``Field`` class is -simple: make sure your field subclass uses ``django.db.models.SubfieldBase`` as -its metaclass:: +simple: make sure your field subclass uses a special metaclass: + +.. class:: django.db.models.SubfieldBase + +For example:: class HandField(models.Field): __metaclass__ = models.SubfieldBase @@ -240,27 +251,27 @@ its metaclass:: def __init__(self, *args, **kwargs): # ... -This ensures that the ``to_python()`` method, documented below_, will always be +This ensures that the :meth:`to_python` method, documented below, will always be called when the attribute is initialized. -.. _below: #to-python-self-value - Useful methods -------------- -Once you've created your ``Field`` subclass and set up up the -``__metaclass__``, you might consider overriding a few standard methods, +Once you've created your :class:`~django.db.models.Field` subclass and set up up +the ``__metaclass__``, you might consider overriding a few standard methods, depending on your field's behavior. The list of methods below is in approximately decreasing order of importance, so start from the top. -``db_type(self)`` -~~~~~~~~~~~~~~~~~ +Custom database types +~~~~~~~~~~~~~~~~~~~~~ -Returns the database column data type for the ``Field``, taking into account -the current ``DATABASE_ENGINE`` setting. +.. method:: db_type(self) + +Returns the database column data type for the :class:`~django.db.models.Field`, +taking into account the current :setting:`DATABASE_ENGINE` setting. Say you've created a PostgreSQL custom type called ``mytype``. You can use this -field with Django by subclassing ``Field`` and implementing the ``db_type()`` +field with Django by subclassing ``Field`` and implementing the :meth:`db_type` method, like so:: from django.db import models @@ -281,7 +292,7 @@ If you aim to build a database-agnostic application, you should account for differences in database column types. For example, the date/time column type in PostgreSQL is called ``timestamp``, while the same column in MySQL is called ``datetime``. The simplest way to handle this in a ``db_type()`` method is to -import the Django settings module and check the ``DATABASE_ENGINE`` setting. +import the Django settings module and check the :setting:`DATABASE_ENGINE` setting. For example:: class MyDateField(models.Field): @@ -292,11 +303,11 @@ For example:: else: return 'timestamp' -The ``db_type()`` method is only called by Django when the framework constructs -the ``CREATE TABLE`` statements for your application -- that is, when you first -create your tables. It's not called at any other time, so it can afford to -execute slightly complex code, such as the ``DATABASE_ENGINE`` check in the -above example. +The :meth:`db_type` method is only called by Django when the framework +constructs the ``CREATE TABLE`` statements for your application -- that is, when +you first create your tables. It's not called at any other time, so it can +afford to execute slightly complex code, such as the :setting:`DATABASE_ENGINE` +check in the above example. Some database column types accept parameters, such as ``CHAR(25)``, where the parameter ``25`` represents the maximum column length. In cases like these, @@ -316,7 +327,7 @@ sense to have a ``CharMaxlength25Field``, shown here:: The better way of doing this would be to make the parameter specifiable at run time -- i.e., when the class is instantiated. To do that, just implement -``__init__()``, like so:: +:meth:`django.db.models.Field.__init__`, like so:: # This is a much more flexible example. class BetterCharField(models.Field): @@ -333,13 +344,15 @@ time -- i.e., when the class is instantiated. To do that, just implement my_field = BetterCharField(25) Finally, if your column requires truly complex SQL setup, return ``None`` from -``db_type()``. This will cause Django's SQL creation code to skip over this +:meth:`db_type`. This will cause Django's SQL creation code to skip over this field. You are then responsible for creating the column in the right table in -some other way, of course, but this gives you a way to tell Django to get out -of the way. +some other way, of course, but this gives you a way to tell Django to get out of +the way. -``to_python(self, value)`` -~~~~~~~~~~~~~~~~~~~~~~~~~~ +Converting database values to Python objects +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. method:: to_python(self, value) Converts a value as returned by your database (or a serializer) to a Python object. @@ -348,10 +361,10 @@ The default implementation simply returns ``value``, for the common case in which the database backend already returns data in the correct format (as a Python string, for example). -If your custom ``Field`` class deals with data structures that are more complex -than strings, dates, integers or floats, then you'll need to override this -method. As a general rule, the method should deal gracefully with any of the -following arguments: +If your custom :class:`~django.db.models.Field` class deals with data structures +that are more complex than strings, dates, integers or floats, then you'll need +to override this method. As a general rule, the method should deal gracefully +with any of the following arguments: * An instance of the correct type (e.g., ``Hand`` in our ongoing example). @@ -361,7 +374,7 @@ following arguments: In our ``HandField`` class, we're storing the data as a VARCHAR field in the database, so we need to be able to process strings and ``Hand`` instances in -``to_python()``:: +:meth:`to_python`:: import re @@ -381,18 +394,20 @@ database, so we need to be able to process strings and ``Hand`` instances in Notice that we always return a ``Hand`` instance from this method. That's the Python object type we want to store in the model's attribute. -**Remember:** If your custom field needs the ``to_python()`` method to be +**Remember:** If your custom field needs the :meth:`to_python` method to be called when it is created, you should be using `The SubfieldBase metaclass`_ -mentioned earlier. Otherwise ``to_python()`` won't be called automatically. +mentioned earlier. Otherwise :meth:`to_python` won't be called automatically. -``get_db_prep_value(self, value)`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Converting Python objects to database values +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -This is the reverse of ``to_python()`` when working with the database backends +.. method:: get_db_prep_value(self, value) + +This is the reverse of :meth:`to_python` when working with the database backends (as opposed to serialization). The ``value`` parameter is the current value of the model's attribute (a field has no reference to its containing model, so it -cannot retrieve the value itself), and the method should return data in a -format that can be used as a parameter in a query for the database backend. +cannot retrieve the value itself), and the method should return data in a format +that can be used as a parameter in a query for the database backend. For example:: @@ -403,8 +418,7 @@ For example:: return ''.join([''.join(l) for l in (value.north, value.east, value.south, value.west)]) -``get_db_prep_save(self, value)`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.. method:: get_db_prep_save(self, value) Same as the above, but called when the Field value must be *saved* to the database. As the default implementation just calls ``get_db_prep_value``, you @@ -412,28 +426,33 @@ shouldn't need to implement this method unless your custom field need a special conversion when being saved that is not the same as the used for normal query parameters (which is implemented by ``get_db_prep_value``). +Preprocessing values before saving +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -``pre_save(self, model_instance, add)`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.. method:: pre_save(self, model_instance, add) -This method is called just prior to ``get_db_prep_save()`` and should return +This method is called just prior to :meth:`get_db_prep_save` and should return the value of the appropriate attribute from ``model_instance`` for this field. -The attribute name is in ``self.attname`` (this is set up by ``Field``). If -the model is being saved to the database for the first time, the ``add`` -parameter will be ``True``, otherwise it will be ``False``. +The attribute name is in ``self.attname`` (this is set up by +:class:`~django.db.models.Field`). If the model is being saved to the database +for the first time, the ``add`` parameter will be ``True``, otherwise it will be +``False``. You only need to override this method if you want to preprocess the value -somehow, just before saving. For example, Django's ``DateTimeField`` uses this -method to set the attribute correctly in the case of ``auto_now`` or -``auto_now_add``. +somehow, just before saving. For example, Django's +`:class:`~django.db.models.DateTimeField` uses this method to set the attribute +correctly in the case of :attr:`~django.db.models.Field.auto_now` or +:attr:`~django.db.models.Field.auto_now_add`. If you do override this method, you must return the value of the attribute at the end. You should also update the model's attribute if you make any changes to the value so that code holding references to the model will always see the correct value. -``get_db_prep_lookup(self, lookup_type, value)`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Preparing values for use in database lookups +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. method:: get_db_prep_lookup(self, lookup_type, value) Prepares the ``value`` for passing to the database when used in a lookup (a ``WHERE`` constraint in SQL). The ``lookup_type`` will be one of the valid @@ -447,7 +466,7 @@ should raise either a ``ValueError`` if the ``value`` is of the wrong sort (a list when you were expecting an object, for example) or a ``TypeError`` if your field does not support that type of lookup. For many fields, you can get by with handling the lookup types that need special handling for your field -and pass the rest of the ``get_db_prep_lookup()`` method of the parent class. +and pass the rest of the :meth:`get_db_prep_lookup` method of the parent class. If you needed to implement ``get_db_prep_save()``, you will usually need to implement ``get_db_prep_lookup()``. If you don't, ``get_db_prep_value`` will be @@ -478,22 +497,23 @@ accepted lookup types to ``exact`` and ``in``:: else: raise TypeError('Lookup type %r not supported.' % lookup_type) +Specifying the form field for a model field +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -``formfield(self, form_class=forms.CharField, **kwargs)`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.. method:: formfield(self, form_class=forms.CharField, **kwargs) -Returns the default form field to use when this field is displayed -in a model. +Returns the default form field to use when this field is displayed in a model. +This method is called by the :class:`~django.forms.ModelForm` helper. All of the ``kwargs`` dictionary is passed directly to the form field's -``__init__()`` method. Normally, all you need to do is set up a good default -for the ``form_class`` argument and then delegate further handling to the -parent class. This might require you to write a custom form field (and even a -form widget). See the `forms documentation`_ for information about this, and -take a look at the code in ``django.contrib.localflavor`` for some examples of -custom widgets. +:meth:`~django.forms.Field__init__` method. Normally, all you need to do is +set up a good default for the ``form_class`` argument and then delegate further +handling to the parent class. This might require you to write a custom form +field (and even a form widget). See the :ref:`forms documentation +<topics-forms-index>` for information about this, and take a look at the code in +:mod:`django.contrib.localflavor` for some examples of custom widgets. -Continuing our ongoing example, we can write the ``formfield()`` method as:: +Continuing our ongoing example, we can write the :meth:`formfield` method as:: class HandField(models.Field): # ... @@ -512,15 +532,17 @@ fields. .. _helper functions: ../forms/#generating-forms-for-models .. _forms documentation: ../forms/ -``get_internal_type(self)`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Emulating built-in field types +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Returns a string giving the name of the ``Field`` subclass we are emulating at -the database level. This is used to determine the type of database column for -simple cases. +.. method:: get_internal_type(self) -If you have created a ``db_type()`` method, you don't need to worry about -``get_internal_type()`` -- it won't be used much. Sometimes, though, your +Returns a string giving the name of the :class:`~django.db.models.Field` +subclass we are emulating at the database level. This is used to determine the +type of database column for simple cases. + +If you have created a :meth:`db_type` method, you don't need to worry about +:meth:`get_internal_type` -- it won't be used much. Sometimes, though, your database storage is similar in type to some other field, so you can use that other field's logic to create the right column. @@ -535,35 +557,35 @@ For example:: No matter which database backend we are using, this will mean that ``syncdb`` and other SQL commands create the right column type for storing a string. -If ``get_internal_type()`` returns a string that is not known to Django for +If :meth:`get_internal_type` returns a string that is not known to Django for the database backend you are using -- that is, it doesn't appear in -``django.db.backends.<db_name>.creation.DATA_TYPES`` -- the string will still -be used by the serializer, but the default ``db_type()`` method will return -``None``. See the documentation of ``db_type()`` above_ for reasons why this -might be useful. Putting a descriptive string in as the type of the field for -the serializer is a useful idea if you're ever going to be using the -serializer output in some other place, outside of Django. +``django.db.backends.<db_name>.creation.DATA_TYPES`` -- the string will still be +used by the serializer, but the default :meth:`db_type` method will return +``None``. See the documentation of :meth:`db_type` for reasons why this might be +useful. Putting a descriptive string in as the type of the field for the +serializer is a useful idea if you're ever going to be using the serializer +output in some other place, outside of Django. -.. _above: #db-type-self +Converting field data for serialization +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -``flatten_data(self, follow, obj=None)`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.. method:: flatten_data(self, follow, obj=None) .. admonition:: Subject to change Although implementing this method is necessary to allow field serialization, the API might change in the future. -Returns a dictionary, mapping the field's attribute name to a -flattened string version of the data. This method has some internal -uses that aren't of interest to use here (mostly having to do with -forms). For our purposes, it's sufficient to return a one item -dictionary that maps the attribute name to a string. +Returns a dictionary, mapping the field's attribute name to a flattened string +version of the data. This method has some internal uses that aren't of interest +to use here (mostly having to do with forms). For our purposes, it's sufficient +to return a one item dictionary that maps the attribute name to a string. This method is used by the serializers to convert the field into a string for -output. You can ignore the input parameters for serialization purposes, -although calling ``Field._get_val_from_obj(obj)`` is the best way to get the -value to serialize. +output. You can ignore the input parameters for serialization purposes, although +calling :meth:`Field._get_val_from_obj(obj) +<django.db.models.Field._get_val_from_obj>` is the best way to get the value to +serialize. For example, since our ``HandField`` uses strings for its data storage anyway, we can reuse some existing conversion code:: @@ -584,17 +606,19 @@ serialization formats. Here are a couple of tips to make things go more smoothly: 1. Look at the existing Django fields (in - ``django/db/models/fields/__init__.py``) for inspiration. Try to find a - field that's similar to what you want and extend it a little bit, + :file:`django/db/models/fields/__init__.py`) for inspiration. Try to find + a field that's similar to what you want and extend it a little bit, instead of creating an entirely new field from scratch. - 2. Put a ``__str__()`` or ``__unicode__()`` method on the class you're + 2. Put a :meth:`__str__` or :meth:`__unicode__` method on the class you're wrapping up as a field. There are a lot of places where the default - behavior of the field code is to call ``force_unicode()`` on the value. - (In our examples in this document, ``value`` would be a ``Hand`` - instance, not a ``HandField``). So if your ``__unicode__()`` method - automatically converts to the string form of your Python object, you can - save yourself a lot of work. + behavior of the field code is to call + :func:`~django.utils.encoding.force_unicode` on the value. (In our + examples in this document, ``value`` would be a ``Hand`` instance, not a + ``HandField``). So if your :meth:`__unicode__` method automatically + converts to the string form of your Python object, you can save yourself + a lot of work. + Writing a ``FileField`` subclass ================================= @@ -606,17 +630,15 @@ retrieval, can remain unchanged, leaving subclasses to deal with the challenge of supporting a particular type of file. Django provides a ``File`` class, which is used as a proxy to the file's -contents and operations. This can be subclassed to customzie hwo the file is +contents and operations. This can be subclassed to customize how the file is accessed, and what methods are available. It lives at ``django.db.models.fields.files``, and its default behavior is explained in the -`file documentation`_. +:ref:`file documentation <ref-files-file>`. Once a subclass of ``File`` is created, the new ``FileField`` subclass must be told to use it. To do so, simply assign the new ``File`` subclass to the special ``attr_class`` attribute of the ``FileField`` subclass. -.. _file documentation: ../files/ - A few suggestions ------------------ diff --git a/docs/templates_python.txt b/docs/howto/custom-template-tags.txt similarity index 55% rename from docs/templates_python.txt rename to docs/howto/custom-template-tags.txt index a03ea215d2..4477f6bb83 100644 --- a/docs/templates_python.txt +++ b/docs/howto/custom-template-tags.txt @@ -1,634 +1,61 @@ -==================================================== -The Django template language: For Python programmers -==================================================== +.. _howto-custom-template-tags: -This document explains the Django template system from a technical -perspective -- how it works and how to extend it. If you're just looking for -reference on the language syntax, see -`The Django template language: For template authors`_. +================================ +Custom template tags and filters +================================ -If you're looking to use the Django template system as part of another -application -- i.e., without the rest of the framework -- make sure to read -the `configuration`_ section later in this document. +Introduction +============ -.. _`The Django template language: For template authors`: ../templates/ +Django's template system comes a wide variety of :ref:`built-in tags and filters +<ref-templates-builtins>` designed to address the presentation logic needs of +your application. Nevertheless, you may find yourself needing functionality that +is not covered by the core set of template primitives. You can extend the +template engine by defining custom tags and filters using Python, and then make +them available to your templates using the ``{% load %}`` tag. -Basics -====== +Code layout +----------- -A **template** is a text document, or a normal Python string, that is marked-up -using the Django template language. A template can contain **block tags** or -**variables**. +Custom template tags and filters must live inside a Django app. If they relate +to an existing app it makes sense to bundle them there; otherwise, you should +create a new app to hold them. -A **block tag** is a symbol within a template that does something. +The app should contain a ``templatetags`` directory, at the same level as +``models.py``, ``views.py``, etc. If this doesn't already exist, create it - +don't forget the ``__init__.py`` file to ensure the directory is treated as a +Python package. -This definition is deliberately vague. For example, a block tag can output -content, serve as a control structure (an "if" statement or "for" loop), grab -content from a database or enable access to other template tags. +Your custom tags and filters will live in a module inside the ``templatetags`` +directory. The name of the module file is the name you'll use to load the tags +later, so be careful to pick a name that won't clash with custom tags and +filters in another app. -Block tags are surrounded by ``"{%"`` and ``"%}"``. - -Example template with block tags:: - - {% if is_logged_in %}Thanks for logging in!{% else %}Please log in.{% endif %} - -A **variable** is a symbol within a template that outputs a value. - -Variable tags are surrounded by ``"{{"`` and ``"}}"``. - -Example template with variables:: - - My first name is {{ first_name }}. My last name is {{ last_name }}. - -A **context** is a "variable name" -> "variable value" mapping that is passed -to a template. - -A template **renders** a context by replacing the variable "holes" with values -from the context and executing all block tags. - -Using the template system -========================= - -Using the template system in Python is a two-step process: - - * First, you compile the raw template code into a ``Template`` object. - * Then, you call the ``render()`` method of the ``Template`` object with a - given context. - -Compiling a string ------------------- - -The easiest way to create a ``Template`` object is by instantiating it -directly. The class lives at ``django.template.Template``. The constructor -takes one argument -- the raw template code:: - - >>> from django.template import Template - >>> t = Template("My name is {{ my_name }}.") - >>> print t - <django.template.Template instance> - -.. admonition:: Behind the scenes - - The system only parses your raw template code once -- when you create the - ``Template`` object. From then on, it's stored internally as a "node" - structure for performance. - - Even the parsing itself is quite fast. Most of the parsing happens via a - single call to a single, short, regular expression. - -Rendering a context -------------------- - -Once you have a compiled ``Template`` object, you can render a context -- or -multiple contexts -- with it. The ``Context`` class lives at -``django.template.Context``, and the constructor takes one (optional) -argument: a dictionary mapping variable names to variable values. Call the -``Template`` object's ``render()`` method with the context to "fill" the -template:: - - >>> from django.template import Context, Template - >>> t = Template("My name is {{ my_name }}.") - - >>> c = Context({"my_name": "Adrian"}) - >>> t.render(c) - "My name is Adrian." - - >>> c = Context({"my_name": "Dolores"}) - >>> t.render(c) - "My name is Dolores." - -Variable names must consist of any letter (A-Z), any digit (0-9), an underscore -or a dot. - -Dots have a special meaning in template rendering. A dot in a variable name -signifies **lookup**. Specifically, when the template system encounters a dot -in a variable name, it tries the following lookups, in this order: - - * Dictionary lookup. Example: ``foo["bar"]`` - * Attribute lookup. Example: ``foo.bar`` - * Method call. Example: ``foo.bar()`` - * List-index lookup. Example: ``foo[bar]`` - -The template system uses the first lookup type that works. It's short-circuit -logic. - -Here are a few examples:: - - >>> from django.template import Context, Template - >>> t = Template("My name is {{ person.first_name }}.") - >>> d = {"person": {"first_name": "Joe", "last_name": "Johnson"}} - >>> t.render(Context(d)) - "My name is Joe." - - >>> class PersonClass: pass - >>> p = PersonClass() - >>> p.first_name = "Ron" - >>> p.last_name = "Nasty" - >>> t.render(Context({"person": p})) - "My name is Ron." - - >>> class PersonClass2: - ... def first_name(self): - ... return "Samantha" - >>> p = PersonClass2() - >>> t.render(Context({"person": p})) - "My name is Samantha." - - >>> t = Template("The first stooge in the list is {{ stooges.0 }}.") - >>> c = Context({"stooges": ["Larry", "Curly", "Moe"]}) - >>> t.render(c) - "The first stooge in the list is Larry." - -Method lookups are slightly more complex than the other lookup types. Here are -some things to keep in mind: - - * If, during the method lookup, a method raises an exception, the exception - will be propagated, unless the exception has an attribute - ``silent_variable_failure`` whose value is ``True``. If the exception - *does* have a ``silent_variable_failure`` attribute, the variable will - render as an empty string. Example:: - - >>> t = Template("My name is {{ person.first_name }}.") - >>> class PersonClass3: - ... def first_name(self): - ... raise AssertionError, "foo" - >>> p = PersonClass3() - >>> t.render(Context({"person": p})) - Traceback (most recent call last): - ... - AssertionError: foo - - >>> class SilentAssertionError(Exception): - ... silent_variable_failure = True - >>> class PersonClass4: - ... def first_name(self): - ... raise SilentAssertionError - >>> p = PersonClass4() - >>> t.render(Context({"person": p})) - "My name is ." - - Note that ``django.core.exceptions.ObjectDoesNotExist``, which is the - base class for all Django database API ``DoesNotExist`` exceptions, has - ``silent_variable_failure = True``. So if you're using Django templates - with Django model objects, any ``DoesNotExist`` exception will fail - silently. - - * A method call will only work if the method has no required arguments. - Otherwise, the system will move to the next lookup type (list-index - lookup). - - * Obviously, some methods have side effects, and it'd be either foolish or - a security hole to allow the template system to access them. - - A good example is the ``delete()`` method on each Django model object. - The template system shouldn't be allowed to do something like this:: - - I will now delete this valuable data. {{ data.delete }} - - To prevent this, set a function attribute ``alters_data`` on the method. - The template system won't execute a method if the method has - ``alters_data=True`` set. The dynamically-generated ``delete()`` and - ``save()`` methods on Django model objects get ``alters_data=True`` - automatically. Example:: - - def sensitive_function(self): - self.database_record.delete() - sensitive_function.alters_data = True - -How invalid variables are handled -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Generally, if a variable doesn't exist, the template system inserts the -value of the ``TEMPLATE_STRING_IF_INVALID`` setting, which is set to ``''`` -(the empty string) by default. - -Filters that are applied to an invalid variable will only be applied if -``TEMPLATE_STRING_IF_INVALID`` is set to ``''`` (the empty string). If -``TEMPLATE_STRING_IF_INVALID`` is set to any other value, variable -filters will be ignored. - -This behavior is slightly different for the ``if``, ``for`` and ``regroup`` -template tags. If an invalid variable is provided to one of these template -tags, the variable will be interpreted as ``None``. Filters are always -applied to invalid variables within these template tags. - -If ``TEMPLATE_STRING_IF_INVALID`` contains a ``'%s'``, the format marker will -be replaced with the name of the invalid variable. - -.. admonition:: For debug purposes only! - - While ``TEMPLATE_STRING_IF_INVALID`` can be a useful debugging tool, - it is a bad idea to turn it on as a 'development default'. - - Many templates, including those in the Admin site, rely upon the - silence of the template system when a non-existent variable is - encountered. If you assign a value other than ``''`` to - ``TEMPLATE_STRING_IF_INVALID``, you will experience rendering - problems with these templates and sites. - - Generally, ``TEMPLATE_STRING_IF_INVALID`` should only be enabled - in order to debug a specific template problem, then cleared - once debugging is complete. - -Playing with Context objects ----------------------------- - -Most of the time, you'll instantiate ``Context`` objects by passing in a -fully-populated dictionary to ``Context()``. But you can add and delete items -from a ``Context`` object once it's been instantiated, too, using standard -dictionary syntax:: - - >>> c = Context({"foo": "bar"}) - >>> c['foo'] - 'bar' - >>> del c['foo'] - >>> c['foo'] - '' - >>> c['newvariable'] = 'hello' - >>> c['newvariable'] - 'hello' - -A ``Context`` object is a stack. That is, you can ``push()`` and ``pop()`` it. -If you ``pop()`` too much, it'll raise -``django.template.ContextPopException``:: - - >>> c = Context() - >>> c['foo'] = 'first level' - >>> c.push() - >>> c['foo'] = 'second level' - >>> c['foo'] - 'second level' - >>> c.pop() - >>> c['foo'] - 'first level' - >>> c['foo'] = 'overwritten' - >>> c['foo'] - 'overwritten' - >>> c.pop() - Traceback (most recent call last): - ... - django.template.ContextPopException - -Using a ``Context`` as a stack comes in handy in some custom template tags, as -you'll see below. - -Subclassing Context: RequestContext ------------------------------------ - -Django comes with a special ``Context`` class, -``django.template.RequestContext``, that acts slightly differently than -the normal ``django.template.Context``. The first difference is that it takes -an `HttpRequest object`_ as its first argument. For example:: - - c = RequestContext(request, { - 'foo': 'bar', - } - -The second difference is that it automatically populates the context with a few -variables, according to your `TEMPLATE_CONTEXT_PROCESSORS setting`_. - -The ``TEMPLATE_CONTEXT_PROCESSORS`` setting is a tuple of callables -- called -**context processors** -- that take a request object as their argument and -return a dictionary of items to be merged into the context. By default, -``TEMPLATE_CONTEXT_PROCESSORS`` is set to:: - - ("django.core.context_processors.auth", - "django.core.context_processors.debug", - "django.core.context_processors.i18n", - "django.core.context_processors.media") - -Each processor is applied in order. That means, if one processor adds a -variable to the context and a second processor adds a variable with the same -name, the second will override the first. The default processors are explained -below. - -Also, you can give ``RequestContext`` a list of additional processors, using the -optional, third positional argument, ``processors``. In this example, the -``RequestContext`` instance gets a ``ip_address`` variable:: - - def ip_address_processor(request): - return {'ip_address': request.META['REMOTE_ADDR']} - - def some_view(request): - # ... - c = RequestContext(request, { - 'foo': 'bar', - }, [ip_address_processor]) - return t.render(c) - -.. note:: - If you're using Django's ``render_to_response()`` shortcut to populate a - template with the contents of a dictionary, your template will be passed a - ``Context`` instance by default (not a ``RequestContext``). To use a - ``RequestContext`` in your template rendering, pass an optional third - argument to ``render_to_response()``: a ``RequestContext`` - instance. Your code might look like this:: - - def some_view(request): - # ... - return render_to_response('my_template.html', - my_data_dictionary, - context_instance=RequestContext(request)) - -Here's what each of the default processors does: - -.. _HttpRequest object: ../request_response/#httprequest-objects -.. _TEMPLATE_CONTEXT_PROCESSORS setting: ../settings/#template-context-processors - -django.core.context_processors.auth -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -If ``TEMPLATE_CONTEXT_PROCESSORS`` contains this processor, every -``RequestContext`` will contain these three variables: - - * ``user`` -- An ``auth.User`` instance representing the currently - logged-in user (or an ``AnonymousUser`` instance, if the client isn't - logged in). See the `user authentication docs`_. - - * ``messages`` -- A list of messages (as strings) for the currently - logged-in user. Behind the scenes, this calls - ``request.user.get_and_delete_messages()`` for every request. That method - collects the user's messages and deletes them from the database. - - Note that messages are set with ``user.message_set.create``. See the - `message docs`_ for more. - - * ``perms`` -- An instance of - ``django.core.context_processors.PermWrapper``, representing the - permissions that the currently logged-in user has. See the `permissions - docs`_. - -.. _user authentication docs: ../authentication/#users -.. _message docs: ../authentication/#messages -.. _permissions docs: ../authentication/#permissions - -django.core.context_processors.debug -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -If ``TEMPLATE_CONTEXT_PROCESSORS`` contains this processor, every -``RequestContext`` will contain these two variables -- but only if your -``DEBUG`` setting is set to ``True`` and the request's IP address -(``request.META['REMOTE_ADDR']``) is in the ``INTERNAL_IPS`` setting: - - * ``debug`` -- ``True``. You can use this in templates to test whether - you're in ``DEBUG`` mode. - * ``sql_queries`` -- A list of ``{'sql': ..., 'time': ...}`` dictionaries, - representing every SQL query that has happened so far during the request - and how long it took. The list is in order by query. - -django.core.context_processors.i18n -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -If ``TEMPLATE_CONTEXT_PROCESSORS`` contains this processor, every -``RequestContext`` will contain these two variables: - - * ``LANGUAGES`` -- The value of the `LANGUAGES setting`_. - * ``LANGUAGE_CODE`` -- ``request.LANGUAGE_CODE``, if it exists. Otherwise, - the value of the `LANGUAGE_CODE setting`_. - -See the `internationalization docs`_ for more. - -.. _LANGUAGES setting: ../settings/#languages -.. _LANGUAGE_CODE setting: ../settings/#language-code -.. _internationalization docs: ../i18n/ - -django.core.context_processors.media -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -**New in Django development version** - -If ``TEMPLATE_CONTEXT_PROCESSORS`` contains this processor, every -``RequestContext`` will contain a variable ``MEDIA_URL``, providing the -value of the `MEDIA_URL setting`_. - -.. _MEDIA_URL setting: ../settings/#media-url - -django.core.context_processors.request -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -If ``TEMPLATE_CONTEXT_PROCESSORS`` contains this processor, every -``RequestContext`` will contain a variable ``request``, which is the current -`HttpRequest object`_. Note that this processor is not enabled by default; -you'll have to activate it. - -Writing your own context processors -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -A context processor has a very simple interface: It's just a Python function -that takes one argument, an ``HttpRequest`` object, and returns a dictionary -that gets added to the template context. Each context processor *must* return -a dictionary. - -Custom context processors can live anywhere in your code base. All Django cares -about is that your custom context processors are pointed-to by your -``TEMPLATE_CONTEXT_PROCESSORS`` setting. - -Loading templates ------------------ - -Generally, you'll store templates in files on your filesystem rather than using -the low-level ``Template`` API yourself. Save templates in a directory -specified as a **template directory**. - -Django searches for template directories in a number of places, depending on -your template-loader settings (see "Loader types" below), but the most basic -way of specifying template directories is by using the ``TEMPLATE_DIRS`` -setting. - -The TEMPLATE_DIRS setting -~~~~~~~~~~~~~~~~~~~~~~~~~ - -Tell Django what your template directories are by using the ``TEMPLATE_DIRS`` -setting in your settings file. This should be set to a list or tuple of strings -that contain full paths to your template directory(ies). Example:: - - TEMPLATE_DIRS = ( - "/home/html/templates/lawrence.com", - "/home/html/templates/default", - ) - -Your templates can go anywhere you want, as long as the directories and -templates are readable by the Web server. They can have any extension you want, -such as ``.html`` or ``.txt``, or they can have no extension at all. - -Note that these paths should use Unix-style forward slashes, even on Windows. - -The Python API -~~~~~~~~~~~~~~ - -Django has two ways to load templates from files: - -``django.template.loader.get_template(template_name)`` - ``get_template`` returns the compiled template (a ``Template`` object) for - the template with the given name. If the template doesn't exist, it raises - ``django.template.TemplateDoesNotExist``. - -``django.template.loader.select_template(template_name_list)`` - ``select_template`` is just like ``get_template``, except it takes a list - of template names. Of the list, it returns the first template that exists. - -For example, if you call ``get_template('story_detail.html')`` and have the -above ``TEMPLATE_DIRS`` setting, here are the files Django will look for, in -order: - - * ``/home/html/templates/lawrence.com/story_detail.html`` - * ``/home/html/templates/default/story_detail.html`` - -If you call ``select_template(['story_253_detail.html', 'story_detail.html'])``, -here's what Django will look for: - - * ``/home/html/templates/lawrence.com/story_253_detail.html`` - * ``/home/html/templates/default/story_253_detail.html`` - * ``/home/html/templates/lawrence.com/story_detail.html`` - * ``/home/html/templates/default/story_detail.html`` - -When Django finds a template that exists, it stops looking. - -.. admonition:: Tip - - You can use ``select_template()`` for super-flexible "templatability." For - example, if you've written a news story and want some stories to have - custom templates, use something like - ``select_template(['story_%s_detail.html' % story.id, 'story_detail.html'])``. - That'll allow you to use a custom template for an individual story, with a - fallback template for stories that don't have custom templates. - -Using subdirectories -~~~~~~~~~~~~~~~~~~~~ - -It's possible -- and preferable -- to organize templates in subdirectories of -the template directory. The convention is to make a subdirectory for each -Django app, with subdirectories within those subdirectories as needed. - -Do this for your own sanity. Storing all templates in the root level of a -single directory gets messy. - -To load a template that's within a subdirectory, just use a slash, like so:: - - get_template('news/story_detail.html') - -Using the same ``TEMPLATE_DIRS`` setting from above, this example -``get_template()`` call will attempt to load the following templates: - - * ``/home/html/templates/lawrence.com/news/story_detail.html`` - * ``/home/html/templates/default/news/story_detail.html`` - -Loader types -~~~~~~~~~~~~ - -By default, Django uses a filesystem-based template loader, but Django comes -with a few other template loaders, which know how to load templates from other -sources. - -These other loaders are disabled by default, but you can activate them by -editing your ``TEMPLATE_LOADERS`` setting. ``TEMPLATE_LOADERS`` should be a -tuple of strings, where each string represents a template loader. Here are the -template loaders that come with Django: - -``django.template.loaders.filesystem.load_template_source`` - Loads templates from the filesystem, according to ``TEMPLATE_DIRS``. - -``django.template.loaders.app_directories.load_template_source`` - Loads templates from Django apps on the filesystem. For each app in - ``INSTALLED_APPS``, the loader looks for a ``templates`` subdirectory. If - the directory exists, Django looks for templates in there. - - This means you can store templates with your individual apps. This also - makes it easy to distribute Django apps with default templates. - - For example, for this setting:: - - INSTALLED_APPS = ('myproject.polls', 'myproject.music') - - ...then ``get_template('foo.html')`` will look for templates in these - directories, in this order: - - * ``/path/to/myproject/polls/templates/foo.html`` - * ``/path/to/myproject/music/templates/foo.html`` - - Note that the loader performs an optimization when it is first imported: - It caches a list of which ``INSTALLED_APPS`` packages have a ``templates`` - subdirectory. - -``django.template.loaders.eggs.load_template_source`` - Just like ``app_directories`` above, but it loads templates from Python - eggs rather than from the filesystem. - -Django uses the template loaders in order according to the ``TEMPLATE_LOADERS`` -setting. It uses each loader until a loader finds a match. - -The ``render_to_string()`` shortcut -=================================== - -To cut down on the repetitive nature of loading and rendering -templates, Django provides a shortcut function which largely -automates the process: ``render_to_string()`` in -``django.template.loader``, which loads a template, renders it and -returns the resulting string:: - - from django.template.loader import render_to_string - rendered = render_to_string('my_template.html', { 'foo': 'bar' }) - -The ``render_to_string`` shortcut takes one required argument -- -``template_name``, which should be the name of the template to load -and render -- and two optional arguments:: - - dictionary - A dictionary to be used as variables and values for the - template's context. This can also be passed as the second - positional argument. - - context_instance - An instance of ``Context`` or a subclass (e.g., an instance of - ``RequestContext``) to use as the template's context. This can - also be passed as the third positional argument. - -See also the `render_to_response()`_ shortcut, which calls -``render_to_string`` and feeds the result into an ``HttpResponse`` -suitable for returning directly from a view. - -.. _render_to_response(): ../shortcuts/#render-to-response - -Extending the template system -============================= - -Although the Django template language comes with several default tags and -filters, you might want to write your own. It's easy to do. - -First, create a ``templatetags`` package in the appropriate Django app's -package. It should be on the same level as ``models.py``, ``views.py``, etc. For -example:: +For example, if your custom tags/filters are in a file called +``poll_extras.py``, your app layout might look like this:: polls/ models.py templatetags/ + __init__.py + poll_extras.py views.py -Add two files to the ``templatetags`` package: an ``__init__.py`` file and a -file that will contain your custom tag/filter definitions. The name of the -latter file is the name you'll use to load the tags later. For example, if your -custom tags/filters are in a file called ``poll_extras.py``, you'd do the -following in a template:: +And in your template you would use the following: + +.. code-block:: html+django {% load poll_extras %} -The ``{% load %}`` tag looks at your ``INSTALLED_APPS`` setting and only allows -the loading of template libraries within installed Django apps. This is a -security feature: It allows you to host Python code for many template libraries -on a single computer without enabling access to all of them for every Django -installation. - -If you write a template library that isn't tied to any particular models/views, -it's perfectly OK to have a Django app package that only contains a -``templatetags`` package. +The app that contains the custom tags must be in :setting:`INSTALLED_APPS` in +order for the ``{% load %}`` tag to work. This is a security feature: It allows +you to host Python code for many template libraries on a single host machine +without enabling access to all of them for every Django installation. There's no limit on how many modules you put in the ``templatetags`` package. Just keep in mind that a ``{% load %}`` statement will load tags/filters for the given Python module name, not the name of the app. -Once you've created that Python module, you'll just have to write a bit of -Python code, depending on whether you're writing filters or tags. - To be a valid tag library, the module must contain a module-level variable named ``register`` that is a ``template.Library`` instance, in which all the tags and filters are registered. So, near the top of your module, put the @@ -666,7 +93,9 @@ Here's an example filter definition:: "Removes all values of arg from the given string" return value.replace(arg, '') -And here's an example of how that filter would be used:: +And here's an example of how that filter would be used: + +.. code-block:: html+django {{ somevariable|cut:"0" }} @@ -790,10 +219,10 @@ Template filter code falls into one of two situations: the result (aside from any that were already present), you should mark your filter with ``is_safe``:: - @register.filter - def add_xx(value): - return '%sxx' % value - add_xx.is_safe = True + @register.filter + def add_xx(value): + return '%sxx' % value + add_xx.is_safe = True When this filter is used in a template where auto-escaping is enabled, Django will escape the output whenever the input is not already marked as @@ -818,7 +247,8 @@ Template filter code falls into one of two situations: escaping so that your HTML markup isn't escaped further, so you'll need to handle the input yourself. - To mark the output as a safe string, use ``django.utils.safestring.mark_safe()``. + To mark the output as a safe string, use + :func:`django.utils.safestring.mark_safe`. Be careful, though. You need to do more than just mark the output as safe. You need to ensure it really *is* safe, and what you do depends on @@ -852,9 +282,9 @@ Template filter code falls into one of two situations: The ``needs_autoescape`` attribute on the filter function and the ``autoescape`` keyword argument mean that our function will know whether automatic escaping is in effect when the filter is called. We use - ``autoescape`` to decide whether the input data needs to be passed through - ``django.utils.html.conditional_escape`` or not. (In the latter case, we - just use the identity function as the "escape" function.) The + ``autoescape`` to decide whether the input data needs to be passed + through ``django.utils.html.conditional_escape`` or not. (In the latter + case, we just use the identity function as the "escape" function.) The ``conditional_escape()`` function is like ``escape()`` except it only escapes input that is **not** a ``SafeData`` instance. If a ``SafeData`` instance is passed to ``conditional_escape()``, the data is returned @@ -902,7 +332,9 @@ responsible for returning a ``Node`` instance based on the contents of the tag. For example, let's write a template tag, ``{% current_time %}``, that displays the current date/time, formatted according to a parameter given in the tag, in `strftime syntax`_. It's a good idea to decide the tag syntax before anything -else. In our case, let's say the tag should be used like this:: +else. In our case, let's say the tag should be used like this: + +.. code-block:: html+django <p>The time is {% current_time "%Y-%m-%d %I:%M %p" %}.</p> @@ -1064,7 +496,9 @@ content (a template variable) to a template tag as an argument. While the previous examples have formatted the current time into a string and returned the string, suppose you wanted to pass in a ``DateTimeField`` from an -object and have the template tag format that date-time:: +object and have the template tag format that date-time: + +.. code-block:: html+django <p>This post was last updated at {% format_time blog_entry.date_updated "%Y-%m-%d %I:%M %p" %}.</p> @@ -1174,7 +608,7 @@ In Python 2.4, the decorator syntax also works:: A couple of things to note about the ``simple_tag`` helper function: - * Checking for the required number of arguments, etc, has already been + * Checking for the required number of arguments, etc., has already been done by the time our function is called, so we don't need to do that. * The quotes around the argument (if any) have already been stripped away, so we just receive a plain string. @@ -1200,11 +634,15 @@ These sorts of tags are called "inclusion tags". Writing inclusion tags is probably best demonstrated by example. Let's write a tag that outputs a list of choices for a given ``Poll`` object, such as was -created in the tutorials_. We'll use the tag like this:: +created in the :ref:`tutorials <creating-models>`. We'll use the tag like this: + +.. code-block:: html+django {% show_results poll %} -...and the output will be something like this:: +...and the output will be something like this: + +.. code-block:: html <ul> <li>First choice</li> @@ -1223,7 +661,9 @@ for the template fragment. Example:: Next, create the template used to render the tag's output. This template is a fixed feature of the tag: the tag writer specifies it, not the template -designer. Following our example, the template is very simple:: +designer. Following our example, the template is very simple: + +.. code-block:: html+django <ul> {% for choice in choices %} @@ -1272,13 +712,17 @@ back to the main page. Here's what the Python function would look like:: In that ``register.inclusion_tag()`` line, we specified ``takes_context=True`` and the name of the template. Here's what the template ``link.html`` might look -like:: +like: + +.. code-block:: html+django Jump directly to <a href="{{ link }}">{{ title }}</a>. Then, any time you want to use that custom tag, load its library and call it without any arguments, like so:: +.. code-block:: html+django + {% jump_link %} Note that when you're using ``takes_context=True``, there's no need to pass @@ -1288,8 +732,6 @@ The ``takes_context`` parameter defaults to ``False``. When it's set to *True*, the tag is passed the context object, as in this example. That's the only difference between this case and the previous ``inclusion_tag`` example. -.. _tutorials: ../tutorial01/#creating-models - Setting a variable in the context ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -1313,7 +755,9 @@ Note that ``render()`` returns the empty string. ``render()`` should always return string output. If all the template tag does is set a variable, ``render()`` should return the empty string. -Here's how you'd use this new version of the tag:: +Here's how you'd use this new version of the tag: + +.. code-block:: html+django {% current_time "%Y-%M-%d %I:%M %p" %}<p>The time is {{ current_time }}.</p> @@ -1322,7 +766,9 @@ But, there's a problem with ``CurrentTimeNode2``: The variable name template doesn't use ``{{ current_time }}`` anywhere else, because the ``{% current_time %}`` will blindly overwrite that variable's value. A cleaner solution is to make the template tag specify the name of the output variable, -like so:: +like so: + +.. code-block:: html+django {% get_current_time "%Y-%M-%d %I:%M %p" as my_current_time %} <p>The current time is {{ my_current_time }}.</p> @@ -1402,7 +848,9 @@ possible to do something with the code between block tags. For example, here's a custom template tag, ``{% upper %}``, that capitalizes everything between itself and ``{% endupper %}``. -Usage:: +Usage: + +.. code-block:: html+django {% upper %}This will appear in uppercase, {{ your_name }}.{% endupper %} @@ -1427,37 +875,3 @@ The only new concept here is the ``self.nodelist.render(context)`` in For more examples of complex rendering, see the source code for ``{% if %}``, ``{% for %}``, ``{% ifequal %}`` and ``{% ifchanged %}``. They live in ``django/template/defaulttags.py``. - -.. _configuration: - -Configuring the template system in standalone mode -================================================== - -.. note:: - - This section is only of interest to people trying to use the template - system as an output component in another application. If you're using the - template system as part of a Django application, nothing here applies to - you. - -Normally, Django will load all the configuration information it needs from its -own default configuration file, combined with the settings in the module given -in the ``DJANGO_SETTINGS_MODULE`` environment variable. But if you're using the -template system independently of the rest of Django, the environment variable -approach isn't very convenient, because you probably want to configure the -template system in line with the rest of your application rather than dealing -with settings files and pointing to them via environment variables. - -To solve this problem, you need to use the manual configuration option -described in the `settings file`_ documentation. Simply import the appropriate -pieces of the templating system and then, *before* you call any of the -templating functions, call ``django.conf.settings.configure()`` with any -settings you wish to specify. You might want to consider setting at least -``TEMPLATE_DIRS`` (if you're going to use template loaders), -``DEFAULT_CHARSET`` (although the default of ``utf-8`` is probably fine) and -``TEMPLATE_DEBUG``. All available settings are described in the -`settings documentation`_, and any setting starting with *TEMPLATE_* -is of obvious interest. - -.. _settings file: ../settings/#using-settings-without-the-django-settings-module-environment-variable -.. _settings documentation: ../settings/ diff --git a/docs/fastcgi.txt b/docs/howto/deployment/fastcgi.txt similarity index 86% rename from docs/fastcgi.txt rename to docs/howto/deployment/fastcgi.txt index edd4c8a83d..f9f9a8184a 100644 --- a/docs/fastcgi.txt +++ b/docs/howto/deployment/fastcgi.txt @@ -1,17 +1,22 @@ +.. _howto-deployment-fastcgi: + =========================================== How to use Django with FastCGI, SCGI or AJP =========================================== -Although the `current preferred setup`_ for running Django is Apache_ with -`mod_python`_, many people use shared hosting, on which protocols such as -FastCGI, SCGI or AJP are the only viable options. In some setups, these protocols -also allow better security -- and, possibly, better performance -- than mod_python. +.. highlight:: bash + +Although the current preferred setup for running Django is :ref:`Apache with +mod_python <howto-deployment-modpython>`, many people use shared hosting, on +which protocols such as FastCGI, SCGI or AJP are the only viable options. In +some setups, these protocols also allow better security -- and, possibly, better +performance -- than mod_python_. .. admonition:: Note This document primarily focuses on FastCGI. Other protocols, such as SCGI and AJP, are also supported, through the ``flup`` Python package. See the - "Protocols" section below for specifics about SCGI and AJP. + Protocols_ section below for specifics about SCGI and AJP. Essentially, FastCGI is an efficient way of letting an external application serve pages to a Web server. The Web server delegates the incoming Web requests @@ -19,12 +24,10 @@ serve pages to a Web server. The Web server delegates the incoming Web requests to the Web server, which, in turn, passes it back to the client's Web browser. Like mod_python, FastCGI allows code to stay in memory, allowing requests to be -served with no startup time. Unlike mod_python (or `mod_perl`_), a FastCGI +served with no startup time. Unlike mod_python_ (or `mod_perl`_), a FastCGI process doesn't run inside the Web server process, but in a separate, persistent process. -.. _current preferred setup: ../modpython/ -.. _Apache: http://httpd.apache.org/ .. _mod_python: http://www.modpython.org/ .. _mod_perl: http://perl.apache.org/ @@ -45,9 +48,8 @@ persistent process. Prerequisite: flup ================== -Before you can start using FastCGI with Django, you'll need to install flup_, -which is a Python library for dealing with FastCGI. Version 0.5 or newer should -work fine. +Before you can start using FastCGI with Django, you'll need to install flup_, a +Python library for dealing with FastCGI. Version 0.5 or newer should work fine. .. _flup: http://www.saddi.com/software/flup/ @@ -72,25 +74,27 @@ TCP socket. What you choose is a manner of preference; a TCP socket is usually easier due to permissions issues. To start your server, first change into the directory of your project (wherever -your ``manage.py`` is), and then run ``manage.py`` with the ``runfcgi`` option:: +your :ref:`manage.py <ref-django-admin>` is), and then run the +:djadmin:`runfcgi` command:: ./manage.py runfcgi [options] -If you specify ``help`` as the only option after ``runfcgi``, it'll display a -list of all the available options. +If you specify ``help`` as the only option after :djadmin:`runfcgi`, it'll +display a list of all the available options. -You'll need to specify either a ``socket``, ``protocol`` or both ``host`` and -``port``. Then, when you set up your Web server, you'll just need to point it -at the host/port or socket you specified when starting the FastCGI server. +You'll need to specify either a ``socket``, a ``protocol`` or both ``host`` and +``port``. Then, when you set up your Web server, you'll just need to point it at +the host/port or socket you specified when starting the FastCGI server. See the +examples_, below. Protocols --------- Django supports all the protocols that flup_ does, namely fastcgi_, `SCGI`_ and `AJP1.3`_ (the Apache JServ Protocol, version 1.3). Select your preferred -protocol by using the ``protocol=<protocol_name>`` option with -``./manage.py runfcgi`` -- where ``<protocol_name>`` may be one of: ``fcgi`` -(the default), ``scgi`` or ``ajp``. For example:: +protocol by using the ``protocol=<protocol_name>`` option with ``./manage.py +runfcgi`` -- where ``<protocol_name>`` may be one of: ``fcgi`` (the default), +``scgi`` or ``ajp``. For example:: ./manage.py runfcgi protocol=scgi @@ -122,8 +126,8 @@ Simply hitting ``Ctrl-C`` will stop and quit the FastCGI server. However, when you're dealing with background processes, you'll need to resort to the Unix ``kill`` command. -If you specify the ``pidfile`` option to your ``manage.py runfcgi``, you can -kill the running FastCGI daemon like this:: +If you specify the ``pidfile`` option to :djadmin:`runfcgi`, you can kill the +running FastCGI daemon like this:: kill `cat $PIDFILE` @@ -170,7 +174,9 @@ Specifying the location of the FastCGI server The ``FastCGIExternalServer`` directive tells Apache how to find your FastCGI server. As the `FastCGIExternalServer docs`_ explain, you can specify either a -``socket`` or a ``host``. Here are examples of both:: +``socket`` or a ``host``. Here are examples of both: + +.. code-block:: apache # Connect to FastCGI via a socket / named pipe. FastCGIExternalServer /home/user/public_html/mysite.fcgi -socket /home/user/mysite.sock @@ -195,7 +201,9 @@ directive, as explained in the previous section). In this example, we tell Apache to use FastCGI to handle any request that doesn't represent a file on the filesystem and doesn't start with ``/media/``. -This is probably the most common case, if you're using Django's admin site:: +This is probably the most common case, if you're using Django's admin site: + +.. code-block:: apache <VirtualHost 12.34.56.78> ServerName example.com @@ -215,15 +223,19 @@ constructing URLs with the ``{% url %}`` template tag (and similar methods). lighttpd setup ============== -lighttpd is a lightweight Web server commonly used for serving static files. It +lighttpd_ is a lightweight Web server commonly used for serving static files. It supports FastCGI natively and, thus, is a good choice for serving both static and dynamic pages, if your site doesn't have any Apache-specific needs. +.. _lighttpd: http://www.lighttpd.net/ + Make sure ``mod_fastcgi`` is in your modules list, somewhere after ``mod_rewrite`` and ``mod_access``, but not after ``mod_accesslog``. You'll probably want ``mod_alias`` as well, for serving admin media. -Add the following to your lighttpd config file:: +Add the following to your lighttpd config file: + +.. code-block:: lua server.document-root = "/home/user/public_html" fastcgi.server = ( @@ -289,7 +301,9 @@ using Web server-spawned processes. there's no need for you to start the FastCGI server on your own. Apache will spawn a number of processes, scaling as it needs to. -In your Web root directory, add this to a file named ``.htaccess`` :: +In your Web root directory, add this to a file named ``.htaccess``: + +.. code-block:: apache AddHandler fastcgi-script .fcgi RewriteEngine On @@ -298,7 +312,9 @@ In your Web root directory, add this to a file named ``.htaccess`` :: Then, create a small script that tells Apache how to spawn your FastCGI program. Create a file ``mysite.fcgi`` and place it in your Web directory, and -be sure to make it executable:: +be sure to make it executable: + +.. code-block:: python #!/usr/bin/python import sys, os @@ -332,12 +348,10 @@ easily by using the ``touch`` command:: Serving admin media files ========================= -Regardless of the server and configuration you eventually decide to use, you will -also need to give some thought to how to serve the admin media files. The -advice given in the modpython_ documentation is also applicable in the setups -detailed above. - -.. _modpython: ../modpython/#serving-the-admin-files +Regardless of the server and configuration you eventually decide to use, you +will also need to give some thought to how to serve the admin media files. The +advice given in the :ref:`modpython <serving-the-admin-files>` documentation +is also applicable in the setups detailed above. Forcing the URL prefix to a particular value ============================================ @@ -366,3 +380,4 @@ As an example of how to use it, if your Django configuration is serving all of the URLs under ``'/'`` and you wanted to use this setting, you would set ``FORCE_SCRIPT_NAME = ''`` in your settings file. + diff --git a/docs/howto/deployment/index.txt b/docs/howto/deployment/index.txt new file mode 100644 index 0000000000..80c16fcd82 --- /dev/null +++ b/docs/howto/deployment/index.txt @@ -0,0 +1,33 @@ +.. _howto-deployment-index: + +Deploying Django +================ + +Django's chock-full of shortcuts to make web developer's lives easier, but all +those tools are of no use if you can't easily deploy your sites. Since Django's +inception, ease of deployment has been a major goal. There's a number of good +ways to easily deploy Django: + +.. toctree:: + :maxdepth: 1 + + modpython + fastcgi + +:ref:`Deploying under mod_python <howto-deployment-modpython>` is the +recommended deployment method; start there if you're not sure which path you'd +like to go down. + +.. seealso:: + + * `Chapter 20 of The Django Book`_ discusses deployment and especially + scaling in more detail. + + * `mod_wsgi`_ is a newcomer to the Python deployment world, but it's rapidly + gaining traction. Currently there's a few hoops you have to jump through to + `use mod_wsgi with Django`_, but mod_wsgi tends to get rave reviews from + those who use it. + +.. _chapter 20 of the django book: http://djangobook.com/en/1.0/chapter20/ +.. _mod_wsgi: http://code.google.com/p/modwsgi/ +.. _use mod_wsgi with Django: http://code.google.com/p/modwsgi/wiki/IntegrationWithDjango \ No newline at end of file diff --git a/docs/modpython.txt b/docs/howto/deployment/modpython.txt similarity index 83% rename from docs/modpython.txt rename to docs/howto/deployment/modpython.txt index 44de0e1bd2..0303e13153 100644 --- a/docs/modpython.txt +++ b/docs/howto/deployment/modpython.txt @@ -1,27 +1,30 @@ -================================= -How to use Django with mod_python -================================= +.. _howto-deployment-modpython: + +============================================ +How to use Django with Apache and mod_python +============================================ + +.. highlight:: apache Apache_ with `mod_python`_ currently is the preferred setup for using Django on a production server. -mod_python is similar to `mod_perl`_ : It embeds Python within Apache and loads -Python code into memory when the server starts. Code stays in memory throughout -the life of an Apache process, which leads to significant performance gains over -other server arrangements. +mod_python is similar to (and inspired by) `mod_perl`_ : It embeds Python within +Apache and loads Python code into memory when the server starts. Code stays in +memory throughout the life of an Apache process, which leads to significant +performance gains over other server arrangements. Django requires Apache 2.x and mod_python 3.x, and you should use Apache's `prefork MPM`_, as opposed to the `worker MPM`_. -You may also be interested in `How to use Django with FastCGI, SCGI or AJP`_ -(which also covers SCGI and AJP). +You may also be interested in :ref:`How to use Django with FastCGI, SCGI or AJP +<howto-deployment-fastcgi>` (which also covers SCGI and AJP). .. _Apache: http://httpd.apache.org/ .. _mod_python: http://www.modpython.org/ .. _mod_perl: http://perl.apache.org/ .. _prefork MPM: http://httpd.apache.org/docs/2.2/mod/prefork.html .. _worker MPM: http://httpd.apache.org/docs/2.2/mod/worker.html -.. _How to use Django with FastCGI, SCGI or AJP: ../fastcgi/ Basic configuration =================== @@ -35,7 +38,7 @@ Then edit your ``httpd.conf`` file and add the following:: SetHandler python-program PythonHandler django.core.handlers.modpython SetEnv DJANGO_SETTINGS_MODULE mysite.settings - PythonOption django.root /mysite + PythonOption django.root /mysite PythonDebug On </Location> @@ -43,8 +46,8 @@ Then edit your ``httpd.conf`` file and add the following:: project's settings file. This tells Apache: "Use mod_python for any URL at or under '/mysite/', using the -Django mod_python handler." It passes the value of ``DJANGO_SETTINGS_MODULE`` -so mod_python knows which settings to use. +Django mod_python handler." It passes the value of :ref:`DJANGO_SETTINGS_MODULE +<django-settings-module>` so mod_python knows which settings to use. **New in Django development version:** Because mod_python does not know we are serving this site from underneath the ``/mysite/`` prefix, this value needs to @@ -78,27 +81,27 @@ computer, you'll have to tell mod_python where your project can be found: SetHandler python-program PythonHandler django.core.handlers.modpython SetEnv DJANGO_SETTINGS_MODULE mysite.settings - PythonOption django.root /mysite + PythonOption django.root /mysite PythonDebug On **PythonPath "['/path/to/project'] + sys.path"** </Location> The value you use for ``PythonPath`` should include the parent directories of all the modules you are going to import in your application. It should also -include the parent directory of the ``DJANGO_SETTINGS_MODULE`` location. This -is exactly the same situation as setting the Python path for interactive -usage. Whenever you try to import something, Python will run through all the -directories in ``sys.path`` in turn, from first to last, and try to import -from each directory until one succeeds. +include the parent directory of the :ref:`DJANGO_SETTINGS_MODULE +<django-settings-module>` location. This is exactly the same situation as +setting the Python path for interactive usage. Whenever you try to import +something, Python will run through all the directories in ``sys.path`` in turn, +from first to last, and try to import from each directory until one succeeds. -An example might make this clearer. Suppose -you have some applications under ``/usr/local/django-apps/`` (for example, -``/usr/local/django-apps/weblog/`` and so forth), your settings file is at -``/var/www/mysite/settings.py`` and you have specified -``DJANGO_SETTINGS_MODULE`` as in the above example. In this case, you would -need to write your ``PythonPath`` directive as:: +An example might make this clearer. Suppose you have some applications under +``/usr/local/django-apps/`` (for example, ``/usr/local/django-apps/weblog/`` and +so forth), your settings file is at ``/var/www/mysite/settings.py`` and you have +specified :ref:`DJANGO_SETTINGS_MODULE <django-settings-module>` as in the above +example. In this case, you would need to write your ``PythonPath`` directive +as:: - PythonPath "['/usr/local/django-apps/', '/var/www'] + sys.path" + PythonPath "['/usr/local/django-apps/', '/var/www'] + sys.path" With this path, ``import weblog`` and ``import mysite.settings`` will both work. If you had ``import blogroll`` in your code somewhere and ``blogroll`` @@ -127,9 +130,9 @@ Note that you should set ``PythonDebug Off`` on a production server. If you leave ``PythonDebug On``, your users would see ugly (and revealing) Python tracebacks if something goes wrong within mod_python. -Restart Apache, and any request to /mysite/ or below will be served by Django. -Note that Django's URLconfs won't trim the "/mysite/" -- they get passed the -full URL. +Restart Apache, and any request to ``/mysite/`` or below will be served by +Django. Note that Django's URLconfs won't trim the "/mysite/" -- they get passed +the full URL. When deploying Django sites on mod_python, you'll need to restart Apache each time you make changes to your Python code. @@ -196,6 +199,8 @@ Or add the debugging information to the template of your page. .. _mod_python documentation: http://modpython.org/live/current/doc-html/directives.html +.. _serving-media-files: + Serving media files =================== @@ -205,9 +210,9 @@ server you choose. We recommend using a separate Web server -- i.e., one that's not also running Django -- for serving media. Here are some good choices: -* lighttpd_ -* TUX_ -* A stripped-down version of Apache_ + * lighttpd_ + * TUX_ + * A stripped-down version of Apache_ If, however, you have no option but to serve media files on the same Apache ``VirtualHost`` as Django, here's how you can turn off mod_python for a @@ -243,6 +248,10 @@ the ``media`` subdirectory and any URL that ends with ``.jpg``, ``.gif`` or .. _TUX: http://en.wikipedia.org/wiki/TUX_web_server .. _Apache: http://httpd.apache.org/ +.. _howto-deployment-modpython-serving-the-admin-files: + +.. _serving-the-admin-files: + Serving the admin files ======================= @@ -251,25 +260,27 @@ but this is not the case when you use any other server arrangement. You're responsible for setting up Apache, or whichever media server you're using, to serve the admin files. -The admin files live in (``django/contrib/admin/media``) of the Django +The admin files live in (:file:`django/contrib/admin/media`) of the Django distribution. Here are two recommended approaches: 1. Create a symbolic link to the admin media files from within your - document root. This way, all of your Django-related files -- code - **and** templates -- stay in one place, and you'll still be able to - ``svn update`` your code to get the latest admin templates, if they - change. + document root. This way, all of your Django-related files -- code **and** + templates -- stay in one place, and you'll still be able to ``svn + update`` your code to get the latest admin templates, if they change. + 2. Or, copy the admin media files so that they live within your Apache document root. -Using eggs with mod_python -========================== +Using "eggs" with mod_python +============================ If you installed Django from a Python egg_ or are using eggs in your Django project, some extra configuration is required. Create an extra file in your -project (or somewhere else) that contains something like the following:: +project (or somewhere else) that contains something like the following: + +.. code-block:: python import os os.environ['PYTHON_EGG_CACHE'] = '/some/directory' @@ -322,6 +333,7 @@ of which has to do with Django itself. 1. It may be because your Python code is importing the "pyexpat" module, which may conflict with the version embedded in Apache. For full information, see `Expat Causing Apache Crash`_. + 2. It may be because you're running mod_python and mod_php in the same Apache instance, with MySQL as your database backend. In some cases, this causes a known mod_python issue due to version conflicts in PHP and diff --git a/docs/howto/error-reporting.txt b/docs/howto/error-reporting.txt new file mode 100644 index 0000000000..e0750ce327 --- /dev/null +++ b/docs/howto/error-reporting.txt @@ -0,0 +1,65 @@ +.. _howto-error-reporting: + +Error reporting via e-mail +========================== + +When you're running a public site you should always turn off the +:setting:`DEBUG` setting. That will make your server run much faster, and will +also prevent malicious users from seeing details of your application that can be +revealed by the error pages. + +However, running with :setting:`DEBUG` set to ``False`` means you'll never see +errors generated by your site -- everyone will just see your public error pages. +You need to keep track of errors that occur in deployed sites, so Django can be +configured to email you details of those errors. + +Server errors +------------- + +When :setting:`DEBUG` is ``False``, Django will e-mail the users listed in the +:setting:`ADMIN` setting whenever your code raises an unhandled exception and +results in an internal server error (HTTP status code 500). This gives the +administrators immediate notification of any errors. The :setting:`ADMINS` will +get a description of the error, a complete Python traceback, and details about +the HTTP request that caused the error. + +To disable this behavior, just remove all entries from the :setting:`ADMINS` +setting. + +404 errors +---------- + +Django can also be configured to email errors about broken links (404 "page +not found" errors). Django sends emails about 404 errors when: + + * :setting:`DEBUG` is ``False`` + + * :setting:`SEND_BROKEN_LINK_EMAILS` is ``True`` + + * Your :setting:`MIDDLEWARE_CLASSES` setting includes ``CommonMiddleware`` + (which it does by default). + +If those conditions are met, Django will e-mail the users listed in the +:setting:`MANAGERS` setting whenever your code raises a 404 and the request has +a referer. (It doesn't bother to e-mail for 404s that don't have a referer -- +those are usually just people typing in broken URLs or broken web 'bots). + +You can tell Django to stop reporting particular 404s by tweaking the +:setting:`IGNORABLE_404_ENDS` and :setting:`IGNORABLE_404_STARTS` settings. Both +should be a tuple of strings. For example:: + + IGNORABLE_404_ENDS = ('.php', '.cgi') + IGNORABLE_404_STARTS = ('/phpmyadmin/',) + +In this example, a 404 to any URL ending with ``.php`` or ``.cgi`` will *not* be +reported. Neither will any URL starting with ``/phpmyadmin/``. + +The best way to disable this behavior is to set +:setting:`SEND_BROKEN_LINK_EMAILS` to ``False``. + +.. seealso:: + + You can also set up custom error reporting by writing a custom piece of + :ref:`exception middleware <exception-middleware>`. If you do write custom + error handling, it's a good idea to emulate Django's built-in error handling + and only report/log errors if :setting:`DEBUG` is ``False``. diff --git a/docs/howto/index.txt b/docs/howto/index.txt new file mode 100644 index 0000000000..e8f30888ab --- /dev/null +++ b/docs/howto/index.txt @@ -0,0 +1,33 @@ +.. _howto-index: + +"How-to" guides +=============== + +Here you'll find short answers to "How do I....?" types of questions. These +how-to guides don't cover topics in depth -- you'll find that material in the +:ref:`topics-index` and the :ref:`ref-index`. However, these guides will help +you quickly accomplish common tasks. + +.. toctree:: + :maxdepth: 1 + + apache-auth + custom-management-commands + custom-model-fields + custom-template-tags + custom-file-storage + deployment/index + error-reporting + initial-data + legacy-databases + outputting-csv + outputting-pdf + static-files + +.. seealso:: + + The `Django community aggregator`_, where we aggregate content from the + global Django community. Many writers in the aggregator write this sort of + how-to material. + + .. _django community aggregator: http://www.djangoproject.com/community/ \ No newline at end of file diff --git a/docs/howto/initial-data.txt b/docs/howto/initial-data.txt new file mode 100644 index 0000000000..871c5e8fa1 --- /dev/null +++ b/docs/howto/initial-data.txt @@ -0,0 +1,140 @@ +.. _howto-initial-data: + +================================= +Providing initial data for models +================================= + +It's sometimes useful to pre-populate your database with hard-coded data when +you're first setting up an app. There's a couple of ways you can have Django +automatically create this data: you can provide `initial data via fixtures`_, or +you can provide `initial data as SQL`_. + +In general, using a fixture is a cleaner method since it's database-agnostic, +but initial SQL is also quite a bit more flexible. + +.. _initial data as sql: `providing initial sql data`_ +.. _initial data via fixtures: `providing initial data with fixtures`_ + +Providing initial data with fixtures +==================================== + +A fixture is a collection of data that Django knows how to import into a +database. The most straightforward way of creating a fixture if you've already +got some data is to use the :djadmin:`manage.py dumpdata` command. Or, you can +write fixtures by hand; fixtures can be written as XML, YAML, or JSON documents. +The :ref:`serialization documentation <topics-serialization>` has more details +about each of these supported :ref:`serialization formats +<serialization-formats>`. + +As an example, though, here's what a fixture for a simple ``Person`` model might +look like in JSON: + +.. code-block:: js + + [ + { + "model": "myapp.person", + "pk": 1, + "fields": { + "first_name": "John", + "last_name": "Lennon", + } + }, + { + "model": "myapp.person", + "pk": 2, + "fields": { + "first_name": "Paul", + "last_name": "McCartney", + } + }, + ] + +And here's that same fixture as YAML: + +.. code-block:: none + + - model: myapp.person + pk: 1 + fields: + first_name: John + last_name: Lennon + - model: myapp.person + pk: 1 + fields: + first_name: Paul + last_name: McCartney + +You'll store this data in a ``fixtures`` directory inside you app. + +Loading data is easy: just call :djadmin:`manage.py loaddata fixturename +<loaddata>`, where *fixturename* is the name of the fixture file you've created. +Every time you run :djadmin:`loaddata` the data will be read from the fixture +and re-loaded into the database. Note that this means that if you change one of +the rows created by a fixture and the run :djadmin:`loaddata` again you'll wipe +out any changes you've made. + +Automatically loading initial data fixtures +------------------------------------------- + +If you create a fixture named ``initial_data.[xml/yml/json]``, that fixture will +be loaded every time you run :djadmin:`syncdb`. This is extremely convenient, +but be careful: remember that the data will be refreshed *every time* you run +:djadmin:`syncdb`. So don't use ``initial_data`` for data you'll want to edit. + +.. seealso:: + + Fixtures are also used by the :ref:`testing framework + <topics-testing-fixtures>` to help set up a consistent test environment. + +.. _initial-sql: + +Providing initial SQL data +========================== + +Django provides a hook for passing the database arbitrary SQL that's executed +just after the CREATE TABLE statements when you run :djadmin:`syncdb`. You can +use this hook to populate default records, or you could also create SQL +functions, views, triggers, etc. + +The hook is simple: Django just looks for a file called ``sql/<modelname>.sql``, +in your app directory, where ``<modelname>`` is the model's name in lowercase. + +So, if you had a ``Person`` model in an app called ``myapp``, you could add +arbitrary SQL to the file ``sql/person.sql`` inside your ``myapp`` directory. +Here's an example of what the file might contain: + +.. code-block:: sql + + INSERT INTO myapp_person (first_name, last_name) VALUES ('John', 'Lennon'); + INSERT INTO myapp_person (first_name, last_name) VALUES ('Paul', 'McCartney'); + +Each SQL file, if given, is expected to contain valid SQL statements +which will insert the desired data (e.g., properly-formatted +``INSERT`` statements separated by semicolons). + +The SQL files are read by the :djadmin:`sqlcustom`, :djadmin:`sqlreset`, +:djadmin:`sqlall` and :djadmin:`reset` commands in :ref:`manage.py +<ref-django-admin>`. Refer to the :ref:`manage.py documentation +<ref-django-admin>` for more information. + +Note that if you have multiple SQL data files, there's no guarantee of the order +in which they're executed. The only thing you can assume is that, by the time +your custom data files are executed, all the database tables already will have +been created. + +Database-backend-specific SQL data +---------------------------------- + +There's also a hook for backend-specific SQL data. For example, you can have +separate initial-data files for PostgreSQL and MySQL. For each app, Django +looks for a file called ``<appname>/sql/<modelname>.<backend>.sql``, where +``<appname>`` is your app directory, ``<modelname>`` is the model's name in +lowercase and ``<backend>`` is the value of :setting:`DATABASE_ENGINE` in your +settings file (e.g., ``postgresql``, ``mysql``). + +Backend-specific SQL data is executed before non-backend-specific SQL data. For +example, if your app contains the files ``sql/person.sql`` and +``sql/person.postgresql.sql`` and you're installing the app on PostgreSQL, +Django will execute the contents of ``sql/person.postgresql.sql`` first, then +``sql/person.sql``. diff --git a/docs/howto/legacy-databases.txt b/docs/howto/legacy-databases.txt new file mode 100644 index 0000000000..c4eb1d82c7 --- /dev/null +++ b/docs/howto/legacy-databases.txt @@ -0,0 +1,67 @@ +.. _howto-legacy-databases: + +========================================= +Integrating Django with a legacy database +========================================= + +While Django is best suited for developing new applications, it's quite +possible to integrate it into legacy databases. Django includes a couple of +utilities to automate as much of this process as possible. + +This document assumes you know the Django basics, as covered in the +:ref:`tutorial <intro-tutorial01>`. + +Once you've got Django set up, you'll follow this general process to integrate +with an existing database. + +Give Django your database parameters +==================================== + +You'll need to tell Django what your database connection parameters are, and +what the name of the database is. Do that by editing these settings in your +:ref:`settings file <topics-settings>`: + + * :setting:`DATABASE_NAME` + * :setting:`DATABASE_ENGINE` + * :setting:`DATABASE_USER` + * :setting:`DATABASE_PASSWORD` + * :setting:`DATABASE_HOST` + * :setting:`DATABASE_PORT` + +Auto-generate the models +======================== + +.. highlight:: bash + +Django comes with a utility called :djadmin:`inspectdb` that can create models +by introspecting an existing database. You can view the output by running this +command:: + + python manage.py inspectdb + +Save this as a file by using standard Unix output redirection:: + + python manage.py inspectdb > models.py + +This feature is meant as a shortcut, not as definitive model generation. See the +:djadmin:`documentation of inspectdb <inspectdb>` for more information. + +Once you've cleaned up your models, name the file ``models.py`` and put it in +the Python package that holds your app. Then add the app to your +:setting:`INSTALLED_APPS` setting. + +Install the core Django tables +============================== + +Next, run the :djadmin:`syncdb` command to install any extra needed database +records such as admin permissions and content types:: + + python manage.py syncdb + +Test and tweak +============== + +Those are the basic steps -- from here you'll want to tweak the models Django +generated until they work the way you'd like. Try accessing your data via the +Django database API, and try editing objects via Django's admin site, and edit +the models file accordingly. diff --git a/docs/outputting_csv.txt b/docs/howto/outputting-csv.txt similarity index 72% rename from docs/outputting_csv.txt rename to docs/howto/outputting-csv.txt index d6ec3f62a0..5192c51228 100644 --- a/docs/outputting_csv.txt +++ b/docs/howto/outputting-csv.txt @@ -1,12 +1,12 @@ +.. _howto-outputting-csv: + ========================== Outputting CSV with Django ========================== This document explains how to output CSV (Comma Separated Values) dynamically -using Django views. - -To do this, you can either use the `Python CSV library`_ or the Django template -system. +using Django views. To do this, you can either use the `Python CSV library`_ or +the Django template system. .. _Python CSV library: http://www.python.org/doc/current/lib/module-csv.html @@ -14,18 +14,8 @@ Using the Python CSV library ============================ Python comes with a CSV library, ``csv``. The key to using it with Django is -that the ``csv`` module's CSV-creation capability acts on file-like objects, -and Django's ``HttpResponse`` objects are file-like objects. - -.. admonition:: Note - - For more information on ``HttpResponse`` objects, see - `Request and response objects`_. - - For more information on the CSV library, see the `CSV library docs`_. - - .. _Request and response objects: ../request_response/ - .. _CSV library docs: http://www.python.org/doc/current/lib/module-csv.html +that the ``csv`` module's CSV-creation capability acts on file-like objects, and +Django's :class:`~django.http.HttpResponse` objects are file-like objects. Here's an example:: @@ -46,7 +36,7 @@ Here's an example:: The code and comments should be self-explanatory, but a few things deserve a mention: - * The response gets a special mimetype, ``text/csv``. This tells + * The response gets a special MIME type, ``text/csv``. This tells browsers that the document is a CSV file, rather than an HTML file. If you leave this off, browsers will probably interpret the output as HTML, which will result in ugly, scary gobbledygook in the browser window. @@ -56,9 +46,10 @@ mention: whatever you want. It'll be used by browsers in the "Save as..." dialogue, etc. - * Hooking into the CSV-generation API is easy: Just pass ``response`` as - the first argument to ``csv.writer``. The ``csv.writer`` function expects - a file-like object, and ``HttpResponse`` objects fit the bill. + * Hooking into the CSV-generation API is easy: Just pass ``response`` as the + first argument to ``csv.writer``. The ``csv.writer`` function expects a + file-like object, and :class:`~django.http.HttpResponse` objects fit the + bill. * For each row in your CSV file, call ``writer.writerow``, passing it an iterable object such as a list or tuple. @@ -70,12 +61,12 @@ mention: Using the template system ========================= -Alternatively, you can use the `Django template system`_ to generate CSV. This -is lower-level than using the convenient CSV, but the solution is presented -here for completeness. +Alternatively, you can use the :ref:`Django template system <topics-templates>` +to generate CSV. This is lower-level than using the convenient CSV, but the +solution is presented here for completeness. The idea here is to pass a list of items to your template, and have the -template output the commas in a ``{% for %}`` loop. +template output the commas in a :ttag:`for` loop. Here's an example, which generates the same CSV file as above:: @@ -105,15 +96,21 @@ The only difference between this example and the previous example is that this one uses template loading instead of the CSV module. The rest of the code -- such as the ``mimetype='text/csv'`` -- is the same. -Then, create the template ``my_template_name.txt``, with this template code:: +Then, create the template ``my_template_name.txt``, with this template code: + +.. code-block:: html+django {% for row in data %}"{{ row.0|addslashes }}", "{{ row.1|addslashes }}", "{{ row.2|addslashes }}", "{{ row.3|addslashes }}", "{{ row.4|addslashes }}" {% endfor %} This template is quite basic. It just iterates over the given data and displays -a line of CSV for each row. It uses the `addslashes template filter`_ to ensure -there aren't any problems with quotes. If you can be certain your data doesn't -have single or double quotes in it, you can remove the ``addslashes`` filters. +a line of CSV for each row. It uses the :tfilter:`addslashes` template filter to +ensure there aren't any problems with quotes. -.. _Django template system: ../templates/ -.. _addslashes template filter: ../templates/#addslashes +Other text-based formats +======================== + +Notice that there isn't very much specific to CSV here -- just the specific +output format. You can use either of these techniques to output any text-based +format you can dream of. You can also use a similar technique to generate +arbitrary binary data; see :ref:`howto-outputting-pdf` for an example. diff --git a/docs/outputting_pdf.txt b/docs/howto/outputting-pdf.txt similarity index 85% rename from docs/outputting_pdf.txt rename to docs/howto/outputting-pdf.txt index dd8a262812..13e07f8202 100644 --- a/docs/outputting_pdf.txt +++ b/docs/howto/outputting-pdf.txt @@ -1,3 +1,5 @@ +.. _howto-outputting-pdf: + =========================== Outputting PDFs with Django =========================== @@ -35,15 +37,8 @@ Write your view =============== The key to generating PDFs dynamically with Django is that the ReportLab API -acts on file-like objects, and Django's ``HttpResponse`` objects are file-like -objects. - -.. admonition:: Note - - For more information on ``HttpResponse`` objects, see - `Request and response objects`_. - - .. _Request and response objects: ../request_response/ +acts on file-like objects, and Django's :class:`~django.http.HttpResponse` +objects are file-like objects. Here's a "Hello World" example:: @@ -70,7 +65,7 @@ Here's a "Hello World" example:: The code and comments should be self-explanatory, but a few things deserve a mention: - * The response gets a special mimetype, ``application/pdf``. This tells + * The response gets a special MIME type, ``application/pdf``. This tells browsers that the document is a PDF file, rather than an HTML file. If you leave this off, browsers will probably interpret the output as HTML, which would result in ugly, scary gobbledygook in the browser window. @@ -91,7 +86,8 @@ mention: * Hooking into the ReportLab API is easy: Just pass ``response`` as the first argument to ``canvas.Canvas``. The ``Canvas`` class expects a - file-like object, and ``HttpResponse`` objects fit the bill. + file-like object, and :class:`~django.http.HttpResponse` objects fit the + bill. * Note that all subsequent PDF-generation methods are called on the PDF object (in this case, ``p``) -- not on ``response``. @@ -103,10 +99,9 @@ Complex PDFs ============ If you're creating a complex PDF document with ReportLab, consider using the -cStringIO_ library as a temporary holding place for your PDF file. The -cStringIO library provides a file-like object interface that is particularly -efficient. Here's the above "Hello World" example rewritten to use -``cStringIO``:: +cStringIO_ library as a temporary holding place for your PDF file. The cStringIO +library provides a file-like object interface that is particularly efficient. +Here's the above "Hello World" example rewritten to use ``cStringIO``:: from cStringIO import StringIO from reportlab.pdfgen import canvas @@ -144,7 +139,7 @@ Further resources * PDFlib_ is another PDF-generation library that has Python bindings. To use it with Django, just use the same concepts explained in this article. * `Pisa HTML2PDF`_ is yet another PDF-generation library. Pisa ships with - an example of how to integrate Pisa with Django. + an example of how to integrate Pisa with Django. * HTMLdoc_ is a command-line script that can convert HTML to PDF. It doesn't have a Python interface, but you can escape out to the shell using ``system`` or ``popen`` and retrieve the output in Python. @@ -154,3 +149,12 @@ Further resources .. _`Pisa HTML2PDF`: http://www.htmltopdf.org/ .. _HTMLdoc: http://www.htmldoc.org/ .. _forge_fdf in Python: http://www.accesspdf.com/article.php/20050421092951834 + +Other formats +============= + +Notice that there isn't a lot in these examples that's PDF-specific -- just the +bits using ``reportlab``. You can use a similar technique to generate any +arbitrary format that you can find a Python library for. Also see +:ref:`howto-outputting-csv` for another example and some techniques you can use +when generated text-based formats. diff --git a/docs/static_files.txt b/docs/howto/static-files.txt similarity index 72% rename from docs/static_files.txt rename to docs/howto/static-files.txt index 846c3eb56b..2f4e8fc8f3 100644 --- a/docs/static_files.txt +++ b/docs/howto/static-files.txt @@ -1,7 +1,12 @@ +.. _howto-static-files: + ========================= How to serve static files ========================= +.. module:: django.views.static + :synopsis: Serving of static files during development. + Django itself doesn't serve static (media) files, such as images, style sheets, or video. It leaves that job to whichever Web server you choose. @@ -9,8 +14,8 @@ The reasoning here is that standard Web servers, such as Apache_ and lighttpd_, are much more fine-tuned at serving static files than a Web application framework. -With that said, Django does support static files **during development**. Use -the view ``django.views.static.serve`` to serve media files. +With that said, Django does support static files **during development**. You can +use the :func:`django.views.static.serve` view to serve media files. .. _Apache: http://httpd.apache.org/ .. _lighttpd: http://www.lighttpd.net/ @@ -22,23 +27,25 @@ Using this method is **inefficient** and **insecure**. Do not use this in a production setting. Use this only for development. For information on serving static files in an Apache production environment, -see the `Django mod_python documentation`_. - -.. _Django mod_python documentation: ../modpython/#serving-media-files +see the :ref:`Django mod_python documentation <serving-media-files>`. How to do it ============ -Just put this in your URLconf_:: +Here's the formal definition of the :func:`~django.views.static.serve` view: + +.. function:: def serve(request, path, document_root, show_indexes=False): + +To use it, just put this in your :ref:`URLconf <topics-http-urls>`:: (r'^site_media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': '/path/to/media'}), ...where ``site_media`` is the URL where your media will be rooted, and -``/path/to/media`` is the filesystem root for your media. +``/path/to/media`` is the filesystem root for your media. This will call the +:func:`~django.views.static.serve` view, passing in the path from the URLconf +and the (required) ``document_root`` parameter. -You must pass a ``document_root`` parameter to indicate the filesystem root. - -Examples: +Given the above URLconf: * The file ``/path/to/media/foo.jpg`` will be made available at the URL ``/site_media/foo.jpg``. @@ -49,26 +56,27 @@ Examples: * The file ``/path/bar.jpg`` will not be accessible, because it doesn't fall under the document root. -.. _URLconf: ../url_dispatch/ Directory listings ================== -Optionally, you can pass a ``show_indexes`` parameter to the ``static.serve`` -view. This is ``False`` by default. If it's ``True``, Django will display file -listings for directories. +Optionally, you can pass the ``show_indexes`` parameter to the +:func:`~django.views.static.serve` view. This is ``False`` by default. If it's +``True``, Django will display file listings for directories. -Example:: +For example:: (r'^site_media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': '/path/to/media', 'show_indexes': True}), You can customize the index view by creating a template called -``static/directory_index``. That template gets two objects in its context: +``static/directory_index.html``. That template gets two objects in its context: * ``directory`` -- the directory name (a string) * ``file_list`` -- a list of file names (as strings) in the directory -Here's the default ``static/directory_index`` template:: +Here's the default ``static/directory_index`` template: + +.. code-block:: html+django <!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" xml:lang="en" lang="en"> @@ -97,7 +105,7 @@ trick to make sure the static-serving view doesn't slip into a production setting by mistake. Do this by wrapping an ``if DEBUG`` statement around the -``django.views.static.serve`` inclusion. Here's a full example URLconf:: +:func:`django.views.static.serve` inclusion. Here's a full example URLconf:: from django.conf.urls.defaults import * from django.conf import settings @@ -115,11 +123,9 @@ Do this by wrapping an ``if DEBUG`` statement around the ) This code is straightforward. It imports the settings and checks the value of -the ``DEBUG`` setting. If it evaluates to ``True``, then ``site_media`` will be -associated with the ``django.views.static.serve`` view. If not -(``DEBUG == False``), then the view won't be made available. +the :setting:`DEBUG` setting. If it evaluates to ``True``, then ``site_media`` +will be associated with the ``django.views.static.serve`` view. If not, then the +view won't be made available. Of course, the catch here is that you'll have to remember to set ``DEBUG=False`` in your production settings file. But you should be doing that anyway. - -.. _DEBUG setting: ../settings/#debug diff --git a/docs/index.txt b/docs/index.txt index e7e28a930c..7b339001e5 100644 --- a/docs/index.txt +++ b/docs/index.txt @@ -1,134 +1,162 @@ +.. _index: + ==================== -Django Documentation +Django documentation ==================== -The essential documentation -=========================== +.. rubric:: Everything you need to know about Django (and then some). -If you're new to Django, make sure to read the following documentation in -order.. The rest (in the "reference" section below) can be ready in any order as -you need various functionality. +Getting help +============ -.. toctree:: - :maxdepth: 1 - - overview - install - tutorial01 - tutorial02 - tutorial03 - tutorial04 - faq - documentation - +Having trouble? We'd like to help! + +* Try the :ref:`FAQ <faq-index>` -- it's got answers to many common questions. + +* Looking for specific information? Try the :ref:`genindex`, :ref:`modindex` or + the :ref:`detailed table of contents <contents>`. + +* Search for information in the `archives of the django-users mailing list`_, or + `post a question`_ + +* Ask a question in the `#django IRC channel`_, or search the `IRC logs`_ to see + if its been asked before + +* Report bugs with Django in our `ticket tracker`_. + +.. _archives of the django-users mailing list: http://groups.google.com/group/django-users/ +.. _post a question: http://groups.google.com/group/django-users/ +.. _#django IRC channel: irc://irc.freenode.net/django +.. _IRC logs: http://oebfare.com/logger/django/ +.. _ticket tracker: http://code.djangoproject.com/ + +First steps +=========== + +:ref:`Overview <intro-overview>` + See what writing a database-driven application with Django looks like. + +:ref:`Installation <intro-install>` + Get Django installed on your computer. + +Tutorial: Writing your first Django application +=============================================== + +:ref:`Part 1 <intro-tutorial01>` + Get set up, create models, and play with the database API. + +:ref:`Part 2 <intro-tutorial02>` + Explore the automatically-generated admin site. + +:ref:`Part 3 <intro-tutorial03>` + Write the public interface views. + +:ref:`Part 4 <intro-tutorial04>` + Learn how to process forms. + +Using Django +============ + +:ref:`Models <topics-db-index>` + Design a single, definitive source of data about your data. + +:ref:`Handling web requests <topics-http-index>` + Handle web requests, map them to views, and return pages. + +:ref:`Forms <topics-forms-index>` + Build and handle HTML forms. + +:ref:`Templates <topics-templates>` + Develop the visual design of your site. + +And more: +--------- + +:ref:`topics-auth` ... :ref:`topics-cache` ... :ref:`topics-email` ... +:ref:`topics-files` ... :ref:`topics-i18n` ... :ref:`topics-install` ... +:ref:`topics-pagination` ... :ref:`topics-serialization` ... +:ref:`topics-settings` ... :ref:`topics-testing` + +Add-on ("contrib") applications +=============================== + +:ref:`Django's automatic admin site <ref-contrib-admin>` + Get a clean interface to your data with no effort at all. + +:ref:`Form tools <ref-contrib-formtools-index>` + Easily handle complex form workflows. + +:ref:`Syndication feeds <ref-contrib-syndication>` + Generate RSS and Atom feeds of your data. + +:ref:`"Local flavor" <ref-contrib-localflavor>` + Give your site that special local touch. + +And more: +--------- + +:ref:`ref-contrib-contenttypes` ... :ref:`ref-contrib-csrf` ... +:ref:`ref-contrib-databrowse` ... :ref:`ref-contrib-flatpages` ... +:ref:`ref-contrib-humanize` ... :ref:`ref-contrib-redirects` ... +:ref:`ref-contrib-sitemaps` ... :ref:`ref-contrib-sites` ... +:ref:`ref-contrib-webdesign` + +Solving specific problems +========================= + +:ref:`Deployment <howto-deployment-index>` + Release your project to the world. + +:ref:`Importing data from legacy databases <howto-legacy-databases>` + Use Django with an existing database or alongside other web development + toolkits. + +:ref:`Custom template tags <howto-custom-template-tags>` + Add your own extensions to Django's template language. + +:ref:`Generating CSV <howto-outputting-csv>` & :ref:`PDF <howto-outputting-PDF>` + Produce non-HTML content with Django. + +And more: +--------- + +:ref:`Authenticating in Apache <howto-apache-auth>` ... +:ref:`howto-custom-file-storage` ... :ref:`howto-custom-management-commands` ... +:ref:`howto-custom-model-fields` ... :ref:`howto-error-reporting` ... +:ref:`howto-initial-data` ... :ref:`howto-static-files` + Reference ========= -.. toctree:: - :maxdepth: 1 - - django-admin - model-api - db-api - transactions - templates - templates_python - forms - modelforms - files - upload_handling - testing - sessions - cache - settings - url_dispatch - request_response - generic_views - authentication - shortcuts - unicode - pagination - serialization - i18n - middleware - custom_model_fields - databases - -``django.contrib`` add-ons --------------------------- - -.. toctree:: - :maxdepth: 1 - - admin - add_ons - contenttypes - csrf - databrowse - flatpages - form_preview - form_wizard - localflavor - redirects - sites - sitemaps - syndication_feeds - webdesign - -Deployment ----------- - -.. toctree:: - :maxdepth: 1 - - modpython - fastcgi +:ref:`Settings <ref-settings>` + See all of Django's settings and what they do. -Solving specific problems -------------------------- +:ref:`Request & response objects <ref-request-response>` + Understand the classes Django uses to represent HTTP requests and responses. -.. toctree:: - :maxdepth: 1 - - apache_auth - static_files - email - legacy_databases - outputting_pdf - outputting_csv +:ref:`Model API reference <ref-models-index>` + Revel in the gory details of Django's model system. + +:ref:`Form API reference <ref-forms-index>` + Learn the details of forms, fields, and widgets. -Et cetera +And more: --------- -.. toctree:: - :maxdepth: 1 +:ref:`ref-databases` ... :ref:`ref-django-admin` ... :ref:`ref-files-index` ... +:ref:`ref-generic-views` ... :ref:`ref-middleware` ... +:ref:`ref-templates-index` ... :ref:`ref-unicode` + +And all the rest +================ - design_philosophies - contributing - admin_css - api_stability - distributions +:ref:`Internals <internals-index>` + Learn how Django works under the hood, and how you can contribute to the + project. -Release notes -------------- - -.. toctree:: - :maxdepth: 1 - - release_notes_0.96 - release_notes_0.95 - release_notes_1.0_alpha - release_notes_1.0_alpha_2 - -Also see the list of `backwards-incompatible changes`__ for changes made between -releases. - -__ http://code.djangoproject.com/wiki/BackwardsIncompatibleChanges - -Indices and tables -================== - -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` +:ref:`Release notes <releases-index>` + See what is and was new in each release of Django. +:ref:`Miscellany <misc-index>` + Stuff we can't find a more organized place for. Like that drawer in your + kitchen with the scissors, batteries, and duct tape. diff --git a/docs/internals/_images/djangotickets.png b/docs/internals/_images/djangotickets.png new file mode 100644 index 0000000000000000000000000000000000000000..34a2a41852579920166184b48338361438c11274 GIT binary patch literal 52003 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 Bxe@>X literal 0 HcmV?d00001 diff --git a/docs/contributing.txt b/docs/internals/contributing.txt similarity index 97% rename from docs/contributing.txt rename to docs/internals/contributing.txt index d0d56a0e39..b96ed4360c 100644 --- a/docs/contributing.txt +++ b/docs/internals/contributing.txt @@ -1,3 +1,5 @@ +.. _internals-contributing: + ====================== Contributing to Django ====================== @@ -30,6 +32,8 @@ community. The rest of this document describes the details of how our community works and how it handles bugs, mailing lists, and all the other minutiae of Django development. +.. _reporting-bugs: + Reporting bugs ============== @@ -38,7 +42,7 @@ amount of overhead involved in working with any bug tracking system, so your help in keeping our ticket tracker as useful as possible is appreciated. In particular: - * **Do** read the FAQ_ to see if your issue might be a well-known question. + * **Do** read the :ref:`FAQ <faq-index>` to see if your issue might be a well-known question. * **Do** `search the tracker`_ to see if your issue has already been filed. @@ -74,6 +78,8 @@ particular: .. _django-updates: http://groups.google.com/group/django-updates +.. _reporting-security-issues: + Reporting security issues ========================= @@ -231,7 +237,7 @@ ticket is waiting on. Since a picture is worth a thousand words, let's start there: -.. image:: http://media.djangoproject.com/img/doc/djangotickets.png +.. image:: _images/djangotickets.png :height: 451 :width: 590 :alt: Django's ticket workflow @@ -377,6 +383,8 @@ the ticket database: be making a change, don't make the change -- leave a comment with your concerns on the ticket, or post a message to `django-developers`_. +.. _contributing-translations: + Submitting and maintaining translations ======================================= @@ -390,23 +398,22 @@ translated, here's what to do: * Join the `Django i18n mailing list`_ and introduce yourself. * Create translations using the methods described in the - `i18n documentation`_. + :ref:`i18n documentation <topics-i18n>`. * Create a diff of the ``.po`` file against the current Subversion trunk. * Make sure that `` django-admin.py compilemessages -l <lang>`` runs without producing any warnings. * Attach the patch to a ticket in Django's ticket system. .. _Django i18n mailing list: http://groups.google.com/group/django-i18n/ -.. _i18n documentation: ../i18n/ Coding style ============ Please follow these coding standards when writing code for inclusion in Django: - * Unless otherwise specified, follow `PEP 8`_. + * Unless otherwise specified, follow :pep:8. - You could use a tool like `pep8.py`_ to check for some problems in this + You could use a tool like `pep8.py`_ to check for some problems in this area, but remember that PEP 8 is only a guide, so respect the style of the surrounding code as a primary goal. @@ -418,8 +425,8 @@ Please follow these coding standards when writing code for inclusion in Django: * Use ``InitialCaps`` for class names (or for factory functions that return classes). - * Mark all strings for internationalization; see the `i18n documentation`_ - for details. + * Mark all strings for internationalization; see the :ref:`i18n + documentation <topics-i18n>` for details. * In docstrings, use "action words" such as:: @@ -449,11 +456,15 @@ Template style * In Django template code, put one (and only one) space between the curly brackets and the tag contents. - Do this:: + Do this: + + .. code-block:: html+django {{ foo }} - Don't do this:: + Don't do this: + + .. code-block:: html+django {{foo}} @@ -706,15 +717,15 @@ The tests cover: We appreciate any and all contributions to the test suite! The Django tests all use the testing infrastructure that ships with Django for -testing applications. See `Testing Django applications`_ for an explanation of -how to write new tests. - -.. _Testing Django applications: ../testing/ +testing applications. See :ref:`Testing Django applications <topics-testing>` +for an explanation of how to write new tests. Running the unit tests ---------------------- -To run the tests, ``cd`` to the ``tests/`` directory and type:: +To run the tests, ``cd`` to the ``tests/`` directory and type: + +.. code-block:: bash ./runtests.py --settings=path.to.django.settings @@ -727,13 +738,13 @@ needed. A temporary database will be created in memory when running the tests. If you're using another backend: - * Your ``DATABASE_USER`` setting needs to specify an existing user account + * Your :setting:`DATABASE_USER` setting needs to specify an existing user account for the database engine. - * The ``DATABASE_NAME`` setting must be the name of an existing database to + * The :setting:`DATABASE_NAME` setting must be the name of an existing database to which the given user has permission to connect. The unit tests will not touch this database; the test runner creates a new database whose name is - ``DATABASE_NAME`` prefixed with ``test_``, and this test database is + :setting:`DATABASE_NAME` prefixed with ``test_``, and this test database is deleted when the tests are finished. This means your user account needs permission to execute ``CREATE DATABASE``. @@ -766,7 +777,9 @@ To run a subset of the unit tests, append the names of the test modules to the As an example, if Django is not in your ``PYTHONPATH``, you placed ``settings.py`` in the ``tests/`` directory, and you'd like to only run tests -for generic relations and internationalization, type:: +for generic relations and internationalization, type: + +.. code-block:: bash PYTHONPATH=.. ./runtests.py --settings=settings generic_relations i18n @@ -787,6 +800,7 @@ method as above:: ./runtests.py --settings=settings markup + Requesting features =================== @@ -854,7 +868,9 @@ To use a branch, you'll need to do two things: Getting the code from Subversion ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -To get the latest version of a branch's code, check it out using Subversion:: +To get the latest version of a branch's code, check it out using Subversion: + +.. code-block:: bash svn co http://code.djangoproject.com/svn/django/branches/<branch>/ @@ -862,7 +878,9 @@ To get the latest version of a branch's code, check it out using Subversion:: Alternatively, you can automatically convert an existing directory of the Django source code as long as you've checked it out via Subversion. To do the -conversion, execute this command from within your ``django`` directory:: +conversion, execute this command from within your ``django`` directory: + +.. code-block:: bash svn switch http://code.djangoproject.com/svn/django/branches/<branch>/ @@ -1025,12 +1043,10 @@ requests for commit access are potential flame-war starters, and will be ignored .. _community page: http://www.djangoproject.com/community/ .. _ticket tracker: http://code.djangoproject.com/newticket .. _django-developers: http://groups.google.com/group/django-developers -.. _FAQ: http://www.djangoproject.com/documentation/faq/ .. _search the tracker: http://code.djangoproject.com/search .. _django-users: http://groups.google.com/group/django-users .. _`#django`: irc://irc.freenode.net/django .. _list of tickets with patches: http://code.djangoproject.com/query?status=new&status=assigned&status=reopened&has_patch=1&order=priority -.. _PEP 8: http://www.python.org/peps/pep-0008.html .. _pep8.py: http://svn.browsershots.org/trunk/devtools/pep8/pep8.py .. _i18n branch: http://code.djangoproject.com/browser/django/branches/i18n .. _`tags/releases`: http://code.djangoproject.com/browser/django/tags/releases diff --git a/docs/internals/documentation.txt b/docs/internals/documentation.txt new file mode 100644 index 0000000000..ebd62b9a6c --- /dev/null +++ b/docs/internals/documentation.txt @@ -0,0 +1,204 @@ +.. _internals-documentation: + +How the Django documentation works +================================== + +\... and how to contribute. + +Django's documentation uses the Sphinx__ documentation system, which in turn is +based on docutils__. The basic idea is that lightly-formatted plain-text +documentation is transformed into HTML, PDF, and any other output format. + +__ http://sphinx.pocoo.org/ +__ http://docutils.sf.net/ + +To actually build the documentation locally, you'll currently need to install +Sphinx -- ``easy_install Sphinx`` should do the trick. + +Then, building the html is easy; just ``make html`` from the ``docs`` directory. + +To get started contributing, you'll want to read the `ReStructuredText +Primer`__. After that, you'll want to read about the `Sphinx-specific markup`__ +that's used to manage metadata, indexing, and cross-references. + +__ http://sphinx.pocoo.org/rest.html +__ http://sphinx.pocoo.org/markup/ + +The main thing to keep in mind as you write and edit docs is that the more +semantic markup you can add the better. So:: + + Add ``django.contrib.auth`` to your ``INSTALLED_APPS``... + +Isn't nearly as helpful as:: + + Add :mod:`django.contrib.auth` to your :setting:`INSTALLED_APPS`... + +This is because Sphinx will generate proper links for the later, which greatly +helps readers. There's basically no limit to the amount of useful markup you can +add. + +Django-specific markup +---------------------- + +Besides the `Sphinx built-in markup`__, Django's docs defines some extra description units: + +__ http://sphinx.pocoo.org/markup/desc.html + + * Settings:: + + .. setting:: INSTALLED_APPS + + To link to a setting, use ``:setting:`INSTALLED_APPS```. + + * Template tags:: + + .. templatetag:: regroup + + To link, use ``:ttag:`regroup```. + + * Template filters:: + + .. templatefilter:: linebreaksbr + + To link, use ``:tfilter:`linebreaksbr```. + + * Field lookups (i.e. ``Foo.objects.filter(bar__exact=whatever)``):: + + .. fieldlookup:: exact + + To link, use ``:lookup:`exact```. + + * ``django-admin`` commands:: + + .. django-admin:: syncdb + + To link, use ``:djadmin:`syncdb```. + + * ``django-admin`` command-line options:: + + .. django-admin-option:: --traceback + + To link, use ``:djadminopt:`--traceback```. + +An example +---------- + +For a quick example of how it all fits together, check this out: + + * First, the ``ref/settings.txt`` document starts out like this:: + + .. _ref-settings: + + Available settings + ================== + + ... + + * Next, if you look at the ``topics/settings.txt`` document, you can see how + a link to ``ref/settings`` works:: + + Available settings + ================== + + For a full list of available settings, see the :ref:`settings reference + <ref-settings>`. + + * Next, notice how the settings (right now just the top few) are annotated:: + + .. setting:: ADMIN_FOR + + ADMIN_FOR + --------- + + Default: ``()`` (Empty tuple) + + Used for admin-site settings modules, this should be a tuple of settings + modules (in the format ``'foo.bar.baz'``) for which this site is an + admin. + + The admin site uses this in its automatically-introspected + documentation of models, views and template tags. + + This marks up the following header as the "canonical" target for the + setting ``ADMIN_FOR`` This means any time I talk about ``ADMIN_FOR``, I + can reference it using ``:setting:`ADMIN_FOR```. + +That's basically how everything fits together. + +TODO +---- + +The work is mostly done, but here's what's left, in rough order of priority. + + * Fix up generic view docs: adapt Chapter 9 of the Django Book (consider + this TODO item my permission and license) into + ``topics/generic-views.txt``; remove the intro material from + ``ref/generic-views.txt`` and just leave the function reference. + + * Change the "Added/changed in development version" callouts to proper + Sphinx ``.. versionadded::`` or ``.. versionchanged::`` directives. + + * Check for and fix malformed links. Do this by running ``make linkcheck`` + and fix all of the 300+ errors/warnings. + + In particular, look at all the relative links; these need to be + changed to proper references. + + * Most of the various ``index.txt`` documents have *very* short or even + non-existent intro text. Each of those documents needs a good short intro + the content below that point. + + * The glossary is very perfunctory. It needs to be filled out. + + * Add more metadata targets: there's lots of places that look like:: + + ``File.close()`` + ~~~~~~~~~~~~~~~~ + + \... these should be:: + + .. method:: File.close() + + That is, use metadata instead of titles. + + * Add more links -- nearly everything that's an inline code literal + right now can probably be turned into a xref. + + See the ``literals_to_xrefs.py`` file in ``_ext`` -- it's a shell script + to help do this work. + + This will probably be a continuing, never-ending project. + + * Add `info field lists`__ where appropriate. + + __ http://sphinx.pocoo.org/markup/desc.html#info-field-lists + + * Add ``.. code-block:: <lang>`` to literal blocks so that they get + highlighted. + +Hints +----- + +Some hints for making things look/read better: + + * Whenever possible, use links. So, use ``:setting:`ADMIN_FOR``` instead of + ````ADMIN_FOR````. + + * Some directives (``.. setting::``, for one) are prefix-style directives; + they go *before* the unit they're describing. These are known as + "crossref" directives. Others (``.. class::``, e.g.) generate their own + markup; these should go inside the section they're describing. These are + called "description units". + + You can tell which are which by looking at in :file:`_ext/djangodocs.py`; + it registers roles as one of the other. + + * When referring to classes/functions/modules, etc., you'll want to use the + fully-qualified name of the target + (``:class:`django.contrib.contenttypes.models.ContentType```). + + Since this doesn't look all that awesome in the output -- it shows the + entire path to the object -- you can prefix the target with a ``~`` + (that's a tilde) to get just the "last bit" of that path. So + ``:class:`~django.contrib.contenttypes.models.ContentType``` will just + display a link with the title "ContentType". diff --git a/docs/internals/index.txt b/docs/internals/index.txt new file mode 100644 index 0000000000..b1647e983f --- /dev/null +++ b/docs/internals/index.txt @@ -0,0 +1,22 @@ +.. _internals-index: + +Django internals +================ + +Documentation for people hacking on Django itself. This is the place to go if +you'd like to help improve Django, learn or learn about how Django works "under +the hood". + +.. warning:: + + Elsewhere in the Django documentation, coverage of a feature is a sort of a + contract: once an API is in the official documentation, we consider it + "stable" and don't change it without a good reason. APIs covered here, + however, are considered "internal-only": we reserve the right to change + these internals if we must. + +.. toctree:: + :maxdepth: 1 + + contributing + documentation diff --git a/docs/intro/_images/admin01.png b/docs/intro/_images/admin01.png new file mode 100644 index 0000000000000000000000000000000000000000..8d746d452c551127743d5e34da4228cc59377785 GIT binary patch literal 120593 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 Seg}8&I&o&J-~Xkpe*Zs&fOH@L literal 0 HcmV?d00001 diff --git a/docs/intro/_images/admin02.png b/docs/intro/_images/admin02.png new file mode 100644 index 0000000000000000000000000000000000000000..0c122bdce71845ade870af95f4ece3c5cc4c9a6f GIT binary patch literal 355419 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%0A7_iTr*fL5Y<4ywo4<ZD>1LW#i=T;mN?;BVqpo0 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	+O7(CnyN|KR%dp{d)mHTPCzR*!E?Kl@P8V7K|9 z;<QPg3?tZqn4AsFx1%SAbD0ifc4sm_4a`qZ<<eM*PmX7b^=5Ko=Cy*2c+srHa_gtD zZu~NqgfE&@uh$AxN7UjieaY_2nP(&O_vWq_&DQjYxtMv@m^U)#qOE^jjJ9Cgnm%Vv zX5NT4Wx9$z61eN8dHs$ZJ9o6c@XQnIBlERl=Ej-Kl8G|=gTaT2A$CI#m1Ypbz{m11 zle&<`%GGa2TQZ+sOc%^pF`vE~<<g@#3DX_HsZ6mUL}<43v$rt5G#;1)EU$eBOTr7L zKE(a(M9DPu5~pzCQx|%hPgoUuIlVbDzq>bc5mx)=Lgq>QqDA@u%wIx5DcXX7Ue0Vb zXOKjDT=bhC+_^(s5Fb8#X!b^C(A-WhnPR#)DZA1ve5h3X5oq{gL!n~6_2kE9IfIqm zCp*#?Bb*e|rR(q<91YjgJKoCdvo2s|_E)2Az(JT|3)ay0<~}gy>{CT7Hoxd)@nFsT z-4fPAKh2fI{btWAB~yCW^Ik`~zWdU-$GzkD_oXj;-aB)5j2waa{c<J^tjpod)o3d` zx{!Gh%c?VHP42J#^2UcsX6r*fTzn7fwujT1D}A=D%=-EV*T3*I`l>Nsm+aiQ$y|pQ z<xJ_?2JVV;Y^%UOi9Rr&`HXF~>53_2iiOPk*Ee3YC%4ljvz#t9T+f`jco8e_^~HbD zd?k8*^D~czqj>y)HQg^@N%~JK<{$k0iP@G%@FN<}c`x<7cJmqUwR7R~4=;sJdwUOi zj}*h_TUuW9T9(kv11AqyKW$F}b9W|v@cPd(7vWjS`032xSZ2e5*_wHKQ|7OWW=rN5 z7dECpi#k4=$YjRV%`2wv!Ka^iFfd=ghW0SGGgp=~gO#?2ip9)efE|`zWBs9z-y!+# zjt!Sh<%?<a<VCnxx|p7yNnePbyug!k=B>+{9x5Rnj{rqsT|_#<#hr(|i$8ngCmW05 z<KFZI?^<A1E_lP{=K$`&>Ck-VC~`B}h7hy>Y4Y=y^JxB4W}9~vYx|EQk>na+J;Xrz zL6rI3bmqE22Qy~!$xP<4%f@`1&ip(_2h*D~=;hJYOght19jl&rVtrte@4g+Gd!y~I zo8C<NWn@8LCiC(J_*aMjw?0xb->tk2t_`<L?xI=TQ1YKlKfd*$Wt<ey)HiYu^=1kU zW;~tF9JQ%BwruWs?#JWaW^e2#fTtYs4*qmY#jG4`c^L2LTH#zaG{1R-%lo%+asD#| zB^<)BA8iAs<t#F|?an*}Xls6^Ko|<FE#s?x%R~P1GDp?|-m*S{P+T$L`UO;?L*Q%1 zr2f^&2rlu<^Mz%Aa)4?oV+p)5pFdQ@s`_R8Z(to4md&c?ejGjSZS)ama~o)a&jYh6 zdgi(I-M|CQUhuYt=C_V|m)Q<5wbht5?-RBO+rgM%7+{Y1JNncm42e%>mJW+m&zQva zD3ctCFIz<f`nj#<K+Buvc?dx+KOJHyxbEQ<^M7~1J67?$x3Bh<4tRTSn&&nGj^GWA zwX`gf7_^t7{pW6b-niAMZ9jI=q;B5`oWh36+zcXx>!e&*iU7%MYc&g>%o$`Fku2<z z2ObMCVBGeeHd7cCA1>Y?+6;|hCZG1aC$FGkpzkM0zn2h^gLgE>Sj}`pF8e_8ML*eC z!br2+5Ev5`0NOLl03@JoY?9hh^~;>8o|ev|cO-HRjZ9{yOltau|DUJ1bJ9}Duh4gv zczqcyr0@<h$fxisGL$!%dc^mUpb|RP+!J%)T_*o3!oqi&g?v3L`NA`_a_~|ZZ!{^{ z?dRpKDBq0Yr6&nV;x;N{m7enjYM5_O)zLzOsLPl2MJqJ3J`YnPd5=nSBNbYR{mSEw zDqp+uqiWnsSWAjmWFjYYEFcV3iqeNRCQ+=G=Fwe!U(5Hr;z^LN=&N2j0b}xYwAWX5 zX&@W?FV83Cx_d|Mms01ysMd~fzmgbk0{G=x(c5K`r#~&5<e5(^`1+(=+eLrX42;Gr zBK+%n{MYV3E`DO_fBL5R>097^?M?9h^v%DW_lIi$@LBjH@?N`cUVjg~ufGT0*Kkxj zNC(g(qw|r6O4Vs9rfQh+R(@s1Tb{uL#|%$br-()KooK`TYc5ce@mtrd0i3bDeb4<5 zPMPJW)~p?`n13>~X3f99V%~-|VdhhutVK^g*lk{W&kWsv|5{uQ-u&5)`~N+#hbUQo zdJT_i?ZYfOhiksM!@M1w&SDn*BYZEWWfq-@XVJ;1EzH#2F^NVre>3{wz90STF#ku( z(W8HQX>`pm%<eUR{?YyKMvwf()T@6M1m>S~e{|~yFPoF!E0{0V<aq+v7i_}c@ek!> z*P3TP`oW(C=Cxg9+VQW0I~p)B-<9c#ISg}eY)fa}G-m0inGJ&mlXA?|F(XgEsRJUf z;yNS0jk!FAK1@+~-N=+UBcIY4`CFWkUzjsbR%hgxZvAHTg9Ec`-Yu;uF08?8s(t^W z_|{(_g#Y)#nj>?)-z)g0x%9^WVV3UiGta(&X?^*P|6QDT{k_P1qr{Up;ninr#*q;V zYYxx${&At!iP0J-FsV;t5^r$fIKC72B)Lrbksg`Xs}q>lKZrT~&K=>eoz*|Pp;R-g zPk+K$<xrOMc%9VmJS8)HOzNN0Nqw4=dg;AI^Udf7d(FN-I`utxiPxUz|G4ma8%+Pp zg>X&sf5p}G_q*@^-kKI;e)5;gh(h<8@2&9+JYrk%1T{E8Gk%Veh5Ms5ssE*TM^Xjm zw`H=7wkpEEPUP1Y>0Iff%n?jRM(A=^@sOQYCf0{L>v0S4xZVO>KeM5LOy(^>DNOSg z02g*lD=Yp<-U4Kn;ON%$=p{_g#)|X21IXYGV2Pw7atH8Hw589@Ns8uM(f8X-_=7e7 zTs=MbC(EzxVteM-jF!zmoLuv<Y5R}#Wb2;=JlTsA$w^nkxP0+Pv-EQfTCesNykhRz znx4Tt8ndUfydy9d!pw^FQG<Dk0k$!d*yCEV`N17Kchbiv9>jglM}IwcBQu11gaT*$ zw`Jll_Xu#3_Xrm@(8*2lJwgWa%8yJjQ@So3m^!CleJj&uoz$d-nV0VW7scoYe^HqD zH!si!^VWZiGXL^s;R5ce|M2>nk8l3lKMzd!Z`T|!*VmlB`EPI{j=Gb#|MYU<NB<kW z2iL8o3%@#weH($s<Y&i21;FZuGU=;dWS$5r7_PQFR08(7GMvd=IbxeMT>qO}p2iUO zAZ7-+bmkG<DDVye_r=#Y06mb#yn!uR89~>~r*R|yExAu96*7CSZ@ggira|r#(4yBf zr>pk~7-&+_hW(NG=G%W#G*drVv*z)ld6UkzV48aW{eOb_;U9*Ntoh#S_oHy%_hyZr zyi1}t-^0oO{Kow_`FHoP`BOlAQMi~{b3a7gIV66!E1kVGlxYd0cHA7K$Ni1zUtS#e z2=@_~zUlpf`ihZe{Zn$k!235dnYki23L9|0Fu>ae+%EvZqxTD$OSoT{())$th0NRx zZcOy%!Oy&T`N<8Xh9Hgmg`#WMDT9T#cu}#mTsHL!fms54qJB~L%{a%?k&1~HN~DN> z#ernBJIbtn{I<c}awd&C{n@Qirm2@V<7hFYW=D0TeB$vt?+4Nu-VgNRet`D#e&8f@ z`0qrS?`*gg@fILc^q<V&exR6>+Z}Ub^FzHGmUusqiSGy8a}_%c#J@8r&(9;d%Zpfu zW0n(eCgm^sItpAd(fY)LcTDB~<w>2&FWxbgKgVQC7CDvw@<ha5<DW4N+cRlAg8221 zjdV@{qF~<6nZG<~`PBz#ZsPIfIc=>Kc4}TTX_2||9W&K0%|mLZLk(jxJLPJ+O1{ZX z_Tt%DBs0-SX0)qNDSw;}atc?%#u;cJvp~#V@zGhQ)^XCxI?QM(p)9fjDiM_;l$4mG zvWPQ6oxI9|z5o`<T$1zZn8Yls5MpJh5d|f_NYq)dn=o?;p-x40hKmU-%>*rN7u$5z zV6?DYoh;u=8u{Q$ye6%iSy$!hgrCm2nYILg$_>nS!O;1<gh4dQlEr*&Gul~g2)rtB zxMr+gAgYRIUFD#z1f&LnPj$Fj!dsgNR3%!KXyu4VUwdvLy%F|GPi(PZl1a;xXzbpY zm`W%o03KHX$srg4h6NSCzDuaEIAAk&pI9e~L^Gkdq9YLX6hyvJ3-2XZ8Xx&W)g2}$ zz$eJ+G3ez9fVb8r0;1^?on%Z1+eIY<WZ}UqPmJAd^`TaH6>Lmd#P*VgU|y}Pg01mZ zEe3jnNRifXTnwaIixQ5_3pFgLVMJ+=D&p8#?Qagweyv)H#{D&==(*KWVvMyx(C~1A z=<HDBBlKzkN;M3t83YjVn`Igv)+xx_x)6#$nh6ntA*UoNVumO;ye8gVq8W~Ut46NK zcjru(7}m`U)s|88w=|l86;*$pz?I=z?46$B1p+ihV~yGlu&7ZTK&hr1q1Y>(WuQ{1 zJ6K}ngt^03!m|l0PXGz74W^C37AJ{f^Hq-}W(8Y~*lrOQV8>V}L|v=N%gsolLoxFm zOboaSg~l)(y@zI46>=1#^nEok8ok^4=LjRwUUt<CSsB`FYfy!BH2ZG`r1=mVJW|&7 z(U>zy!kQq`2f8L<aW2JuoN0<M%O{}CdZ;DL3QHM4W;pt?G}{8!R00tm39_14ZKBzM z9KQ?Srv#f$y!a^~m4UkkOdGYeAZ@{W`+^lG1YAxd0Ol(qXM{NJgkZ@P2v3YT!QU)* z8vx{x3ZOCcpjz<cK(!O&P7^A^5ToH8Qe9!^(TFdGhYpQTTsc)h9juT_NB{&I=PJYM z7sNS8iRpKiG>b}n#b|fhbjp#&;CO-LCtxEP#pP!5kdd7HM*tGC2#TxNdP3J}y=ntS zUg<4pztKvlz#<z7`!5Cv?~fY`Nu;oCLePmR2b^AD-bDqyHxh{s@OE?(knL!sK~4bd zCdORJ0YT?S0o??k6JuT;AspR;&|x&WeUUDQ4#Ey`<SdNb%bm*Bz1R>cqnZW~C<Lo! z;?k?e-lI~S1Vy=%go+8j7rTk5*8-Xs!`rEY3M@t*LWuLX_;*$!ydY4ZJuC#28PsJ) zCp@``Lo!zw7%HGP>#DUHI*H)7zKyUJ|8D?Xv|!Bjnfg(JryX=$kmNx0OOe8$@4~Sl ztV#D}pt)kb3A1((>*PtGs{?^;6JBl+=b?k16D}Uc3XMR;smbA~ao8x(YK5a$@!y1O zmr*MiZ0e{2w9zIgZWO#ZpuVVCA$V^V0O$+!dtf(W%@rSRKo<yzyowhuqmJ~UV&E;Z zzDn<mq1A#@SH(c&OTesB8$2ae3L&O!J$3P=909P?TI-n}NJF4Shim!^5YmGM0FR3V z76XP{#<60ZagI+#;LR~&ni%f8SV7pbd<5tXF!T`M)B=RABP^L9ZN+?tLj-9HDp~=~ zfPh=vGS4HB5@_8><q%rJafP<PnlkE=Lt+lm(?D9II2dYVB|eJw#+lecth5@i5(emJ zXs{Anp{mMa$zV9tEZz#QBE12l<yl^oL_<wt4v^UuF{sIEvAA=%GYsQO)@4O>(}Iu) zcL@#cBa&OKw#e@|@O5KA<%WYzAD;POaNyHVaTsE=C}e_&3FIX@m$2d_N$Y`Y9vUbB zq72T;U~&K)#0f`(Km-#LOc4YTTL7})lF6^dLqsP#5OP2sMgFoVfSCJ422Lo9ns}&Y z(3I6m4<;TED2-hO2x7Ph?i83p3qNiUoHTf2G<JX!@xmWmLGkjZ=2AT>VI9!%bW}Y^ z3;;b1GNq<{C3qG<iXy4QLF9|rN{F~o$aOUM70_Gpbb@CR9v(?JQDCDi5sVaF4#9WP zVO5BI+)N5~P7ciC--*rin~0#|JFv$V0bJh)ATaR0HGpFPiWT15Ok8m-*4H7Qmjr8^ z0C<{6Wl$3!ESTXw-|7)ya|}xsWe#8*!;z!@MpY%?Yl}AS!$}OK?o$<2v@sCtI3bQ( z^a@nk87rRf1W;(=n)~1t&LA&2fOEJ-P9m(im9Y^(ZPD92an=AAO&PM$m`XqK(GGxZ z%|}r`Y(Yh#KM`L)erHsmz~{`;=_}Xz&VAn3@0&pZx)O3LfYyEi=?WPTt_1oTY=rPy zKrGR}Wo#=@Ek%Ii5_uc+)$yDs3hC9#2&6#$T2evaHi#?%`ziofu*#yVNzk++#t^_P z!csV|#E{>}L4*5XD&fcg^Fko?nBG-Xq@E~RIS?tnMf?(9T*vAvu2+~9*Gt0_(3Ak? z7`mZ{&}xbmATxE<0G6#*GC6p(LXOFzbYxvwW09}mWhGM#a?tC8$n*hj41rYv)i%Tb zdhDq?Z<c^2ty@~?`2zoW54X=IJlk^xkDJDTB((_BgaAwn1kx(x6i8D*d5J|OT-EPc z?M?*a3h?WR-UKkMMAxRQ6ykt+PB1GFy*<FIrXT^!T7caJnZQ~39SD}Sp0X_lSCG9x z)e`+ni+aPJCPmBkfOjQ9vD6Q2vES1O(L5ngIJD{%iYp3?$f)$JP$rlw#uC_T4F+G( zL+x~)kYzD-6=kxF7~Y@<=wa%k9V|nsVu2IAMbr_divkNVCMwy8;VH3@b|p@*#P3-F zc99$RBeco!Z}lPk<Ht`B3LBX#XUy_P0YVpj{P_ojv|b13^$PZ-<DcN0pw}|Cv&Y}Z z_pRf>@rLf>-N%o2e~8nb<E#pGi-*YH8x<gAclRV7Dt7x7U@lGXXU0qgX2>_ii@-K^ z0SZafWhhX`P9Qglgain)iNH$WAUpl8W)uJtNtkBT)j+UjS9b(7CJVYc1HdGkg;HRa ziZ=zEk7!jE6O#&Z0jLsc2>>YcQF73gk}A`kB#KlkQ6rj(%M7|!laADs)eR$+&!92{ zHvy#(Ovq@3!bGd$KVcloU@iHJLLi9P)#3_8s$ETVf?+5Vr0OdYH0oMK0y>TFZq-|L z!tc6AT&HZxktkSXEF|C@v^ZxSVZAuVp~a=bE>=jH0${~StEw|@JlroG`$m6c27Dj* z%n0q~U%7U<>ll8cd7dD~$}s^u0)|NJBEgS<(ODFuU>Av01UwV?M?p9`bYs#nRKb;` zY8I>`0geDWvI;OwoIs)gKnbI~n|Mg*<3=<k(4B(+BwCUnOvQl;@H4=v1#~VPt3L`+ zM2n&**$M1qy$GS23PF~@ZVJd!nHmLQc}!85>Q848215Q(v^tr=PTVO`qts3ROA7FW zZM0ZxR|q97rSBC$Siva{0IAvu_^Eht>{zu=jsf)e;nkBLMyAIv9|7L+vy&z`J8-V| z>WNQHiI_v;3LWlnS>TRDDq;hqvHmb%k3cCJi$Ns7aiIo}7z!{Fz(c?hAp@Yt)KSGD zE*(i8K3YUkLBtDO5@d&u6l+8f0!c_DA(Av<L2;HqIpUPS%hHkL5!MQDl7`YWpetiQ zCC{k^jvRLAO`qlp{!;geH~~{*0-zfW&8mxsOQk~x@yhqpvsfmB=^&O62>y<sJfIE_ zMnKFNfbLctA~unjx=3(`f-Nkgk{e-y5y*(+D<8VcqW%a11X)1fpP&RmL+~Qef+{#V z6abEA@qU0PLUx3WM+EW-XfK3Zty0WkgGhkDl_Fg+j;fsCKx>^E8bXW;15%KPM@lu& z(JZcrfLJAp#g@cD8W*1kR+92*nbt&y{MabUv*rPzNkk?;z#!hO2YL>`CRJAs-NT3+ zCWR<RV1Qhd$c8{oqApI^<fuU7I{W($NBe(+(6B>Y0F!lf15kFX3ts{(<5$H2<8Um6 z0>vYY%@%|Ltpfu9XvEP0Bp9<3n@1cRKzJxsq}~dxmvf7|BRxy;0g*+j(FB4He~YDJ zkJMYzS_Xyok(EF<$Oj?+V!&K2R4#-;f{hcy6vHSQR6VVYafcMCs6J<aFd0D|I_Y4j zqcwuv^TmA;CB9ft;T;8(RV}FE5(Uxt<>>w$(2|_q3nvfcm<$30tikrV=QViF3nbh< zf+ve%TkV2cBjAh>Fzx~MB1nu|MA#cXijGrMn!?A3sq@>Vygleh2*S>E)C(3&uwRNh z3)_<&s5c6mQ_LNaYlNBwtRu!Pvho9~P4=*o069hF@w?=pY7YAb>>fV~rlUYbpb@Pm z`r11dA$pY%btp!SKEXZb$TCQSDt?ZV7y|lDv>^UyLIf#r3};b$Gd0S`BHYAyjhhkZ zoEntq5V)ZR0kFGxButJ1NEHe0tI~Ft17GPrszsC$CkBj_BF})q!ij}r0YnCz7~y04 zv^=rT2wp6NU`1;=oEp(!iU<QNZSNBCXM~g$^?))IktTvd!o~>fO73eTHjN4d&qib$ zHnTScNF1SH3YCkbJZu9V415())wGXTIsAofO#&vvIc3q%P*86r&=JxW$r-o>U<aTb zq&N=Z;{=ok3>r1_Of3@BT1cyB+u+V#8Xm_MFNFjrrI4&90eS%!MNAc;P!<<Pq!-aq zKtxp>*vnz9YH(&H!nF2;AjSrCS0gcHz;ZeED!58OTm_Y=wNj!8FGXQleK8I!tihZ$ z3&sq>6+Ra1X%MKIMWg|NMhIFhK+U|bt_g-sxlym&<vj)#J1|?V8VyPe15<2Wo$}R- z2}<qYW5lA-55c@47*&9oN(axLy`VvqY8oH}B#8hcVzCrEB;cgT;)VooB!DM@E)jQR z1mP6!s$dUr6j>ETMJQ4ep-RLng+z9doR}_RsUj2!mWs$O0-IKmQ`m)Efm0D^fmjl1 z$Pxn30@0<1+|g9R!gxf`m70OGP(2U}P)b7qrvgV{y)nd=Q9?zGs^f_mLYswB#0e&9 z73t&;HAI$CoTySRi43FHEL5bljs?4k^8$d2eiFqd<_c9wLZTS282c7TbmUY+Wp=N$ znz5^CtD5x_@f;vgyKdrdE3I9<QI%UO;cqJ)_05V(9&2sP%y{rKygj8&Tuu^SvPLVW zc`%(xZzx9T%#xB|;pO_|gH<RKmUmhxQ+Z|)P$s*uvnpf^zx{DL{rLF{`%C7FPXesD zx$%}L<FcZiJJw@OX=`-}=3-{a0hyA~z9>_VMT2PzWUAT)0Mmu^CM<aWdbGQ>cm=C} z`ed2p0DgRen5B-Y0>LcZ1|EtlB-4Uf(iM`^)0YIZ1cXER!mP2FrK;U{u=1U9CbI!Q z`a)FF<fhDy&%;e=E@RY1jjH52mgk$DbzBIhxFkRhfJ@2%kOZ(%2Jj@TU>vcyq_p6Y zHVtQiSdb-*q2Urn!6jv$eWpZQk}hGa`dTsHp4phmYzAZn>zWP&2XP^jEpnCNrgUeq zT|B*RlIwRwSYf!O3NqT@Ru~G%2n!9d!tf*)-(iIz&_q~|wgrm{GsGCpXRtC87^6&q zYZ6B?1a-I-hE+p+KwXA1nFD~%zz#&=0u~@;u$t>EKoomiG!pBhoei+#aYYLK_3Vu_ zkwUr(u!<DoQb$1w$tplB{7VBVG)$xrmIMk?NH`j<Wp=zNNTF(f7%iE*KT2=Ig5wg* zz|XB@Hbntf=fSuu`)xcL0Tg=>>+|ja@>m3q?Ckoyz^|^)13aLRCXVNt#qn_6BK}2d zEsp1o{P@i)JI5|;$s7lAt!VaV-oN2LocZO&{tpdS&!sctYKx+6u=>oQZLTh71_-k$ zrUi5(tLH}ikvq{gi<#mDpl#ghxneo<=A}E)HgUtCgC#CUnY+`!@Uc#@2)I(_DKq<G zlu7j(EQm{V#J%CcJ5VuinBH`C6<nzX74wduV%#dYO_|4E+)&gdaprpNp`O}Ra5c?R zF?GShJm4rP{MSLC@Ro}F#!@)VQ9E$lvHtB}$@;gYJfSRDv*(~J7;lV)vQ)i{m$bFQ zI$ihnYbq=A(-4GFtj4gKv9{WLwIgMfwzjlN`)kMAhEZ8XMm&SAO4C(ZShOZfxcF_? zX6eE&LM0S@!6jlLR%<1&DS*OZ9(3In|H+(yGA!g`b-Xf67om|mz~V4jnkGgppoCgv zc^XQfn5)l%JeSa^Ibc;&xy(&g*%9%;MQ|1l;g+_EC|yuSg9#?lC23r9rt9n6Dl}bz zN58qcO@I}&#K1F$+i(b#yKBRO*f_)q|DB$$^AkhKuIuIq*ia}6T`Sv_f-r^)0a-+q zAOR82XarWj#cjsrC0vZcH9%Oxf(0vFz~hd%+KNkYbaf6Ftng2kJ#oQG8P(M_UAp=R zYnr%FCjmLS2#718d|3*El}Z(^dD7J|T+XH|jaa;@W&w;C5wF(4FL;PrB~Xj(x-_>s zhyw3Iz5Ky0d_pO(i=|kjc5+pbtYZ_Ria6(kxY@1+0xMTL>Czo~q09ZEc(IOCNpbv5 z3SIgp7PClyo<i-=AK%abMp!teEV`Ji`m+~^hpe-LjrMmss9t-lTZZ=QmTmq2uP)3j zXA`+FYjRPxF_+Eqk7q&lu3R>UKlcehR?aqPVVJEaAt)p8)v?e=eFd8@MNJ~e$}-s$ zsH2=gbtGiT98LpO2<8e!Q19K`QLR-?f#eV!S?E_Cw8dAoJPcrO1p<>4(F}h1P%JqE z=nX*w8&JY;@<iY%TQAC4IYLb&Rx0Icicwio!zi(a_5`ZDB!XP{7&Hk*1+p2#5W2Cq zXY@YA#z2)&CQj!>oSH?G>Znj-<UH3s<tZ7x(m;zkx<kzfX+=C$`xplMr{dIf8bve0 zTr)M{4=$F;9Et8MiD@B2O;QN9?L$+MA<{Nsc7+~+o9b!05$7SN2sQ>X1^KLifMpxG zl@d{EW>ZlM0|px9ku1>0WnO73x$J2GAtW*ojFL52#Dv)<D;TGe2gSIl)Zcnx4ylgr zX!b6Ne@+Yct6+^t;+HlO9jlSf=ztqkHYe$6MUspH*tEJYI$acSj|z=N!%X%hu|@U! z)?kfgBCENkCV&*Qxj9ItHyW4(VkX&ULu`|w+D0T3hjY@H467!k$^ADJNB#T~;bIGq zq!cc#h)b9(WQ-LslR`}y<94?BvpJJnxHC7v9a-Nb%SsxTK%&T2TojimKr=5=naG+Y zXtjzGLa5$rCQD1QwV8jcX2vpenM&%c%V3^YV1<O7(O{67e6|bPw1_x%*pP?>8(B3! z4rK(J;zXs1G`vEiL-<1DI2M(&$aQTu2^V`W$&{Rq&{l0D?G+#sO6}dGa9%JA^qAwA z8>MwLSb$c9%9k+HVb?{;U}G)01)FGS0kWh+GEg*@;WP0_OfFSLgPG`b=PMc)n-VOH zt<Vuuvz9FY*>toBb#$%*yKED3IA9fv)o*t!CPS+Fj7D(kbXb9vkj8KY7^uk<=RG~r zB70$?U?zaJ7L;@JwHaj-xFR8<3TBUCR;ZVZ12y{C8d(H`^EL)Wl%Z2Xwhrw&wk4!b zGG0)j<F<8H&a6$8r{m9pSf}}$&}4y3>Y}o|rVLMT#xCbG@>(erVp0IB9Sc)A5HB^? z-QXj+PHGLdb`aPkS3%Hg6VvP!Dn2Hqar4>(>0_0U?a5Y%!=?G8Bf}j7u$m(2nPscR zJT4Dm2tzN|I@c2zBqQT5&E^LU>mn72i!hbN_!D(vxNvD6X>PH#K}bq`*)dv&iP{dy zj#xWX#(e-x+9Nn%NLP_AMZMa@5xS5nl&0o2SGtF5Ahl34mwhO{c4#Q+(vlmA;#rcK zLW?Cyb22DuVuJy(BJ(`#u|p4|<@%AT3K8Z>F-*oL4Tkn#H_$}x!WE}aq}EZdUWrAI zlrqlRBcUs92sbKmM4}CnQhG6E)Q~Y~DOMogg*}j=S+8~|psi}RGV$2Dq%Fb@t@@?? z?8K0=t$Z0m+{nbJ#M3B7*3$FBZd*^a=~aTq+6uhROOw*|nl_?;%Hc*?<~Oe{c48@3 z!9&gQF#A;sz@OcTRCl@KV5=F-?4oLW&64Y2Jbj2Gu%zP}9YtKLI>-qYRmmYF7Nof$ z#7wm)hdB~0k$BS<rmDTt!Y|Rw$*>H8Vs}jj1X*7^mELJDa2%N_P}_;I(I~U^d1f85 zV*+EPo3^eqLq=7-EK82StSHCam&j?0h$K$dtKFA#QjWLGWn_maq&u2IWaEg$sgi3n z*77)D09mZv!20bbwRAxzq?9GoR#Ky*N-MhP;1t6vgmCnLJk1`lbIJB<kTA`dA9g0h zECwydVcSY}ltCCtWSce~M48u2E|PPEZKe^R#mCvN!vH6l90EkY-1~5>kPa?wVlVXt zH$JPi+8#D5^cF}>V^mqm5UDXxUlK_$1XZ>tX~S!0(0QcJ)EQ;XYEmrY*iEk>hqr+7 z;I8+K@JXF?{Yo2(!PPFpX@czuyq9DlQwg!8|E!}T7j4I-4bD4Q)@q`lwd2;Zt&oFj zagHW(w^gv*#G=V{rc#|)Q5n<Qubn7>h1sGpq-Bdb<5TPCz8mzU!6lXKkS3kq4GL&K zURA5HgEkp6s}7c65iamd0@OHKc6{pP`LbBXB&jNs#BldnlJRV5no!$wbP~ogjj(=G zx8yj7ZVnJOfZ8NdiwX`fl5(((vWp<B-lj0Ob<}4wxce`6^;7Y*ofaTLKvU-Bo=)(K zuFx2FE3BrM`9wgw11OZL+0vsx2O%Y;tumQowPu$@L0q{b>VdobGMuWF?(mGE;?z}` zbP&@aM5pM^1RCm6aRoiVpI)Uo&lCSd6lowzZVvPY#l?^D)@WH8h6bb>PfcW+BU#If zYPAvRbV(Bcswhb7=nKbdewacWwm4;gRCY+$DKRDcri-9NR5;YL;LB5|n&H^V2Lqp} za75CH32oO=N_(oNsS8p($zh|=GnZ9v<a5K0y<Uo~(sXua;5s|XB-m(Qy2P<h2UQ`S z7s(vcR58CfJ+@C&YzD|2P@4<xNS_HHi}sU2rgW|+GR$_=aQCQj3)#^wE7?LvnEsk| z1`~PBCLOWB!wT(M@hC(?MZG3`pi^IXMyFt!4$eAQOCn0F*~XNusj2$Z+$FI=j~QUA z+g(G8E;a0v3dgFW2{VnCbTLS|H5!Z>l8?FL#vUdc$9oBd$*t7Pkv7pd$mn4M=IAJ` z+OsK&!+`p7#|@i~#je6$gqZO(bQK$30t9BJcx}RqMba;XCXze;W-=%fWoq_m8-Sg1 zm(^(v7vmt0{e+3C?BpLu)q7;pN@lR7I6+}B?V!Q}4V`MMxGVaPkGEsq&$eSVz0r|} zX@O8uW*H{Q0|bdS$!cc8dfAO2Lz9-foW1aJ2BI0~?h7^9*l2RS1!=`~ZFt3t3i=Em z%(#Tnp--))U^uK3>#UAwYBrxhDUTRIEqb%fVs$&d$$|vA8c8#Wv26C{xIN_7kdce~ zLEJa)xMkE!JhiF~GSSi51jn2>?rIlg(0EP@>AjfgE-VbW)uE%6;e44NnxRD;RJ1kh zY+MH`L@S<ixyud8?4&QueslN7AAa!RhlBfGU`{;$(U6FNDQsvN0OJ16hr+zXQZQ@3 zs?pA759Q}J+vvDnP@jAK%uyM|aJ_#0>=E`vZD_f6z(xDewZh<#Kw5#LhfJ?wg>6Q- zu44zg0Iv${#vC5mDD3<);Q+a&FR9!!ah*aK$=>+R!}X<Rb(D6mu*U1;fD)E8%T$GC z4(+$&u6=x|jcD^J?wWScbWdl*Q#T8>PyQ>}uQN?)fYq!!L{%;b5W(S-y=nm)1EBq% zfry)4ZvMmxgo2k@wv2|vWqzEZ1v_C8J-h_5<MD3F_ETEItfNw9yp@CO8sk6ySd||_ zS!;ft1~Xmt&5J%L*Xx;1df6T{do=}i<fqg{P4ECYdnkW_Im<4bO&!c%puu*il-WFE z!m#owJ*p)<Zh8(r9n0<0PR+iMkDj27oV;WxxA+idOEOq%>~v<#_{pH9W7!HC2)^3k z(v9|d!ByD>HQ9DbHv-Zxjw0@DOrUpS6vxzKM|Su7Ojw@lpbO<V*2Lzw&dvEaOmE28 zzjRQt8r=}W$4QKtKE==u#WHz70!QN4T<+Fc3fLHWoo8Zjpx2bvK1X>>2Ax>f+&!_6 zyNjJ2gvqT#Q#?XBBiJFoVw-^xJ)6JYb^L=XQGVq>F1u~|I$048x+OC+5v8p?14X_( zLhQ)TNQ*3H>-OeP%b3Ae8+-F-sF*D9bXWemKHlS%@*bA&o<~VG3o>_U4tRMd533PP zH_S^9)>kofjd6^JLQV{ISVc7K<jcr|2&S|~A|4FwP{4kww=TS@YwJmyQKcPtInj08 z$i14Iavk5<94<#`5T)EDrmM^Ff$5`<9pEPp=#=(E>alHMuP^Sl7&3K|OW7pjrVXHD znR~Wt#}vj&Nf;CDA9g&T(LBTqBaW&%5@qkRF^+3^u8z@agbu7WT6(CxSg#@~@oavK z?7zf+m)xpy7Qjl1qK=3hR~Qy~L-WE5**yz0aTaSgl7W+Cn&N1az4;lA7>vG7CQyJg z4(@z{trr#MIOD`lkhjU1sJVx=`QrMQyUk!$72GviyQFQ|_+4WBbVg0m7m669tzr#@ zZ4els<5sgYETxM@>Wkj(^VY?7PP!G?H_qA~$Oe>^`1nBMs?%)yXoXI4$oFNc?%Gfq zyC5&iRfv2Sw2`$@r6pa`FwV3dIy9pgL3i6`U&Lx+xv2=p9L*!0X=;M12=)RuI7(7V zp5XDx+5EX6`}>C$@~3j!#;@eEKR!R5Uzlo#LAz&$e>sgG=A&(I+{`ab3{HH3<CiW* z`Q(+?eNGcwL7boLh_e4}Zs(2s!mW=vp6r?)-a9*&|0vs!1u{M0*fsNEHn(ef=$+|> z{Qn4Xx!uzrqIhU-Zegx1*AEdlCt6WB+?~(wfc}O2WP3K(KeLd(HPM;{F(S21w7!O+ z4B~0ls6@rKkekier%5*b<@x|#v=)04d!!xTvC|tuHllQOI;nwX+&O#*v5sX79{Jf0 z+SM3l9~q+0Az330rFYYs3`~qrGT?>t+f_W}aMVMdfuD-dxUo?yK=kg__wbF8tv&IU zrl^i1_My9d5GAba?Mzr5f^}S?dGXAsnU&hTnT^_SF|mIA?H#%7mJ6+n01G+6vqKs) zmyeI)o7U=6Bc0swvc+_J`&`^p8H%#rGvJ6b4Vui{ty!ZXX5bF$ll(adN5yphTy`6? z<;X&Q0*kj^#r(z3H+_)JzJV1~x1xO0%;xOt_+7}GSQ531W^&$nBv0bIU(M!rAh#w! zi75~G5;ueVieKik?U0)7sO0a<pUUFod@eTxj_G`7_B5A>rC!Z-1o`?MM@39(NA?Vs zmhBL(oYhsgE1TV4!M_xS0EtesM3HfnMwX^S;Np1@J%hhCfP87nrr?B)4OE>huMiOw z!;EvyC5bET5WiMogXru*p2oT>tmZ+8@qc^JliL!U!z)MHn9aTt?sOLz87pLHW(I4@ zHsrd(9{Q4eC2X8PF_>h!gY->iTd|C`uphbXvYR(*a%1i;UD`cb%}$L61dIDfvt0KQ z;*i{de{R^Ya|Z}8rnqYv$6JnG6?+i_H9xS4>7ydp3t^WIUz}4nWKTpWV`@P(dRnXL zVx+2%u9Q}vQZc3VI{r_YR`e_TN&Z%D+x%oM`({@*yKN?ajML)$+^*cE{H0v(Mt){{ zuJtO@?nZucd-i#Ji@rb1W#8(`WnY>l!`1xlXR|wRf-2X6q3{>k+xh(USDv5EcV~0R zsVqt%F?;Fj`O8c)WZcz!55`3pa40{sIm-TH5Zr#{h1{DExeX$7ET^yJjx{rLRnWp^ zI?1U`Je={#Z9Md&he?Vs5WJM?AfnOL-mVRbfJ=NpK!GkPG=ivs1$ykJ(J~s^YYdx? zT{n_9$*?wmHTQlvpL;oYhpkora)9=Y=V|)17F7BIO|LqsgTV>hY`oA{w+G53iI%g? zt>*Nr`<D&+6^9#M!1%|8V}8;j<iv}ni^er#pUoZL!U>?!F$GpnjD^|No1@_E+^a)d zTg{KNxSi&+IA$0n*g!G$I5)5%(ebxg+(u^bN-dM_!+fZb%H4+0ds_{9hE&=wy$^7c z1$64IFpRd+L(S=WBpbbJI*Y+)8@5XJAKXUX<T@7e7{&G@1zPj@4rs&#X!DQr`8LRY zBcFfOdM>w9WZ0HpXp6GnB^9`)HfJ$NjUzZBjDr{R14CWMZ!>!&(Jtj@aAm}&LlPI6 zII~$@yANC}h8U#n!a3YM=G&s&H(sX*q%p@=OyblAUc2Z}(cM64d&JWVdC|bjf~Je! z4(o-ldIO6Kg#=!s!Vyv1Lq<Z*r(DP+sWF|B0+*Dx<Sfko!KY#FbQnC>9pnbX@Iv<G zU`MVu43TWTL0H<A-Cq1C2nWW)rPk~~7+mnP_iZhN;XH@#a4zh5*}pnhe7Sh{x$G7x z-tJ$X3>RM1X);?kyE(d^?Kh^p3p0wy{L`JSm7Uqcg<Na-v@wGdrr4SVGU8&kwTz$Z z_#~G%CjTP-Ywi^}YAv-|-qw;-2N-_YA9C4FBsBM}1{L2vo7*Z(+shwPO7;{Mf#-AC zAxI9hf7n|3)R=QhlFi}gOpxpN?tHd%Bs&zeW+#Wmz})uIXRsJd<ubyDD|PS=G(g1( zq+YYqP;?5iar37It-;RR;lgGbz8TkOX$1BJxzwWH<UYq_pJ|%S9=jUm@0Ag8404$( z+vXRxqeYRk$mD!0W>?S8=MQlpg~sHuYhnHy$kX}!b|w{btt0;#YCp+;7G+mYFymxM z>sS~=7IZXI3-UCV-5V_==enZoy&d^k=4XfAaAYa5Q7quCK@*u(?>*1w^M}z3I6LHX z40I~J1JRjSBp1|bx6~OLN6eC2F$XQ+)y|;93MW0hL$P-T<fc?7QFEJ@F|e@`^qe2^ z1j8FY95d_~DHZVp2abpgHOBfq;g4s|2k%_J_HNkrYH$F<<S)Yu+uz;#%kWh0O7QHf zLHOQyaP8e-0QIkg2RI6TE&KB5>!-uBN5kTN=5P?sfBtg#;58J#aV9*wJq#yj!U0;s z#^(ri4RE#(a@WnX@0p9+-`&z0?c|kmhlzGgnCrXDz<Xxjj_AM+V-Ac(oA;X2JGKtx z`pu8qF!XLWJKi%NY`$imMfHAE)4%&VLJT*#+{K6w60^D1C^|6q|8Vza!Esz?x?n9> zxoGz;``&ind#8J*mzjI#Z6Z2iNV)Ah?RlAqj=0_SyFCv#ZjAj@1x>`r?w&4?ZBZl& zpu`Q(W>IR%vPh9yNLdm|5FoK{g#y4`6aiu(P*`ipJZHY||If)PNba6_nTMIE%F4`h z{_}6=KTBqwFYA9Xt<UxBLovta4cqtJ=ap9Swr8QuQ8c0<dj_m8+QV<yH?v1G_-#L$ z!I-;lKR9SVhK`VP%m%-0|F!LX?tTfPFz%cR_i0}XgI-r%pwfZFJ+7R26o;*M%zm*c zZ2herIij-&%w=%ze3an?vVXlI6Gn7zHwvpaF3UiD8cB>}AG{CoiW9vm`a1kO_3F7G z^NrTbjn#sXV_F~?@1hq(8O&e5D!iq;bzv;BPVdz276X0el{==e3)jl7pGC1Sv-?It zIWkfi#@}Ms?6^bhd2)va%;XgXue&&$>wHKbJR*Y~Axtc}SQ8^9)}s3fyzJB~1$G7u zH!|YX8s&J%QPN#0ixeH=_1OW3Iz}<R47n(>$>7gggTCOU(pc%kv2cDq>_*Iv2m3)d z9PG=q2WQ&DmoR7C*IN2?Jj5Ssc2mmZt!MA9gtu>npSGR}KWPszZ_0*WyWNW9<?v2> zIG;JoStdUSS=>arvpI&jTn8f3?l-M_4`X_G-XQNKnd4PH&Dq68+udQ`Y&~!GNtAb9 zyJwH1v&*!bV`B(Rls#<UWGOM?7G_C_Ta|sd)z*Q|_uRJ-!d+SfXQp)`#KlC|s(el6 zKR{yZKJ#g&^E%m@U>Mq%U<kc(c-(B<`lJ-ecrB9|g1iq5=5DBho410@BZuv$5Id@B zu+@C$15QmdEOgkO=`hFD9A4idop<;-kx7gdro+~+WpLSX5;3vRih=*N*4BGEI8U3* zV+@PKD}{GaYz#drhUt@#ip!a!tmWMpuTQpSW-&d$%;6Q2+5Mi2SBL;_-0J1@fbrUz zd3P0296S9jP9T^-RSw@Qtn5Psq9;a}li(q$kReOy^HG=IV1QCEN*sgWC}1BTQ^S<H z=mbk=QwSjho$C!{Cg3|pcA)smy#<KmO%n}N?H^tDsqxF$)ms#LBTxx>5zDsD`8>l` zrxDTRw??(zt_Gc63;g+9SlRbk7#<uC&wu>!(YD~&Shyd#xnN&wd-y?ncr5cFf*BDU zoI^fUe|#jIyBgfS8J^Gl4iOyQ%3yB$lRKGVNp25rW<IQm;7sej@Ya-6|A!N1KP<!* zP%AoJ)I1^<lT}3U`A<GMdKi5%&W|B(&*9xw_V`f@*B$og6vDB?e#lbiL-x6Kt-%@Y zcYR_ptixpXc;~+rww|+-D2B6EL^1v@j_fAvN8oKT|3im;zIA{2>3KW(30hG5b&HB^ zzlPsq_TGc@!TQ(~bm_1k@cJw>6|`pF*XGh%IRjZqWT7$c01=e=U<i%+I}iflt{9u8 zj3l4Hd7{;3<~yUSlOQ=XUf=}|uBP_ATPWa)h$A$5H3acrNZ&SBSU&ywP2B%!%`D(z z0X(DUQkb~z=Oz04nO_xFZz56)oO?3tG>S8fVx7|}$Jpt;((7X4+IsR?+%hUGKi7)T z$L!V>6PCwT3h%dO&g!gJrXC`>m6AE@#mJ3WE(=LNsgb3<rwriLhqQX-prb#oBK=&I zlY(sv_^Ms6Uh;sm7A2j(rV`%n{-ivf0Tr78uTwb#LDS)wMs@rp*k9uiE@uJ{dc!%) ze;;H{hP|0*v*?gt4|A=rJolUMeCt?vFdH7ve1N(weR4AFX?-^P?2S)Q=vMgtaQOM< zaP4Bq9{Elt(-!>aJDHo|2T11m2jM3|i6H1d@auJZ?6;VC=Ip^YY%cTafur{PKiMMU z83BrrsC@c{?adr$XSaDi+;`AiX}xClU$Vz=#2)!=T$!P)>-ebj$#6eL!`A0)fNA<r z2P5$O-x!p_90L8gG>g-Ay4RL4hahX%*<r^pb$;`@aPEA&^_JP!`E~}sm_hX7ukD-| z{2>;?`Mf=UbgKvlAtos6Q5upx(oR(->>=__*djXZN8YyQGdXkUsQu^-nDiXp3kr7^ zSwCZiWi$UUZWLVuA54SyA%vDOs@E@^MYo4ouE!L0U+Zf@;h{ww;F@i9E<al+{0;$B z&k!c@R~O!E9ViqQ=fQ_@%qVRgW4P^_TRq3XmWws%jsHq}W6WBX3b!T-tDnJ9xS^GA zr#QGxSOSZ<@LuLMO=leAkxN14N)v;3*~Fv^W|z$9VQ6ZX%!een$-^Gg^~kH*8<UK; z?cH-v2C4?McH$DbeCicFY(ZcuOX;Td3XOrw8<p-+gNst%Js`RH6$B}_%oP*Xe}Z7; zLE>0u+=RQ&V*+uk^}`D8^nBWi<ZphO4L^t3ABJI}93Ec`gSikz(6MC0uiR|?0CV4R z_$oT%50M<+f#J9#Rrlb<OlATv(man#DPtc$-ueKDc*Lqj-y1MiGgpoM=BGH%oUgQI z?%7TJr^<Rz!e!MayH%8JI<FlpfmQLzxpF4{D&V*c!QsOky1!Q0hZ6Xg4xXI@i@vZl zjTQ#Bk761FNr2yuW!@&&;s?P0_P4%o?9M)nFt($0z0lg418V;~TMwx5?<9qy%%msh zIMl>3p9W;O6>8MuKGfBql$fbt4vZI$TX=}p+%54Ma8qhFh7L$;Xdo!;TK()4o!!A9 z{8LkCx_iEWC$sP3lB*SyhdKE2*tL7JpT5aQySO=yoAJx<6*D_OMQnZs(iudiDSUVC z97%EAg|HtfjH4FsuD;JZP%@k4MI0{I?lS?$*TO>l_5lRipeZ!-c7Z$|g7E*29Is_E z2>w+}6IPl2CY}!zmfwSLTns{+(_n)W`Qkvsl_9IkW*Cz`4cHS2F5lZ~x<8BVar<jD zPN<}7b<gSDLl5?-e%&XUfnMxUjCRa=^GlD}V$cbQTIyj;P%NLJJ$nSB4ANT<9HH(9 zUVxGgLcvtzAIM}D`%G(d=D?B6ffq8FBU$p)CsNNM=?Hj#M`+c0VS||lKF@+@YwHUK zppn<A{=iW%M3LRu1FbCHp2@Typu3u%Jqmd&jT0(c!G*K>q`vFdU`Q^A5312#&OFhI z%bPnz&>w(`*mao0N3ytbSEj8;4`7gkENTERK~42}-4RHHgk9iIStQ_j0*rC5=4d99 z1XmCzz{s>dk~wmK6rv>PaS;JqHZotAVz|QRaGg2y>I-;c^y_EIie0V@bh}%x$%Ry= z^~GPmq<8&TM~#Pm{d|VRu=4P)f6bfF>}Y6dbkB}5FiDgQJj;3Z_^+SG*nIfc$JrtA z3G<;>pBI6c+8`BOnOv(=PW6tHs6n_DyFzHB4<j^8L>`jq6P=(srKtwHLLaIO-|9l& z+8}mM&&XMy(2!72l5`Ef?uJ7&Wz}f_d9x|VJc5MOOL}7VxRk4K5nk8v9HDUFF7D1S zozr5-b4$?lPO+a-gHB^ap3rJ#>w>N5$&&h*!gn0FaS(Mc^-of&6q7noFC|(Jvg`VQ zkwN+<cCliY;xq6(LrioFe`VP4(HcFiK5+dY%cE`b@mlhrv38gJfaTOf$Yae*VMGm1 z0$rgatU=TI-o@v~q+6km>s+dE`rZd8j^zr4ceN~wxIs<5=T6jhYA+kVYxKMdXF-OX zEFu+;@|^9HhU&h0%!wP=pqw)qG)-bVn-0~|JKwy7(FfAh!;jH?^h0?n6OX&Z;o>`# z-arX$>dJ{Xo|M*iYjh9qy8652<U^jMtM+ISyp>Il!A>*0+8PM-1m-~^d7TE}Lv0w| zWU4Ws;*_~6zKMLUKl76TI)O#q0}2X^DzL8o^|udzTeG+aWbAS%n9YJrsW}6^#+j_A zErvLfJ;EdV`rCESQHqOOw-Oan1@5JavjEU1Q}~A?TtJ9^>NHsMUZqfv8;HVEYeNIU zjUl?)M=fRrX!WYUn#f%~9!p05us7D0fX2sV!`efz!Mn(>h86iToLC3&mXu^T@LcCu zTA9>Y6mrOD>WhNNge=<b9D@^SJxt_6bKJIcx6mm`IZEHf+eA=L?PB+-AT!5LG*MG< z$XlX9>(_12O|DM$g4-h^{PG&cp>$GiwTo05jAI0FATB6J@s${&7K;$)BiZR?ztff4 z`zFF;CTpNj8}+&$87QWS-o#gLyGAiCB`Hs<8NGy%k<Rt2n!y5f$40MTe_Ne|PJyI! zMsud^<MA6ea&NFRcYO#ZQ_Ln2_tmxs0V0Aw^oy>g_0>u`x#U1m{}f)_#0cO`XYSz_ z-(5QIP=B)E$2BR&fYt_f(u;DL6u!}2Jldr<LcXd+HJ?04hfmZxwLR0;>fIH6pu=dD zwu3$6K>GtaE4tKmcm(Ykv}Rf9+Mg(dnIkg?B<*?q<cn*wbhSRM);2(;eFsU|+NUs$ zor$ZI+Lpja(Y{^y=E}J9F{sT=!-eUt3sM&_Q>{{GsUQ3e07eqElErA860!@7IxubX z>JM0gtlg1k#lv!+P(y>ZyVIiH%Vp>=o~430579Q=<f?{|#%$@brLga2eBjd+;wx%S z{<I}PZ!A$=+bz*RS%(XbS}9D~6lX%54oocVm*@tVKMHe(NzFGzr%F2ZGVc0N$3klA z>p)jfqr7^CZB?RER|0QUtB~D-uEArq(0pC9r-98BSv&9L!@n?HS_nrSTCGDL(==j4 z1t(ckd<k_L*Lg~xBgq+EYwmr*`4<b(BKn<;k>?EA?IW&s;u<hf`z*jCn0rDxJ;n<T z-}(754|#r-r-m81t3+wqD6A7t=URH&FCZaf)-uHDiVcR7^yvPgP{LS6(gxnu7gadC za+Lt9T*F_lxU{YN)=EYEg}v*_t8I*(FE<}kZYW^iywgc>6+;?jsSO%Fau;*rC+eWi zYhnR>*#=ZDt(72>WKDA~JrG)@Wamle>4++`N9z{L(KEu+k8z6i)Md|_LuL7hC0gW9 zW>I&kRj(62ZTFll)nGGq%@fI3_YR{@<=m1|UART|&RSg$rac_j{ICOw7ERG$=@K~L zvJG<42A_4Q1GTeJe`!c+EDNNl+TL1aC6)wr4e#0&U^=FHwr;{L1*BPW8Igj3S)TI9 zTw0!15KLv|yN(ZMVmpJ0iPE4dei0WPETwcB>Kcd8&|FAmyn8XqmWKLNwzZNBbY$em zN2zUXoJ9JvaY~O&tbDTu2Y-F=yCwM41p*o8%3dpt;`PeT3#I2(uzFk7Q{yO$bb(vY zuI3@KkQR+b>Iw0tk7c$~h+(&^4%MYP+Lu6Q`9NuX?C0*psbGmn5@_70lc=>`d{7(C zyS2UO8Zv)3S;s1wm#}%MQ`BsB?izriB8G{tNIvNtDfTE6S>?Si7o052$}VOe5qc@5 zC8-H?;$<m4={g5G*{`gWs?=&%o7{q3mWN&JBv`9%Y>yQ11B$O3TBj@LY9dKHHnwA( zJkjwO>|{q*(R~a733xYS6MG@pJ5|EeHD^^xO(BK9j`BV81E|V$56fbJIMfe4pm$r< z)-Uy8P)&>C^*v%cJx`~DC+=G5d?M;rI2thU5LenoiDc200jKrfL<VFb{TdDR^D^P; zUK*r~q$q)OdP>b*`(XW%XVe|Js?fk@>rgpVSKE%<pisfQ;_<$86MXdfZYrdPs@;S! zD#y?bu2M_5=j!`*-ggpz&?h+ZPh6r4DLNR}$<+@I89GdNwdho5%cC&8y@CSl<8<s` zyisLs7;-&8aiH;Stwx@NDzf;Mr|_zuwnmY~dg2wV>&^9k5AG>w88z6-b)nPIU$CoJ zSdWBDh*8R113|kO?_2nYqmk?IR9{A-Sgq||+YzbsLI8T97KAmlr-iI|u1DrQGF6YF zSfj9n353ElNg4iBo2E#SYhIZ&(I{5A_C?O)>>~W6f&?DyLZRwxEyB4DxhoCfPE}e` zu$$rD-#LkF)H$36FYAt$D05M70}~i+7Sh(M@4+E6dI-sdYR90r(X<9(cayjTKhQ@5 z!+T!miuAR+Psj{?D~Wo9eK?C~cO&i-Z!((P1)72xSg={WOCOM4^_S@%l6dAW$#nAK zhc3Nw<N6tYzseP6m8!;U{5S%%ke#&}O}kX2$^5B1mh&i`2cCv|IpL2VRcfDfO0cMB zSWgaquAb30fj}+8PPS=LLAy&HZwENZjWUs^*LF2MijGvi7C3ozH-R8e$1u(F0l~9s zgi$XY3p8C{sX~LC-9oLSg0?Z~e`LivXgFLWQaGro6k4f+pQ<QaXqD?e5qunRT+L~J z)I=hr*UooBbU*3@mC7iG1o0>(ahPL_u_vMatU<wFkqy|PUUBZ)yT4%2hN8_}<dM$z z9KM;lDI=NkqEf7LT^GyKJd*1BDae3ptVR8xwHfF70owqy?xG{QKh5&0bakRhQ}hOS zh0^qtNwxPzG(4gv!cz@oca?(}@^c`aMn%IF@1^RcmiR^ZOS4h?IKwA5Kate<0y9=^ z_2O7utaEDhLS$0S)e~!(?bs{JIi|3vX{I`6i7Md9#-~oB-%!v`W0Xacs*EgcF51_* zK8{uHdj&eJcAlg&Ck=Bp5T#>t@GNw|bC18GzCy)Q5zW`PY>>B>)r%ST2u*cVhJNs^ z>R$~ycZC{V_rNM=zxF$H7=tQ8V|foU;Qzn!($n{CawV5r8I+f7tI~JuirqE$=Dq_R zZw^^|F_pTJv&plm)TswHc`=>3v8KB%d&4F#AorxaW?tX?TClOcN~+=SjXjr2T}Qd| zsnl7NJC{yfN4ayU^mQr6^V)K&_K8wUI(6W}YpK7pwm<WW+juUVPMyCd9Nq(mKBR#| zU+XV!<9W1A-c6^^FL0MSho|FA-p;S-Rx1589=8Oamq3+Dox6!A-qwBseFmjGl1kQw z8_Z3gf3e1hRa<u>mHuT=u@4V*9K4HF%&AoR7*-pvykt_bQ(Lxi_O)Li>1+_%|9Tdg zuN_OJ-m`Y-@Zouw{fiqk{uwN5meTy4?@OoB)6kPCcoX)G4wH(v&i*^cx*s&p&7MoO zY<R|8I*lR_I&_#N8aCcaKa<)whKKneUFb*N)bF;bT)&o1rCM&_)%^6leFyrX%HYHx z6??vD6KB%tFco_l5A|<L7C1m<R7fhFhE?rhsu}K*vi2ObOQ%eF$08}f&E`-zo}Sua zPdUElP{^j^n`bJi$6mHb1|NuH1>=wN(v?)*NtDGto?iO6Mo|RFNw9iuj%x<Uy406S zy*$5eT2iUO;_+1KR>^*?=i?PS+mdQ2S@U<P)bX`xc$>;Xt&R&}>fasvT{_jW3HDU& zJOuyZGAPEpvM;C8J$7Yi>Ax4|FU_yn^J%De=48+d#`n_cmZB}AMqXN2M``ddzl08@ z>o9E;e~y-_|D~|2ReQz8&IPHjV?jFnaRZCu5q9`ZrQowED7R_<$MxdAbjyaFO_4px z&dTozYhO;K;EaQ*G*lLE;&)#~LNQV~mF_?_Bd%{F81d?RknAs2?9TP#euRa!n*2>s z7Zuo2VarVKC&T>#S-n@Q?y`Mi0luVv)Jf13>fA1+VrNTs_r{yZ6Bph}rw<wX=cqQ- z7O!;wSmZ(5jjFclW{DTNd^AYKFH%{seGgGh8TjL|&9{P7BkBdprp_W##aNL1qp=TR zC(6QiNIqMu?2>)#I;!U+G8jCn>MexVfn>*XtryGop^c}}o?ZmarbSDJ!heEFSA|ux z4QsZ$m&s|y3>}8%bNv^L&*!Ofn!2GUV*10I=yaZWNjQsOE|y^xq4W4VXbnRSYKV~C zHmw)!SI`#rGnesz-UJ8-#>0mFiyP_GTh<;*!xu<u39Wry!@&nEd{nEiPj(ItY~8|Z z(5ZfddLSCui{5~?aMPQvq)5cVAE<SmLZGdkfIbF>K_3*@rtPZz*9&jWmh9R=ZKbS5 zlsa6rK}#zA@`~M@nkm~Kz~0ww4#BZv*AO5t&7Q=uY9&k&iEuQ2rE06cs0(qM?Y$k? zHN@7g4GU!tqk~0kK=nTb=ab-^24@TRNDducYDuR*v72as7r}z{57ygadDX_Qms8E@ zdE_vE(WDyEhb($%c4(){Ha1&ICE@C~(2XJK&lwovQP7K{YxH#jNJ3_4_~~a*?D>ST zOJS=1km!I8nmw3JCpYaP`ne|$Q7MR~XMTY=+J}zPN%)ekvz1h12UbCSELGM#gd+cF z?R*E7?I~IOJ8<eRPEKgVy@@XRO$?zQlRO=@z2odhSYDDL_hKsb35G5a`A!NN#or8! zZ5{%b{cQVae7i0{uaj^virPW+VUhvQ$M3eXH%H7jD+4mCZGHt?9~9>9e!h;8FnF*M z;y+K;msU16ZR6(By0vRdo5V#fJs7g}_~noZx}`#hVNeLxNq~}tU<-4Jr3b+~HQoLH z`_rIR#J#@mpReoZ-vNXZkII|%<t_X2HvsZa0C=AW-tS+TXk;c|s?QhnGYRjtFHgvO z`k97>X%oAVD=hR~`*^Rvlwcu}@a6fI@6%_he?LCT2$j(At^W8Yf{86;*D*s%S*izt z_+u@3oqr(zV31@9BLrrGCpn%#OJ!FCQ84jM64ic13>nkjW}laXB^KlX_={mwl#1vd zCs>+EE@kBFKPT8+5(yB9zdQ(YTVlSYOEw*?xG3~*{0Ei)BL)7e0RMqOy<sOR?yNGg zVU;(G;a@C>O%-q#kI@y9A%AZ`3T!4<lp260rHM!I%XIy6=j)YqqczNb9;k>T<zE`S zEwq~da{vbXBM1ILLP*Pu`(KEP?Dek?gny2VOzytLpO{QcS7s{Hb|#!I%_OF0ri(Ln zIzBVKK9j`Bw3(^L4hP{(gB;8tscw1(DP^X(yckmB(=*&XB$>!34ZdckSr18CoH5f$ z9vB>ymG=yIvmm(Q6X3Xlt&A-sPlKIBw$sDR>>^pjzrqZj8!5m-WM*NJGBRS7va{2T zTA1X{J`qttfd*uet+$Grh*gIEFf%(;j>s;vw3jIyHiUXNRTB#S%mmPeKBYdif;w%^ zfSW4GEJ(?1;J>QY%dyG;w!7tn<w`jwbrYKir*}f7DSW5!J7uP0@Q0ZSryHhbm<9=E zDwwVZ1;mx6<5Q?d(j-6~B7FvX9K=`@TO-b=nP{f0CW1D}(q`Hs$xbziJpKeAC{BOd z$wvadkjMk~feP@=)XWyjh0}Gyn?glf3awxZrWsElWI6<e)2KklOa;fLHbiG|DuWXW zKob-x;GhCaW*nc`6ge_{KvT!EkV-@43}j{++CwRFH&bOWU7JoIr6}xUQ=8LGw4Dw> z8W@TG<R&htKq%^>DOW0&@GX~3DORqOk~l1xa)=XdOe~eca-Acw<#?%FEG0n2>>{>G z$>KLCS!}U#nH)4TEHx=>oCl?bNK8FNFsYFTJfsvdpcIzfrO9$uDpg7@KytxUEWeDc zh;0#DWh#-M%9nApiLHcfWopYEEnr`mszd%%ejUdw`vBYhseAanfvqxSQHC5?I+PUB z4dG}O8%x{-O=T*cpJFyQ2tnVMoG6xxrW6ztrDDkx<2*?q39c(zZ14?IOtB)VrW7iP zMPePuN<xyv5fU1C&M!PrtVfct!~s9$(xb8`1wQ(%C=*C&aH(Y~0$y=y)2y`o4Jp55 zz&KvgMwVO6*H2DO=JQjV`NU*?vXGBWuICZB`NULyswin|NZZWAXd|bUyv0#+DxXIx zno>kFhjK=?1Xz+2OPYLuv@)osCM$AO4>|cMAr13Q<bzLss)Woi-@wBtmxW5Aipj?( zr#AAcLMWspr_M#3f%9Zp_DtEr5i}8b)Cg>0W7SIPfl|<IQ>jpg7@>=?EmYxFaVx~p z8n&=#w(5&pNZBgkFT@hqlPJV-saTKXVo?&9StoQAWS4P<QpiIlsqi($$C=<idQb$H z_!eZKzJw+swp;PyR;Ad8RFW1=F^ONPvPULzlex*sTz+ygpTl83ZzdaaIG&tZox>z! za;GGNf@GKkOkz3!vT(AF#d2nHw@||!IWWoP!pVoohU}Oxq)C#5la0azbQLf`z~_R= zCXvk_Gg*(~I0z>b*kSH52_ZX}f)AL1!sg18@f<V+L!Kv50%r|Eln1-I9JMgyKq^!c z*x|pLgik(?Tq*Z;sOMCqhES85BU4$^sstF(MoI{CQh;ipoG*Y=gn;OhgJ!|x6RM`@ zs@_!jaHmKE*GH%VC4-A_%2#L$1!9gi83Q}aP$q5uG3F~LrG_3-oU9~Iw8=~TP>h^H zV;uo!wqlzG+rn1-*8RI%T{tXa3%4p;u?bF9O1TF7<M$0p=G+f6naSL=-6-b}#hCKg ziQSV344FUSfYTpj<R0Q7lKIP@AlJz7VOof(6#noET29o7Wm{mPGsl2`cttA6Kw-{Y zG1~&W<_TeiWN?aMOX6r!c9e)|C1;d6*EP9^N$piamM7%Iv>E)7O*_ie2`3;h6Az1; zIAnsdlRvqFa6gr9Kn8OvqHk=n1c62VN0#tIA^zExV=hcFA4KS*5LAN>w2~^uY1s~; z6=C$o#3ZN5tYDch$Ka&~Xh}BfEPzufFaZuFPzEy7-mvl9rrAhrF1O&i>-F`@1}alF zvl-vm3^weh#c6pXx!jV*%N!os+}PaQz_yfnox5No$<q)V_-lk3cPTe3F2xGFvan=f z5VM^8h8y8#5jo*Tog}W~m<kl7tYzxvhJ;XJVtgVT|Mmo~R97d)$8m;F-i8x-ocn}u zJU%gw8U8q2G~Pf8e0g3c^x^o9i7^~0xnU~u@dsk#%AKX)U@84IR~iJKyB?4o$t&Z# zm@zRvCL~Y}sbHqLo_VeCZ<AG|t7BVb|5carMG~_3iWIFOpc!M3DfTvv^OT=ZtbN>_ zIX9{PwHoaJffPX*vj5^aT1Vs@DJQI*Z)v=Nk3#sWPE-oqS(BWp9^M&J3sO9s*x_77 z3XEAfvu@X#ms*Zr&7=m_*Voq8V`~OmxL*IDrFCt6-K;gQ;|Bh_>o`Wvjt6PLw?=RC zECk(#qc_NpAu+ZV$kw=q1QPL-3^&)Cd5SN#aLukKdCcMgG{9d)uE*EhjG{bdanrqd zVr(*eFm~I1wqop#8H+!MEKiJ$jgN<8$#Lw<W3llKY!z$<8}R7Zqvk;pxb#r=7U@#N zl`Kh#1cHWTi*jaB#<7)MX^i=6;2DfH<A{Q>1!F2sXefmmK;Loe_S8hgjE}G2(2O;( z7`}RD#^HbW85`e1!T8wtItaPVs|E#OL1W0829o*e82kCe#M-J^`?pK!Giz5<AFr)l zPN%X9s{{W>DwX4L+rrW_@4l33TX`2ZYL~*bKU)3eKc-t&R@VlfNu?&w;I`sy=A*T> zfoD?BTwQgfYeHLEGi&%W#kIuh+L~FlI4)w-wB+g<{z?+3p(jBGMifWD)HR&13q^cY zx{B}SMn*<QM@Dbi8wEQ%GGSLo@7TMytht-Bc5};qJ~}c|9&Heskr6W*!;3q1jEs(q zjgF3?*hnBLu`x4hM|Ls+U-BCZk<iG5F`TemF#3>WGYu3-HY0Yl&gD0PBQqevj#NhL zg;eB~N8=>@y0R9zq$4p@7##!SB+t!gd<;MJ$|oF&jV6#Bj@FHlHQ5HR1BYWH6hO69 zF(ZoX#JT82*5OD(I3_?6LQ87jq&7=>vsYk5vUjP;S{&S($b(9b(LF}phtpv6Vf->v zlpKS=(nzBi;Z%&FG(|&gItFE9aDQy9L}SL1EL<LK6eeS%GM5bs|7IcmV*fv+Z?BG~ z-=0ptG@Aa!*yWpgyqHeCcq}!PM^aGuZ}aI}Z>RbTqp4@cF5k$fpBY<7|F$reYP<1# zdU&BlC~u{oy+42#6YAf8;$J~=#J?v+sOdj;%Kw<+-%j!8o%m}{|F@z1lg|o>Dh2*U zD*q%D|5CcTs(&?#2rR@`3!ssROHK@<vWCC0Zg0%n^6;2l9lmAnj@!z}xZNDSY40G@ zj)cQzq;7a*co;{qkqWjVQq6EMVsT6gGu$);f)Ud2Jivy~!EfF05I$z4jN=en0z@0b zsK?>>5J=5PY>3ILI8tT_urb5&5lN^YL1BswL~NXg<U^@OwnouQL{P9DPI?`ZEb0|k zNoKg&DJfYNT9ewBP`;>Sks%5Vi6z6aAv00}v&8VwP+3GE!DrDuX1Go`g~LfWLbL>T zCQ*NPPT$#)*f0xHJ0w$EbW!nK!K@?-3z*6LSsz~HmHO3h(*OIZ)M#O)a5|0Sr{~iz zt>jaq3oXyCAZ?}aQhMgoR2GDzrtpUg=>vs@^lw&9rN#^S^luhGJDDDxOQ(+K3oA-r zuq%j#l^DbX*eA)vxP*9N1#d{gYY+JaN?l7(pA}?Sp?ib{90?B#!iFq^YJnI|>&QjM zr1->OIE0?qer<ZxE)U+bcMw-YBY0kjxEdN98X63S5`#m7W+*;5WI$Vw6MW1dyp7Xl zJ=LUeXlM0waIiQO8;r9k2_q&UIDVnjE-f`QNO@mo%A$eFuM8zgTOMo>-IO^s!8X+3 zgc}hS4%tCF)a25JwzCbPm9ho08H5I^8c!@bRGC$^j}6v~Sn%@Ma2|AH;m9#xa>}+` zO4|W0?lV{(a@K1COo7XswPt9Sr{kW2(1U$7x3avlygZ*ibu;x3%gd)zFJ0>HKb;ye zD_=c@<4b+_)2EilQzQ4%&w_4cc^1#SlebQh;5)NOn@_*ZAY7hI{{}orxib5DI(2Df zWjR<0R_ro@3dO>e*m4DD@fGaqmXV8WW-M!B3HfHlIJ!m>@KYhp3JRgT&Uz+-f$z-Q zk->pkTNtzDS&P83;mn9F4BW7H_|E(OU?4Ua4kQN$2K&ncy9SXm&@aCO{p$m<{?&oT zL6YGc;?xWz1_$u_D1HYVF%J19qsl;|BOWvZyTEAxL?j*Pub}kifE|ppIGKb4@j>BP z8rUI)$Zimsl(Gxzu&gKpUNM%3p0U9)j;TonyqF$Rq-ZP}gab{KNbQg%_JEVBpr*zL zz@rW&2C-Kj)D3Y=Ux05jC96iFV@XosA!rT@DKY_(P8p{hQU<7E5w`X7?r|=7@NeeQ zZ#{S`_3DFx^x>Pg2d<?4VP@)1f9m<0w+5Iqmcl^x%uM*;kI$#)9z3|1`pwn!Kg{HB zFSPt(n)z2#$L_tJ>X}RbW_dI<e6wfieCnOjgS!u6%h$10ux(*0V|(xbXEI*JbN#08 zoBfs5t9^ZV>)jxpIxg8;{dm+lVVC=E*xNzB?Zeygu$jI@e_x;J58d8K`i`spef|Ac z`|yjrB#!&S{unlcts=$hnb(H|+uumK{;U1{Wt=o&-`B^YrvFi}kvt?I72m5B%8^ou zzW%EL3UD9t7pzsQI<f{0s)G!9B5Z7*&w&t0q2@7^t`k*5DM5X48uT>_4W)vr-fKwm zxN6WWN(pn?Wkt2e<(x$!*4ZMNM$Ch)NXIwq+o9QVuA<eI;2!opqDl)NQ5KeqLYiKQ zOi409og4PW`_a85a!ZS5sd={Lou&J~NL^X{*rXD_T71u>{&aBZcX&ekt9$8pmPS%T zi*KgWpD!&gW?o-hT)N-Va{ql~4lZIX#f_HVE-t-qQjfp8bg$*NpdI9s;(z>XX%Qc@ z7+b6?#UR2i*5e!;3=^>-N){7xuGw}ef&7qZLQ!6<Ba6ilXL5vnd}*;PWJbtBCWK6o zNQ_OaUTqrbyLts5j7L|KSFT>YvT-$bWmUFN_M12kui7htW`|c3ATJ`(Xu=i_gR6Bc zDrF7Mw}hy0wSlSlvV15-%2C?77Ox<g+zQwNY)UGckW*PWQ74|2B!xsuOx-A-49I8| za_U5)mi25&&wOlb_Y-jF0=IC{EHvG}dv9@J;r`uuvxwu_g~i2%MdZZq&BC`hEH6HK z|L%RH&dy2}Nm0%&J|d)_-$iN3SX_uLh6}~TIuu%13>K1PR9>_Taq?@FRLOXP8Txfc zEKimwiX5}}nCzL!9N8naL5>%6)|>0?y%O{`^z>fo?d`c@dJ|WAd&1s04`V$+Z{3w1 zA&6hW3A}|wWLzorCP9Ctf<x15ub?=}_uza7ljYmfYsjWZj^qmoruQ*nrz8|fp<!=* z&lMg7y^vC5p)&Y};F|!?qSK)wsuiI?h}?!=6o*Jsn%*Skvw-PsAXD%YOQ0{M2fa-_ zk_@V#cPC}xR8%Qbrs-|Ef)vpv0GC*=Bp0BVq)`RR+i+^p2jolhRjqPwvj`v)*pUD` zu|84_Iy(m@daiJmJ24+F1oOKW<`)*`xyixif<<y{K3GT~fk(z|6-l-8@rC)Vg$7rM znSm=}7Lq6;^d(8wvSlf6=gYz|Sg4~Q6l!!bQNYfVd1WC!zYvm2<`X+6dM<bOT)xb2 z`7(TdInjOjvgv7NDnFNzWP9o^cT2Jr64Ub?oVijs5IUvrmgF9DxsDVl+aP2;J@L!k z!UzOCmjg1CY}*s-Ha)v8_mDsM@He=eKq1rfbv@M#=;H)}%3MyOKu-nQn9E_0y&UfW zeUdbWg+*t3ISCQnWzd3Y1y)opKa9L88%Q%K(12npcL%azDK=_>n!Fr?)-e<eLDwjS zQNB)$G~lSt+F7d{^$^B!>Z#^aA=C3H$f}fLZ9wIEAP00}rx?>MHd)wJulj0gPXaVy z52T5F?hs+giTn5G@7#~g7qKm23-5>X_4nuJk-UCCfn9*aiX$js&ut4E(+#$}_w9V* z{=BA0Z_%9V?!Ls&rHf&A{8D##3AJ=7fpgOxlP&D7y9AnxhI@QMNw=4*%QxK?boNq! zE$nU(nr@u!;E{YUb;rAfB*{~A31?*~qymgDge;46GNur`CX=M5yCQn1K3<2qi_|6P ze&|v+k9Z=xuseY>uYb@TkR5bSl18~wszK3uEkV8k5}@2Akk@esH{g`An;dT*hsdO` zSa%U;_EJTZw9Z?UYmnYZw)i+{77nEn$VLi0Oe4L4RK;m#FYVNFA|L6bd5qFU1IM%b zlH7_3XY1x>=jLXExkm2rovqASCeF^y8XU#uLTqL>iA+!>@jDwLoq0lqJko@7^-_Ay zdYTw$8Z=FF$ua=BnXALm917XFKp98ekSQV@4U~z`qKH*akR8k=@N4FDqKoxD7k6B^ zc<JJW3l}e3ym+B<F?PXV3uLo6wik9v4k@sO7ZacikxVjXKUtf7@!}=N$<dP{yx52` zQk<tM!(6a9ZoI@~e90{oj!iyExHo$4rHi{%#TrgKd?px(9npCLRA16vg<A-wfz*kz zooK50b)2a_aER(vBh8zx9s;wANzzkunna(_By(~1m&<PR;g=L+@gg>6gygD98Jet$ zh+34;;LcG&=!X&$sLFe0HoR9id+**Xj*|CgXYb((^<DxA!E6Ih@eOBpBio%I1tc+0 z+j|x4OW2p(c|bxbf?pO1kQvM-qzL9)1}8CWbwXwCS!6c~Jt&GQUdf$koyF!3Iy}NM zrgog(ae00Pmv?;n8JnodmC2vWbu-|9CinN3&HX<r`(@5w)+z^_LAbiQe*9ljJ%{D0 zmx63;t5c}3<g+t=qI1Q@SNjA0%-PtHvTfX0#S-%1YU#dp4)AKK5xI(Od?Wk9%xwNt z#3*@UWVEx4SM9aGU$*hjIs%)x({AQ%;>ejJSio6)qs?Tok|4Vo@$^o0#sxMxn{D3; z>~~AAo*B&ES$d-_`%z%aue@VRub#sG%uri)!rFXiHrs!}sh{i|9X(OD$;q~MtX7ZD zK`ege?W3p9oH=sTTGMf)V7IOXrS`JOWp(B7n)rphR%j$UaV7gv#eTQgo`qf6w!Tx@ z*KIl5X^Yt|!^D%>>~guiJ%4FPMSo_)PTX?s#M0BF@3)WQg@o6#*%O`Ca@VzB<EPfm z5xl<ZZgx4a-z>N1+q0uKcs-lFXv;6=vu&f+PG#F(e#_ReMDM!BSq@8Bi!EuOBoZH| z4zAk7iPTwuPBwrfnfju_SF;}(`-k&$LAgCUYjI|6M|Q2;{)#QhmMz$`*`cj$Hvfq@ z>oeQj$ww0Xmp(ds0&jAh%?2MH!PD35Oz>f+U2U7jZqe4AUZ1~p8Wnb>-9YhDd;9(2 zb`xH+x3VSpVIC(dZIj{ej@bH@?BZ7YeYOrdb;~vvu^t!;w11iU$2D8Gf+s{l(KfsU zsDK%pcK&wpgW$N*hIcvs+hf@+YHKfN&sh6v+YMEnCIHldDzO)`@RfIYb0?lV^j|uE zRtz}%aybvnbL{|pwA;ycgWVDgSc3r&(0!B!l-rl>-4488^2$dLm0h-<w*%~A?Ocbg zA8vd1O!kH|U}DQYT5L(BhJYTy691R?;kMbS;}u)?aq5{AUKaU>OUF~`mw<Ul-!2`; z>iUJlsnk1xEgd{Lno3U+FOy1LT;A4A1oltnvu(hzyqeuA)1dC`r`C2Mkg~7Xc?4Iv z9RYKWLB0NITXyTBtEc+T6P=xxK0<)m*p|sYawPk%9Y9q<=YH8efR!5yw@+2j#<Hul zGP^}9KhF-{$!?Z#@_C2&1-ts;?A<$eimW19N-NXt>E{WgIf!NDZ(+Io#lZe6^Yok7 zk&0#asn<R}IfdVajr4xAno3=GDRtOxm~?YHpi#wi%jmgYXQpdB75m@(CYv3)+XX9O zm|bei-no)JVi1?-vq-?cH=oU}mOq@mlWni4mA7oN^P~4V(OmmGfGo&mx9(=|7GLRt z4R?#Lb}iewQ}*;NtgioV&~aqNmM6>QcCit0c{96NZr`Mh^Vz<cY!^du#)f5QBSH~1 z`Qfqj^3!Kp4%(%3i#gX)4D62Usaf-MY7tA@-wN%w4z&cfi2RS!r)>CidaamF-!(1i zjm>m=Y-w9#L!a4gvi0a<(7KF$5)HQP6|DRIxGnn$f*1C^kVPey+Oz1Osy)+tVqOQ{ zJo<3CebAoCw!MiOJ)6zG*|}_!r>#9*w12Sn3JM)j<Br;;Y}?5rT_srhIXbVY7f$pY zG4*z;tu1@og(-}Cq?G=6Fm<5iUdthZF$SJS9PD^GojH(7;WfRq?b`<dJSZXi9N-in znJVIVqXig+vsk6yw>?TRYy>N-#Vw1~UwBqt#6JizSU1W*)D$<g??7#xKu}_la<PIc zE0&jR;*U<B#)!VLhLUwygcg=dwjQI#g)WP~#R#_WDBgDrj}+7AH`1wt6~HF!Anr`9 z1a{|I`q-&A{|O!2xzwr9e&<lSB(-r4pc%72wZxh!rO}<(b?CggvaMm=!2fP!kGv<% zB?DL;9X}flRa^GqBG5Ve)BQmj?=gntSI|%{rq_)9qy4F=`Bdt6w=bFf=?hCG<j<#C zu78~Vr3l}Ez~XQ2UQa!Z`|vX0Yl!E7ftXiu{{Zi-EWuA07-cY#e(#)}9V?Zd#_JUm zCsVWNe9Zn6p?!QX^|GDDO}hQIA6U2|&Ci+CBL`Pt+CfNcDVEUVq=&Xu$d~3G3m83H z4nDB)^-aJjO6!0?Y_8k*=DLeg*QeG@JJ=y(WliFEdiuj!JH9k=!8kSh`3L_Z$@ck4 zrO>1gT=CG=tS02aYXZ+vLwWqFM|_wHDt$hSoQI<lt9;^Gz@t|Z@`3C+{@n}DZ&&fO zHk8B=iFg1foc(?UX(ie4#Fm64@f(F{Hq-dXH!RevXtP=`;tC}`1eQbQ7oe(<hrrYV z|98f`^~kQmYFVBc^Qp3m@lTK)DW3f~InEUz#48ZVMd?FiD{C*7+S6R-;~&zHFXTa? zLdyd%v@B6bQpvIwm)`oHop!Q@zc45JV*PI``=y}TUad7{C8+<|T#@^cjeoRI;t!@= zznd><{QUkfM1Peie*aep+?gMZ+Pc3QGd~<d(I1YXD35BU)nC*RMH{!iw+Fb_nIEF) z#H#(<NfiCjB#QE=rh!hN$zjR>DX+eK!c7fLXY2$fwrc~N*bZ!)*j}lb3~t#cx4ysk zFE=0rgZj_*d=D7Q|8wx~_x^p!&i<!8PZulp-=EyGr)Aar92tebT9OlMe{~bu*pqwr zK8=Ck$DjUhd!I(%hm_gBK^gS9yjrMEE-{m&Ze3otWT#G+%k3XvvV5l<>VMWDljXCR zEXRwln`~YC7XD2snk>T^PZt03$`5{JCx2+Se(<yTkM<0ipYJ(xdGFZP4_=!8$*%(Y zAI!;XGf!QxM}Lf=<%i~VIiXJYzJBf6_byoTvpsKKe(G0HG++Gwi}OEu)+t(@m5CF- z^(w}xsm``6C(5s6U$`Ta@9dqa&TL!%`_8?bd1Jnx%w@OFyz5S%IeP>%-)7Fdi`Ota z)vE|M`*?Eesar#P#%})4HvbgRT|fW1`RPk=;K}@+$p<g~xMZ6*e)5vNvv=0~N6c<< z@}hY4ZzqlY>N-z;e8Jkceo!%gJBboYT|e4p0mA@em$9?}!}4VJklo0(k9KCaFn4V` za<e^~?;cVMKEtI?;|WYCIk45t;@h&Fuzn_s9cS?yGK>GbO=t0woVW*X$Sl5VGMfeD zcPg88v-md7;+>gaD}Ha%w*27AkL}F&Foyl+N9IS@tog~wnQ%|+>5Bc67x(`4p4YAU ztGDjJ3oq{Z>pdqeOhQc=J+VK+l=A)Wts~{yUb83h^p``5b~e1)g)5XSyz_8(+Zp>| z_BO1ZwVd>yb(6_hCl=~(&W{MhoWJtnQG+=@C;K|*?~*zH!YvHK@hcq_&X}|JhdXR= z&ECwGwzBQ>L!9#G!;gN?l>ZxBPvz}{r}q5RPCm6|?ce{@{3vhjPfkugRVdj%8+vNi z{;xnDpZ<ROS5{75b5^<&3#ZuA|C3>D?kxnhodK%y5nOK>OrB94aur~^!)#p}EQH~) zPfa#9>T41gHlw4wE_jbdzV}LbO0ElxoojcO2i5C>_~oNC5?2E5vY;Ik<_DZi;?jl% z^s?Z(n{Q#l{N&d6VAKbDe{NU5_hK-)_ano~`RU26zx+GAksa;s!uMv!pE`z#?^AoO z*$aO;JGK{-H>pjWjPvB@KU<prfh3~P>ME?>-a&k0t36xB#VXXd8=q#gTiw}rEYSV1 z6|dmmfcaY=xcao6_QaEyKH?<;{@IL|tGGJo2X9;*3~<-ZtAq80+o$E~0A59n$_2sa zZ9}*^C}(BnoNLDm4sdla)c#rZ>VTch*7s*{+5EGgT2$$tJuh0V(YNep-`~6Ur!cng z{XPHb(B5%tp8i_|lAMe&T7NW&oWE(?J7$0KU-s_#8TvpZe)gAp_JUKbu@(CV|J3%* z{O@3(To7b~m26w@o$fhax!UqMULyo*EUyvHa}xc;0Im^mg|{Ua2c5V^_zaf{xJEc_ zPx)(vWm^VZNG+9X1YB~7*$dgeYq-v;Uv6{P2yS*1-zeeP%UTihUv%MXMVnlcT{F(` zt=J-Ng2Y!#<_qd;?|c%Fpmy}q6ZkiTBPQE;SJg*SY@*slo;}Me9JvH2;S%6%8|MDo zE&)za#49HI<dKrh`j6P9_AD*|cztsh*LqVgboL#!yadQbmjM30iR-mXoP@7K%+>}5 z#*Hm-EUs(orvniuoVJ%qz-jw`bxNk~t6QA5Z`r_4+o6|Dghfu<zdZGDL$jM}w^irb zzi*O(DRRY6k-t1o`QjY(pP$9ls^RA0HS-jy#clJHFU=onm8;Lmgp{lQDuqT&+4zYj zWcWW?oEn+L?qmkPq~NTrh>erZKqh{eu;QZ=P0iyxm3f%TkwZy%1r!2Ge05=Bk<(J1 za}vl2p-d;aa52>BBM&1IyV@kgTA+p%gp`G&PJI0wxdiz-`>dIH!U)bbIboGzEMitS ztMlVWAVWV+n9!<neu7PYem-lEuaj#ek$@aI-Bkza6kgmQ5@m^Hp|%<|WCfN%;DyZz zo&uN%B5QXNO2IF|9s*`Sq9T0pd|iPV%p`7FaVLaU2+G3>13-0z9{7-n2<yuelLJu6 z5mN#W10aJH8XZC(Vw452ynzgdNVd7hkt)>O@qoXS5h(0MQyiW+5ZJbqP~vSW(?G#^ z=TMj@O<oZk6UtnLWfMS*OghK`m5DcrDSk%sL@vBWs111$WlS3IbZS;%-!UMOJ>(oj zius1&;6XP=c;!ev0#s-ybG4FG5C_C+d-K5hJJnQF?(a!O%dMtTVXY8UJfsi+6N(`M zqo#w9N>glZ7oC7pQ3h#@0b-?z*O7`)6GCCg0$>q(k5P~ylay4E_u|cP;u|%5g}*;% zXhi^X03yV*;uk8Rj^?D^+w%-YhC5$4!{Y(Kz73%{!Zzf~0mO!i3pawo73re}D(D_X zBH@fL=n4oKgmNpfDEQGzZ7U?vw*;shN6gq{ts$J1T_85FoMthbWw|Nz9)cO~C`5;g z&ho2K<sndN0`kSf434s@XeJ(V_E8bqtXTJw&nCX91Zl1|C_);VGzRiRJiuePfn2RS zLD@s2suO*ri(9A~O^Vt$!<6q};3pt#OAj@LG8|<9p5a7Rs%;gQE&?0}_8XY%3K8yr zOar70G;%<&I8t}u*nd5MJce8Yh`!J}SbBh>6~(awx-EEjOTe?h?1?$I(WW4I&;xv4 zaR7c12W&cV@`_Riwp?KB#M=`|->6{rnd!3Aj6#%z*$!_l$_oV;1%kLX4o$Dnca|WU zKJ+gKKnYq%^t*uPiRqr9!o<ZBD6bn!(Fmcb6EO;$hh8X;&AlPOLKUhe&XQxb9cX`w zq5d>UUTnaZ3zTpe2!ubXmih@HB}^W`aX`s++XSqgXm#S{8-RWXwp`HYM7M|2jZ@%` zY#i>KQe?TD1NROslFTLi9T;_-#->VwS|>!GiV=wJWI+ZPZ=n=H_hxz*^Mn8yig{PD z#^K)OEeg|QI0H;RM1Y|dP&ofoae6n>MG94<h928b!U|MpGDs*90C<w(wE<waG2M(J zqQUf3lGFjw_+&sM!s*8(Pk)pL&4YLFnVKmu06>M9=DEC%fCcFZI#El2Cz1R5q5{5P z0V-K|0|<QIP+}8PKvolSz9A^{Bp}gpO3*oz7p5$J*W4LXR#AXRc!O;P8xikB#|Ol# zGh+l>g%Ef^u2-gnBWWohoSMWhaqr~B(kxH`$M_U7g_cPAEdjm*KOcn-Rv!XFy`HaE z9QRrtFl_>{u?Zl%AV_hC3y)0}^Q%x$aoYvb0)RcWns3z7Q&Ve1bOYy26gPq9CD7!F z3^#yq6BwQ+)Ef+%K!7tCLwGp=;gh5SY#r%qc>sy?Q|pckvrWDZ8K_@LBVt^2*v#)x z(ZUOub<vc{Lvf<iX$vF(DsFKE83dI_);m~pbN<?m>0Iv44dRgnX00$|LV$MxJxolp zd<8a4xG+)Jgh&fQ8GvCV00NEdW}=7j0eJwBa<h~ruox6!PIF<L=I$bn*njhQON%fG zh_4n7W-^`!&#wyr8EGgNfst`I2?VnOuYG|~!QoU^SWqoUt3VSw`LGlb^^{9E*#t6S z4&4ar#|c2ufQti!P7}z5P~%-R1Lq*1t<VVrvKB=CWDaBQBq71h7|faI2vGxRq$h%x z;O%<hhy)%$9PrmjeU$!nng|n&#RANR9^?YPC|y$EISOi~aD`E!rspT4dgYWSk;@m2 zZM-*aH!-Tg2%zCn6yuz}g$C0poEgri$x&Y4<Du7>Wi=7}j2zBhcjAC3VgW=GVH^^8 z9Vg(Kl1jPV<f~(+G9~hu_-v>F{4obxL247#9p)Z|4m#XAfVGEXH+c<(t>Bd#K_Ut& z4`gssC+r2#O{wx-hYTtcV2nqZ95B^Dcjo|zCeRyUPeY-L%wAD~wJI2GRh;l}5)vQH zlnO$Z2jYUVf~`d%if&Q~!j1M}{vxjA1W+v}Gx4~Jkm(D9l-#LN81<A6sr$edt}or0 zymtd=<`BqYOh6RUi<wIVD;7jDkh21!#h&P1;5iBUP4Ywl$oK_J*G!bhn;gjmXMuuP zt|EYURe`u*f_iiSX-ZZ!Fd@1Wz;lA9i8c0+-kr>I`89y&hou1U&AK0l4G{}en_z_h zPzrj2h;n-Zrg*Sk3)JAb8>=FBMSy3oBRoJufN7=94G|_=oB?MdSFOZBII-P++Nhvr zz^qC5`w-Y3K`#757(@L4#Z?!Hvr%p=s#&BEd<(dk8LI=zW2}JYI603yR{3!pVlV-) zwlG#Fh+G1D74^G>qs=iQazg-gi6Q2;g$*EFf#jAHsXLF;dt-q>g@Mu)GO}SYqIZi* z#w;u7WG`WT4DKKdculaqOG-y=h$Rl4MkOhy(s@iRh;SAy9X|qujU1On4Pcui^Z$54 z@S?bJ8P1O6?CQuZ8{WNZ3pefNHCxHwn*f%SkWayr8el^K$7KT0rGP_@+L0ZCTouIW zs2Pb9Hku^RH5?6*A0H9?tx+5;5VFcE6g;l7RXi$zumqf%QDRadfsE<|su~EGHh`=c zxb9@OiX&7tNvJ9{iD0tSZiG-_WD$c)H7p5G81PGMK-N+gG$Ssz8JJw?OQvRIV{|u; zsH8x03F>Vi78U{n!R_J@NLZqDEz}wVfAV%t!5N^k$P+g_q2)wh5g|Vm3Y0Bm0imp7 zXgguMRAh9lEWE{0WG@FJqtss<fn4YwjUn*~ATz%)G>p4uc4Zv(HwG~4vaR4oXAZZK zZwA1Q1_CD~&{P1JfFL8WB3MkM0PiRGQU^hW=K$ACC}4EN4x^YO0Cp32Y=A!jTpfbT zrIZ!)D36IIC2$qoP=FX&Ktx5R9RiS5(WCW*%??53aJXRvNKt$#T}whJ&d9%R2q0B( z-Ug0U=xyK<JtS7tMyVmCwIlV=QrJ?69f9atpe?xry9+cbfvUu(+Tlh;-Ht$QDKnI$ z-oW^Z{vZQn7c@k$GMS14M~frjPW|cSa2PRxy%7cN5Rt#7;d)XIN7WUZC=Y#o@P<X$ z6o!ZoUACKZb9aZvQD1X{?yM8^q63Lmh8h*jsEARIZzO_|&_+dD5}w%vRHFhM9fWf` zNYe;0k)HgR!QI^Ji6(prX}L`ek2w{nreHd^!A^-7-In0#&0w8~`BL^5s1@)Dm1_Z_ z3U>AA(1hq6fo4m9iGG0zv7y|cIfT}DjtJFlw3V7uI3{v&078L`3Nn_uRQt()l_P#} z;O^atI~Jk5GB9Yv>CbF2Klxey^MQHbf(3j?B;=-G3JH6(fFw4c6tRZH7Xr=Lk29bV z`-w9o01_ZYL%3%D;0ghhMFA(qWN!xI{UE^)fsy1|9H<i{qX0GuY80TPq9Z|+5WHm) zBKmD@F$Fl12@#PLN@W!KSO+EpfH}f*ly3$az>{A&C6<%w(g4Mll8YI5g0h(kLT0H= zUV<6e;qu7{cuO%>P?<0lB`egfM12ABBoY%R4agv;dX*M<<D;h2kP{5v1FXmlXNK)^ ze;;6wBY53&yfTC3IhApO?*K&f_`g!0B|ebIL<Iy^`YJebFujKq6RB`U-~b6*B$#q1 zg$QO4J0sY|O5bBZP~udwh>zqE^BR>&KMqZQo#Ycgs5$`Rh!g|ZqZ9@Pk>E_AEs;vT zR}D~t_}QT;f~+h{GQpgUAYwTbVKHc}K+2$xkV%1bf+|WTzLHAVz6RA5$FaU7Nd-U2 z;>v<_x+TEhz(rR>7@|rbZ<ijC93NsgL(mg43iK!wl2nVbzJYTlDJl2j4q!v+3*^y7 zR0(LxXug5VjjQ#;<D)?OnX64#t_}=dx!Q*j=BgdGK;*><08{`U5q<>m@qE(*3W*J@ z7o?yd0LwyaHJ7kJCDwfz{HzctBL_lMJff16v}6&K4zsxBB~hrN1j)DLP>U3}1#08Y zsidM96}4E^fzU^%b`_EcgRc-lc~#(t!BvVN&@j3olM8wck#+={0mhajhOI*A8^LZn zh=5aYT@Qh9agsC;=_Z&re+2j(h>2eV><#cW(8hauE4|?rtH?PpDM_-UA=r-yKLFVv z4!}G?1`^CCKt15?oI)gu0lf!Ml<;qWG6d)`oiILfrSuXZf}$68s)z87P=|sUl+sY1 zyoftAy>$ZF3k7$GVgktn1LEp7v4y?6s0hBY0|mi~(3wEIW=*5t%8C`N`i9OD_@I!9 z4?zZPfhVL~r~^D-PjA%M#3y<PGrLSkSu??EmwPS)y(OqG0K9_By9CTdSQ@^7i8TWC zg(D)z1de7dH}&{j0Nw<&WqN=L3jiFmiugj=27z-?ionUZ@3ugTS)mGh>RFITIzZlt zD6_!Jnahs>O2%|5B|FIzq#NZT5eYrrMi6oo*T^*L14y27yxb@W_$d+ehYTX;6jMh4 z9zkceX9w~rg6zPpI{;WuWIGw=@{@wyi%@zZMhk&mcMPU9P#f?tfc=q}1_-zgkVB~4 zE$Fz1ghcX1ReFg6iN7NjFTDH&^@eOJq$;q8VC<v>Abw&lL4lS+k=qm1Cobg`vj&(M z5mtiG0`5w{WD319g2$=>Ybm;n;4`Ax;ui(VMMzgDNd%NtkQFLw3^+Ll=n_2IMT3l8 zg46P7tt!+^5oE+~dE}fR>A=u9W)4UOR!CHp2@(T<PH<%S>9$0U1()i1Ok~-kvS&WN z7v)3|V-cE6L1tCqRRg^T=$d*$)h^;d{e-nSa-={!$)*Ux+6bca5H}LniBzU*5vDot zpU~5dkPd%PJGhj{H_Gu|pn@tlc1b~h3JQ#0iYl^xf=DEQlWI^?L~_*&KuLg03SQcV z^r{oElH$FZt57D79CO$%kHCsW;3l#nQE;)rl_K<MJKF0DxU`5|kW$;wUBpx+fYkB; zt?(jr@!BNBDk8Y5h_?7eNNys9Amd6G>*QFuR6ITl;5E;M!U<keOTD}rd>9Q<X9Ob0 zUTAVSt_v596#W854k}dD-41*UshU$?J(=X0lE*HvMu5SKU}W(NQ6+B2SyjirnnfTr zBjWE(tzB$V<-2X6$nWJ_rJVqzskpX*<wr|hc+^WNghWN9CMve+!?tW2kV0+kO5s-B zcu>_^6;y>Ka)DcWTIG<#U#8^RPR`B%8!~khpp$Iysz@TA(Gg;*${l{0X#7sceFv$E z7vBi8coS=zTO?Xl39BHlw7r9cW2Lt~umdK$`!1Jp9=YSNQ>Q)m6Mh9}R<Ki8g&Ln# z>=agTI_y;OTBV$IIIvm?PtIqvM{WQv0DRQVZ1&9JdN#{-mRLQAC6+1zh$E~%q7>|E zmRMGSQe0wrx^{_WsU1iWyt5BLsY|xpC8(({EwQZXfkn1AP4+7vaG@Ml3bt1Ov3VDW zn%i6f`HtB6nT?;|Jt8cDl+}TA+29<Or^*t@F1HdAOCV2eEY!fBu<~$zsKW$U1KD1} z0!x8CW%B`HPs`cGqQai4dX%xq?sr(BrD_0wb2$slM%!&HTx`pZdT+!!ac8T)+bvT( z`$}mFE2(l=bqM%U4(sve2wyq{_|hrVM7J(el$D8sUcxd(K`#wsE!-?u?q%P7SI|q< zMleydkDhD0Bumj=Z7abUr?83;|K=iV3g319XyA(1?vFan32UFw6@+K}3PQmbxfO)B zwyz+>YQek27Xjp>_#&XF0H&%RZohlyvn{R;srn<Z-yZnr&P;puZaIsJc`@6!veJfC zewSvs=C7?iP+b_|3IgH+KZ1a`vJY!oKW_sT2q+mW@H>6$bOZv*Z36+x0zYUaARsL8 ztAc<cMbNe|amzl`)~gXRmIb8j4%X`>uwIW#^`f@W`QF(R@OsAt^eD9t*)v$G2PDgx ze;%!arFwt`9_i$|JucPD*DTe$!{zyr7U(0A6)f+<;`Q<dmf5ZYV}mt%8lQk*o``pz zz#6?RuF+FyjjYjI|01;JQ(dE{(3*&Q&Dy+<2nX}UT!pQK3R{UX|L?oUsu91x)BL?0 z>L+BS8(|i@FicmbVPTytGvn{7t{>CIX+&@+CWOn_LaZo@VN+ZO!594K+A_RZjZ4`a z+#)RO(p(|o$~u+~<o$nGKF2)#a_L^EtMQNm!MdW2%lw3ZKdLI1;>k)t0x`(Wp)~yR zJ7Gm3sxUDwA_2v@#x9Ue*Wc+XLE0VRJ*bI=WgbqViiCxSYTW{bJrIVkDAcuxq9}_i zZ(Vpt><vvTxz&tNhKm)MM3GPv(s)KC;O(e&atREdzj2)s*WPeJkgmefB|?1eCa+#b zj{dO;*Aij54xinX@OVs@gXuyeF2%vRD=sFAfsZa!;xjb<{e>)O;){%N#1%VSa;K}I z_(%?~b>>HZC^}kEg#SBn=_Js{l5Xvssz}yWUabrQPa5jGmW7`rtDao>Bx~)+OCDn4 zJ>YNv-qDN%q2`J#zmP6AfhUXLskXC>7fE&o40L&(Br{3>%tOk+JbFhRh}RH{r*th7 zS9hti#b2@(3}S++bF@+ZOH0fC|Cbkb+0Iy3*co6ScJ1oy>g>X|llxB76?DeCIxCti zNz4v9A7w7-WDnx5&Qe!GN>n-<naF(8nZQ9P8MX@}Z&$tMn64xb3`8bLY>*iW0an&` zH8{@H%wiMjE>X}*L1^2cG9bcs#XGx7Fu`;-JGGHl?))l#NhCY{mGeN#sIGM+5$V)G zJzzVVA~qp;2UQ)Zu<6?28H1}usYWj)<RK-}^g1~Z*C{_y1%N2znXV?0Ttg|T)QVcr zgHkAjsTNyBd>BM-A`7TysH;e%57qN5heK4GlOhyO%P$I~IXkJol){15g8D^#j2vnt zwL(Iu!Z<-4Ng?kIe@04_#wVnW5*a+EWxhT&+87QrgC)evUIaZJ1F`9RT)2{%GLnNp z4X>9xXv2DA^h!jPQOdeNEIZ~Duv>}>Cv^d=P(Lek)AeYr3?{0+aHC^wA{(?CC{Lt` zVD+1UJ`8clpe7+t$ci2zvFU1-T%O@X1HDt~*r*&PTW`29A_H+F-B%H(A_+`G#w81D zL~ES|q9yA{0zhJfmg<IDKxl}+xsyPnLbR2BWH_)ls7S+QL{)2(^`+)WMed|pq8pS5 zX(3J-tWL6P30<(7G0N;t@N?A`sO?CPywJJEiVdUQLpmk03)$eDDAooQ5$;UWcFQDj zCI}fgzOI<=>ce+2G_pcTmSHBFsmhdskU$5rL>UVC&XKAMe{$s}>hh4()D#rd$@`IA z9vd)fg3+L%&JI8u16fdt)KLWl+C^%z^r7@w$iVIrQuZjckF`j4<Sv=YT`Gr-N6cf@ zA=pG`VMC!C&R#2xUUQMGL5l<NB9p<Hj;C3M`mc0}ZRE}_-Pz8dArb8;<2Y(50m@NJ zI<Jgm+UB}?b&hnQB8aAFN5d-dl}K(y6j7;AkX7LtlXR_85%63Ec`8YrNl89x+2YvS zy6R>WiOFJs^D613|E8lPuCRCh-sR}ER3L%CsIe}lV4e&WB%`*j5ok@TI>MS9rIKl< z%3);$RfE)#8c6D2+ldC|v_+YUA7ofFAr#dpaf7GWqP683MyFF&#A<(~{X>Z^7QQtd z4z*+|c$2TxxC^bY>k&uKLP{rD8X_9v?CG8m24bG_CqL*dql>a&>-I4$T7Vz@kFK{` zL^TO$z8-R~?U_zv>qb0oIN!mE3_ERpk7*J9iXLPjBbB5}%xd^<x+VlygPl5)%!R~< zF>-vz<@`^5SZ&(ZQFG~ASWeqPy$Uv}yhufXlFQu^HOZbu86VDcuP+PGLY<E>a;1JX zz^Nz2;Y$WuoU;#&{xV9DTACcImfSh&;VVD*Wf_EuZx$u#SABl9TM?t!#>ttgx-wb` zw6!83s8v|CUb;DU1~f5-y>HB3R|bm&GWFyLNg|2R&929t9@JGe#*xgY!~*D1ucg=( zlwb(jl2F2vB2vXtU3DL{VYiG@;0y|xaFMl`q#YYNS!QZfNpqwY>@;Nlgjkb_FBAD8 zN7OwIDjFK1K<Iiz8WUA6j-#j+J%xj7I7Yd^OVV(uCc|0>BfQNB=Z}b5lu8-g>A+4A z&S&f=ia2!*RhS~l<?2|XJ%zSv@dcHa0ZHRVCg>u%tkI)0_5ht6{Kp_-O;#iVz*#%s z&UH~jbXR>CDD~nXXhV&p=AlfP)k}?KQsBIYQ%&O4g+y1ErywDvN+i2EtT;oM(;eas z(U?`uMyvfEJ?~~7e&~@1i3r@JT^K~9zI#UDs42T~swm3Q7?%)DI_P6HKrRpDqJyfj zdvntbYDL|ouMib<C>9HRylN=9&NhUv0*P_q!&tCgG61Q`!USEh^MSg-Yof+;8tm%` zhxOtt@OfC3lPHq%tRoFNHWeLyN$e-i(L|;ULiSn=HFhv;TRL?hAF@Sh))}WrZurBw z8{C;KwZbOq2MS-`$UtcD!iLKGo<=$Y-#oP2aJ>;52&*lcM{v&LYFO-cwZwR3_dq(9 zVO2>lTEvMCKFof|>+ig)MpRv)T`!7!jrHn@^_X_Cg8iroDj6t*j?Gvm=Im#DkLd?& zTwIfdGJrYi77cpu0%>FPE4qNHY$>L8iH}%qGQSgUV9QaPGXw2;=~L~0L@6&aL^QA@ zC-yP}mt01g#<}hTcj>C5Bk4JBp&KeyrN~m0(qV$tPsdYmAc{~SKZOx75|QL%aJ5cq z^$z+O1HGLH6xVr*)*T}&=yc7%iPRp63eyEf`alX}fNIEayi)F9tXAk{jD{;E`{n_8 zjFqS=%R*0U#LZBS?VoJ9xsFhK9BCF^)SF+<bfbYo`v*Vsp*F}<N0q@)do9;TN+}69 z5@|yc+1it8Cqac=2gRsCK$93jtit8D(~U!<)xL+VycBtsT9+lKq~nh7E8qiq(woVv zcKxV_=^uI<O0jlz)K^_uOyib41g+MtMVqx=6{$_$X!X6;e$@FwGe5_Onm3sRT}2K< z<jG3s77cdV!s}I0KXfBowbuaPHG^7ZVWC{3!c#iLu{tI6s1XB3d;lAHK_Md~DWY~Q zoTMM|ZCb(<g=7vvHMG)Qvt$C9Qe&CQyQ*?@?7Y-v>iHc$Tk@d}+0n$B>m;Nw7}#lQ zQ4J#vLwd(Ytk+Q6qYS}rCh6x8TE;g>=n}bAM3?={4LRCAC`#?4Kck`2*S9#?MS=@1 zR@N3&Wrb>A?Ax`U8<6vEZ#Va>0)Gb&XXKzERWoyuN(&JeQWqpCvGFP!H}$CpCnUJL zhU^-wC?dA$jWllyn;Z2&5%syyu*%3pjMgqlJ+7u`^U_GCiq2<rf;I+ixnJ>WfsK4s zEsE2bx12*$iqnxv8F;5LeA(K_hoztcY(c2#2g$Blby|rt4yOK|6SR@3g-anHhLjiN zoS_py>G6dhbzwoe7dx#ztp~aFB&JXu-%H?*00WPGzH3l8llG(iq3_aM%y0y9)x>-k z;Lae9Z)lU;RsF4_lU7*NO=}aNQ$$f1!%Iz_)qn#J^;U+O?FM8WWhl%y1Z_fEYt%=( z8mg#Ks*Z;YdOp^r-4t?VdQ5k+5JCkkaUe0NV}zI)K#ug^P)JFA+@Thne|bNUrSVH= zGa!{8q_}&9R9G7V9me|9j!6m%YmR4|zEf8(P`Oa9s>q$vWY1q_xE_uZ6EdYAI0|^T z`??c7MYt-Ukx(5zz0um`XdHrE<}h8zL~Da=>4JD$$~S!-4XC1y5ftxT&ghAvPomV| z782&LPJiz3Wp%K3qDC&Z*x5@}@fw0@;$oSDND-7`&9V_k0Zw1)Xr%jUJL7F6nK^fL z9Y1nH+{eLz6-4_fIht@&lD66kMCg5NiX=DJ3^iDoshaD#+z)}KZfrsUhB8R#HrFZB z&d5gA90w0=nDVej9D_n2(%A6*lQe%n7(^G$GLmVBNViKn7Uz16c!$f^KgC4RPc_`L z0*Dg@-3TeC{)$Iiyo}qdh=(CW+)u-(rrd&o49w~zg}*e`O_wxPErb_9D0hN96Kcs# zE3Niv72QVnu!mz`$F7qfZF7v1h$-lNB#@i<yn5{frPT)2&}+|VCI@!QbTm2odt;Cz zQW*w*+;T$|ioFm&dK^8@vBSrT5+*WGQ&oM;18p^${Bs{kfZxC}d*}r+<|mq_)OWpb z7@5)sv4RpfWhhps(CQ-B9Z4O%@cap|fYxpfD3-W(!zk5w62;uqmto+#c6NMzAo7zs z*F<GBiWKy2;k`g6@>h>|M(1fur|Y7?VvF$i)U>x$-%8u3!ajukz_RU8mMU&_;-Ip$ z@?0OMQR$w_utid~n=y3y12({DY+;ydL-G--bxSw#aX{3~xJP_Qiu!y%-*n!=NXL4k z(K3HF7~Ayz4z;7|yvI#nxXTF9PjzG=ij-P~2L9U3H7xHGsa<*(A8iw8y$8cXVcS>P zX}y5>(M<gnrm@K1?otoRXe;rfp4=|$>}o%Bgn}hb*p2VZwjBpM3hR<SBH4E6xYVl- zZ<xKgY?P|)Ssr2$(rVGj!>nGdZNJ~v^{E=l(?^f(Tty+d@6HT#$*Ou(r*tgq4_Z^4 zyPJS$c7aW&mN;i&Q)NHP=B`yv8Coye%{ZQ9;vXO?Q%CO`h1~L>X%g=&%V9zX`B3IF z405e$sXv{X%iTqBiI#OS!VZig*`2vztb{{-CdX?s-@`Di`XpBRJ&2W%(@P&Zf;|Jf zb8RU8dYJaI8<T;O@}m2z^ah2{Ga6(P%yf&+;I;Q-pV=AR;>7X6wik}R@O+y>6*K z8{!6~*{^(?wng7+hak>kr=YhzUG=bAP9W@D_l<G^XS@i-wi7r(E-FqMOGn!YBM%+O zy|d%cF%?3#I&JPceCQ|x2!zanQ8f2kIAQ_$WpZ>PBy5qc7j)BEDkv^>tw6(-KJv9s zkFkFB(xT>0BIU8t8I9WU=_DR46y)qHbbiRy3R>x$`tl}<hBQYv@g3Dg8pDd=9^Fgy zMzMfYh`ZSHGk_R}cW0^ZFup5Hz1iXjm7#QW2~>+jaLiCcSy$gy&w<8kChp@Y5BxM2 z{*rqtO5}Sk8X(cnu<%XJd09Gpjca;EjB&Tewe5*O^@heKm7+|Y!I53W;}0~4mUkXJ zgk`T?UC$pn)In|B7vg1fWaHo@Lz@U|ix>ZFyt2SW1a#qrt4GKqkh@>PA`(EGr~&UM zMjytnTFOQyH*KXSb?i_;$2k^ua>!pc{E{DAAIAo&qLVRy@q+Ltt<d>EkrbqA-zEJH zxG)!C2U~SuU>I`rVP~&l$$iu-YLyFb*XuC!{RO95T#|0I%8(UKbxB7d8(InMKe%Zt zrmkAGtX3pTbD}nGHc6T6$m>;zn|0{Z0UE()LoDe&x-*?m2)X+~qNol9sf;{7aiuif zwQ7kh+Fi4@Bw`^dYdeQJq9)rdt@Mvqsx6rvwCfrvQ4XCm=@Q@Gv;|T<P_U&Z5R!)7 zVn^Gd&MtP9T}L|(9ct?!&Eah4^KFOPj$<L#5$vBo+;$Y&9m|?S$roPK3jX(<N86Fr zAx=Ajg3q_NVUmcFhYz)(uWQGmXR_+RUtn~RA5#DL7`Pl}7kZ){r|mC->d>L~!!MGc z<50(oM?2d7ukPM0$c-yK69iB<-Xu~jwbb2~+jiUD9nbhSvm3LqyAkt1s@1)*PZKky zb~pB6*M6Co8HYP!Y$xQ2Zn@jGWOtLzq9}<ikwB?QN@P)2k}Z-lz-x&Y@y;rs$hre4 zpb9`;P#0V?^X&Ki|4CF)-L~gtA9e#sWac^l`ETbxCr_R{A98Q+YtV0>zjyP#*ZN|w z?>zv&QE+&FAA&#__3nKOB*8U=R}{JEz*b(AbOZ&-_HKo>u20w`&0d+{Ug&~ePMh)C zwJf-9Gh{jRWPsS-L7EE+@KV99gH1N@uioy;qa}zTTidb&<;aDFIG5LdfnL+_WI<ks zB`^?r)XR%+{AA#W93T2HbXbPiEYDCA0&zM|c%V-Q*OJr%sz6x*#}IDKZD)lXwU@1> z`{b#k@z^J$aGoqak^&H7nY-Ett6Xwsa|-UaNTg2ZHHMClU%N$riy+9>rpsQ00)uOR zu<S#mkc0NKHsADa)zRI7-rj@p{TTbj{k=V}_V&Ko7mMxldjAK63>dzF_<9wGh&lAC zd-qAc*c-<XZ?Dj^!^P73-n|?^?(=&?7#D;POJ?upKK7@GOwb|mpP>oFUWK?gPLb4y z4ja5*MSx<z_tm~vEytMO`|Mt(zlu>Lxm&?8$VY*_d;RterFam=@finKkp%r^y9wKl z1_bS4q{JGFNFX4(;1ju?(C5;jN)mgc^;5Fi&~5GNU|yWL?kP7J$aE7Jphw|7B)bb# z#fkLM_=o9J@k6Qiq$)m1_pzSsLn2y%ua35YzFBH^Q+y!ZFY)zBI`k=r3c*7Y_MBHe z6DhxsMk?KxG$4*N*km|K$EHN{qzPF~$o+GJ?u8-EP8^^|5q{D4O?RUYc`+zvCp0Np zV^x23e51{f0cWQzcrn$cC*eu4P_Izbp$!m=$nUypK0pRtBxBzi6yppE8>sdskOW`# z{*k@y=tXzPTbkH@+|ItarxzNaBSXKnhxZnHc(e0nFJtb<d*A4b9bkgk8;|`2dt^Zi z<oCtj+>1VwG4@9Mz@EJzdlS(Z-@KQRh=_VUcCh!~^&W^xXrcs)Ap^0-yD5eo*v0oN zO9V92k-*;f;GW($Fk{q<A%ilCp*I(Y$q!AX<r;X@O{xTW5)yPQ()c5{CT!y}<mJQ@ zDOlGGLI#Sxlxc^$R^d95^f~bYF2YI}qExVWOS@Qd)c%_z4HN&8EkJ5pEZ|C!TMnhp z#FN99;wRE?v(7qC4r0$?hBX1IX&+^H?`Jtc<fZg6>6G97G=dJ#WgMvp`Mqi`e00Nj zN2JmN-Pz6C0H9}N_K$vvUogkX8PC2h;;8?Uhyfpz{+h~+#Zw=X^b@miEPnE4{Avpo zgtnmZ$csC^8nfv6=|=`1_cStS%4!x<I3(<dWeP$PPJPVBZdc6->Mj)}%%D(vQJA*x zPEl3thPqN$AnJ<u?j;N>zHtw(`|M)b<RS=EjB@wweVrXG0&{=w-abG6tyhu1zqj{o zNO~PzAtdTIhM4W`6DlN-%0?iY2O|(onSCl!!7;w?>kM1=o484Poq7lKh)@J8G(fK) zI^fo8Kc+&^L1X5i_iZTk8hd}?L(Sy=LMPvCSaJ$WK3`bOL3hiAm?12k8mIyTG)(k4 zunvXS536viO_s`+6~{`$hkRI99Fj@wOP`@N$Iz1}PaH@7dm+aU_qVUdZ=`ScefBwe z&Ed1LlY@Qn3&ZKVeep}_^z9?@k8fX2r%nzIf8H0rJe)p@0{ni6zl=l5wRGy<aQ}(a zrPS3Ahax9qANcA2>+`-7sSAU{*VLLAd$3r-+=x%&56h3m;$!$DpT5g0eX+@G?Bddt zaW6Mau`iZ2=63wT(m4J_|6Sjh$+NC8_m1-DVg<B#sl~DQg$lASAkLnOzdt0kokhn> zGp@G4_75+_KSim#$_4|OEME6B8IJ)`c$<b^Sjidld7PZ@#*X7JhCYbP@2BnuvD{+c zq1w+x#rTEgyg3oi7|-NcEFOO^#Ry|i!-*SJ7ch6f+MHy%)ox&=FFu(Sm8DOXTMG|W z@^p+r4PS#5@3v&%aPW=2UN5^S+_(Gjuk-e2fA2n4h&@E4$A5xIl}f^uQR#n!L`WhL ze#o+yzX$j1MOlWWFpP!vZR8XK2ND=w?0tM6_J~q8ClrIkug0JO2L>o6>DnT|9)sB) zjG7tLpwqbqdzEBQ#^B=RCjvEOc_%#}$8u90mtj852BAcxj1sDAlLoxzp)h(4+c5{% zd)^Cj{Ku|#?XHUU>rfW`9ps>7aFM1I>7sZ8jUJ4hmK*=qLK8oidV6pn{nNoS$>AfX z((j-zPNY9Q{9gR;hd(}Y?{@rD`gZ?dI{8VuANePT-(l&eVjm`sTuXm^DShK-L+SpL z>ERoHe{y)+X(YdMefZ;3!^2kx)BU9Uw+QPKP^D2AG#8H7m*Q!2`{?QT)n;F8dIo{A zbgE&7ZkUs4(|?uU>d%&n@j)|i^z@bZbfb?)pk>+GQr}fmJGF$%KH?;P>4w-?o1sq` zawz%lit$gRn4Fa$EAdfd20QWw-BmMpYR2?~CfDdon|D4s97~%cA00mA-@$vp-WdQ; zigM!D%;FiyOq^&;vkITNNLeg?5_{DJOp_mm8#7+~i9k7+lq-ntyc=K#^Jl6XXAa~D zqXrFX4o%;{kQZF{aS)2Z!A}tF`xwKRB0zwntK<M=uS7L0<j4X;RSXq0Yo7$Ilojsi zsv$y#ztT=Z`<~)RLK0&8aYx2J8{vzvghVg)yU;)wBFZ_yP*ThMCwun3Es9ASgXIih zUcY#q*It-+<wnwQ1!8eAFixvUB>lBKrIWn1b=G#|iUESKMX8`DB2zD%(u8=UEP*QR z2OTn7Qx^*{sw9>f#2nLd7^7obRqFTR@25W<>QDcD`kkBUn|Fr$5z)8q!jZ9CpT`l- z@0?2Y#jjkCA4>P%9KLxc-LE65FP-`P{_vT5!$;#6)5lJw&&T5@hqs=N$IpI#KYixZ z@P+uL;eLpQ=7<BR(a0iFaooSW;>G`G1ZkWB?e)b9Gx2xLiAA%pY))P^Z%eZIFcwc{ zEA_Y0$uszE(QD>yGy{5a!~IXh7qtTY+lg|q-2YvO$IfLd4HUxJOdN$`*+N`6p8)k$ zw+~~J6R~6tG#5?vYCMMDE3x=oaiD1iirJ-79L=x)8V2OC1s0xx_uz+nFbg}hOx%Nz zD~PDkS2EI?m~stmrulXpQmHYzARYJ1R5YR(eNXQ<_j2Iy6Wl?uH<oUdQ>zFwiC_*k z(B(3iL5Q0@30zj->j-oXvH48lRdk}i%vmvXwrmKzUz9!?!7N=eI(_uf-RzK&Add~- zk~>C*tqgV8VOt$A_IaGrk-|X=BxB&wLn+#qvyavX_UxE-ZZnv1XJoOpYq!nV=EwjM z&8a0G34u<XbAhEDHM1v1pfU*AA+x{M`x5ER<zbMPWXq8>Z9we1c{>+EGLQL;LnLSq zt@CSoW$@zvvTrbbBR)8MCw}YRsZUP5ePXch)*aGgND@Ca{LZPNzSw8i;)m1yw<RBp z0C~DO{MqI7nY-zC;-4X+htI?@-rjm9b|d}SB}8=kOziSnMC0b^6LW19^?%hI2NE^@ zzcRWI${N_Q<L1Ot?X&Aw4qwwizlOm|#@rogp;MNKUPZ8?D96ZX2h{B-1k-KPE-C@H zzKEyT^uL|Kc;W6y^KJ4)bTKR$+O;d-4RV(M)SLj#L-ePgluQ~E8~nZDEe}mE_{kM8 zN4TPREXLyunonnpvV6>dUS&g*bkHm!q`wa4P-1n4&9?uVHcuI8Nv*`1a6QJ2d-kFl ze)9mP4G>NH_v}ZwV0ep*``dQ>%f6H2;n!k6@q0J#=NK0QWCZaW&G^5Pu`frt?6EOF zhK`!UWO>460~!PAn7t*GCZfGFXU0H}V0}G~NjwagpTt-K7EpX##B;3d$A49NauJH# zPTXqhQw(WpL3l~%%DqLq>txTud0*QdYj{2~9mKn2j)XNFSx=jkpZw~*3-cJJy4lBJ zoC9DINw9WY8ibCnk%XtV>R#@6Ea!gg59CDika%r45x<%~A4{e`h#h$w<LPAjllbwz zbHn|J^Y}@OTnDblk6_@Dem{QX?f$FpgU$Wad)Ly*Ys1&hr_=om;@FAwe>@|}!^x8j z>hv+CylRq12mE^9LkvKcYPeuujbY$nPTVuoHmc)@>a;l<KYo~Dhe%19Pvg~vzHGCP zM~E>gTg4IkY0*1z3-?oa2$|qb;YX=HDf!1U@!CQh#k94=N6p|E#>C(qJAN33UNr-; zNpqyONY<aeAFt2EKYcHT-{Zdd5Pyu(_ds-H@fh02&yrA)PJ=KJ3RB)aepC(VBlD+0 z0MDv=eb>~eq&Z8x61yf7`&IU(m^j0%mqaS(I?x|-vKDu4c4*6>Mt96Knd^8Bd9UL{ zr-wTc()%#g76HBA`(;kE@%C?@%;)m%lN~jBWEo^|M2)=vi5%JYVlL!$utOuk<n-(N z`y_y4@%?*yIpxfoM@{FLMJBLcf1MBfzGN>U6r_Q}yEV?_ATBkQkP$2zV}f+Qyu%mz zU{PLm-MolKuBU5=*O;Q$4lZlF7Ep?Yvt2Hw^41T~*#JmtyK%kW)b1NeIzj5ifB*FG zdogVB_?6+|^ihO$>`FR~-|P4j@MAIb)$z|HtmB{Izr&B7Ok?8h$qVW9t@O~*!Sv9b z^f82SJa%IE%ctW=zL_5S+3=YdCh8d7==?nMjojOOo1JN46fkW}qwlzD8q0|4mRzxq z`zPYlcp38twlh9dH`zhl7n<y$n#nRmQMP%4@r}Nhn8@1+bqkqyFZNyImH(MS952IK zGC3Is6nK-kG>0|-&Y=%*;k{~H++$)mOvaPGiF_Kz?=PK=#}{kyqyAW2q<kz*E&d^1 za@v@dOYI$zg`VCsoAatk440Cn$b13LeZr<3Z;3@vIHT1UJQ?EESmJf>t8bt>zJxJ^ z#3bSuk$Vt5Ck6>$Vqjxh@6}iLp^N0W;`Kd#ZzpaDb)IH3r-b*D9?bmSZ{UzjbOf>& z5)jxj^T9zgZx!SFHn9~kR?+?9Nybm0>tmdj=G`A=_fXpJ{nx^h-8siP=>L)a#vXYb z0u`VcblL|#j1_(*VsS(Z-S)ZwBr}VlhJITVZa>=#N?@;#*=_0e(1N2EdFmz2Lht`L zstIDXrPqSsT7d;oD8LUya^S8#J*Y(jX9uYVnhFObav5QVZ^gBwqd%mV`FQ-0Jnq1+ z9TCa&HWTBi_xSky(BasTL$TP=buEUYt3!w5M-Gb~7{=SC#mAsW-=kvjcaQV;xQf+B zm|gF_$27ei{>o9%9F4t)(F5iL$p^X22DiuG#l$!h`E%-&mAnxrC~^F-21DmjJnYH( z@&EBCC84u!_Tj*i#1Dxm`6U<KR08?NVz`NfKfV@w2ckrdCPSO!ppG5Glwmz974YtH z5N?afv?JUgrNIC*l_;lO5F-I<OTQdD$iO{_py8~$C(GY3pk@%oV+Rf%M3P>$pN=17 zq>+;Jq9b{-?l=p{FMTfaY8VgjHmMujZTbODC2;+Pq;T{B_F(Ah^JX5>eM}ZDIVfFQ zBGz6HMQzqEns3B)M%b>AV)-DvbXd!wa)URI<c(kG*IolpTITbq`Ua6q3c2y)a);nK z3<uEcpfz5D*~H*JH5iTmav(w(i7+dY$BI`I>05+C2tK$B6*#QXXk`Os-0L}KxuG6p z>ol|GiB_Vfj=J<-qOOyUYZoobkPFZ8OBhP5T}vPqcO{S#V5pP6>1bkLE>A>1_ui%% za*^VNYHcw-3BD|f+e(VZFq<t-)q5TKH6+a5rxpwvoi?=~6pf-am?7oF-#BovxA#r9 zI!=fZdyNb5Yi}Hgy@lQvH*H-a0a-yUuT`q_Kl+ym>_AwS!4cGcFlDPQ)Oyy|t+Hee z85*!+<q4LC9^7N~RUc7n7O;a(RugR_Cx*CO-6?Y2Lole!WlnsIsy3?;NP_aHTsw-; zNF+16c#W~AEG5uDj|qr1%c(`MPEo3W0VEq+Afraep^?rjOMB*wMerCgSe(XEw1fRD z_#6A+h0;X@=CbBFObLR!J@Q#wizrlUyy+K)P-}fvwS7g7;AW*tV1D_%)0`l%HbA!Y zr=l6#BxN&#^io03sVxk8SA0(@orw&<=EqN;4(^Vv^C(ekUF%JHL2}}SniB@l*Ixdl zk;GnY^>*-HDOgb?>S-2?k@43Wz>r$i<9rB+-h-5)w+|c%y{@&b*Ajy`Q+=7EPsQne zX^fJx_6HL+5d)@d`*bK>Ad8wrh@JK#7adA6fb6}P2ti5SjWLlAh})_GTBS;<VyXy( z7>`6$d3JL_y-TMq7TF^h#~Ma_t$*qyS6{W<%B0Jwu|l`B3MDeNCMlMkt0Yl6J6@3^ zy&l_{NP?0`AhSRd3YH4stcnD)7Ly>8N)+>u$yI5RK-`{fLD=({Va2XOm9a}MB%OKc z6PT#YQhLqy!mt>~cu`jkA%wM}3qR=V&Np9s?G5+<B!NM)V45cf_WQ4O?WbYj(S={o zP!p{W?bk&Z6YW%|3L@uV1_{r&#W`z@j!shSTF{4(gbud154IWT-8MODE}K5cENVyx zD0cj%eGgUAevWNg-6E^Ug@tHgnJEvPFiy4RwXyRG6I?;55u;hx62rfAHKR!v=&NF) z8!h5G2)(+>GfI>LD_+4#hadZJK_W;O9|m$%<+UaCs3GYp*dSFL;#Is4VbDe=6tr_g zGDCnfWb%O+y&05KajL{VZA6rkMgvB#Ey4AKJc9n)HdQ)MyEA#rOnxHDLL6{z8$U9F z+N5jPhA2%VIF4?meNn@ac#-RrMHg`nqbqpO)2?!4>yl%wM^T-GY<uL*F!&|0n2dy( z<tT|%j`bgkadjunR$APf@m%Cfntl4C|1_YCG`#I%bE`3Vv63lRAMdySA_#@Fd6HEq zXeX;e`h|{1LrklkkqnMf8(gl=%4QeA+F3U<sv`(p&Z2QhA;IdxF14iHa5R$Wed!~> zo_?||Pc)*E^dj+>GzyiDkDag8_-3-kEwUKIK~2ho2H}DrW-lj!!Sd2X+E34DruG2Z z*{dX!(Q!|Expf;IWl%m?rA>Ae%hA!gNEV8=!d4{)gm$5@NQT`~*w&eL@?eG!J0b4d z9Wc&hD7JR((YRvUVw-Pc)Dg|n$7vW_*ccg684Y9+LGCC8?@A6^F0F4bw+!r4eaL{- zX;szsqH7z#heh>rg%f*5ab&Mu44M%Wf{?)?6jBCX#_4Z~Lh=)cR2uy1*CtaHw%JE+ zHf)C@#VJ$kOsZuqd}Va0EsZTe`WcNU)vUe3K-j3Q73}PoFX&C#Ql+#GAs~y^>i{CS z)Uc&!C__9y5)axSSoP~~HKe-e!nF)_9j#=i5?sNwBW&Ng2QswDNp#3xMbNGMTLbz* zF9$(zv$8F0A1VclhiqRJT&vk*Nw3Gs3jU=j_~$QPZnW~*(aWILRwH~(!Pc=B6)K7C zn5Qz0pjX$hgYAq$b(<aWz*)8*LKAEQ7wk3G4(ur`Xy#g28!f|_fhJci`m>9a>=bll zO5-Hg3;wf!3XlSuc9djbFD_DP!is()JDNwossxmfp)Oo0!Ng0P@S`%TqDW9la6Jkc z+^x`sQsuVCW)BxE;G`mAs93JNT?n=d1FWWci?cSAl@dCN(?JZi#O<$|B?@T-&^yv> zlo1ozv&uL{*PL5ts6X1?w>>3o;kDAPzz-q;16wg$><ezczA&R@`!?`p<u>iLTf8V2 zJi3iafrt2p7Yu|8PU#+XBI}j6d^+f6Fp1j(tO{bD(PWp^l9_sz-jmv4c^yRrf4M{l zpr@sukkjtYm`qY>Si*&km|qPp9eAv}=ul4v4e9_~G*T$GeUB?PvBhv?i!VjW9f2Ox zB94eOFSwc_ffXsWW1AHQPO1ogwE<D>b@wVpu2~YY+CXieN0aPulqIMvw*X+G*Ht=! zYID<0l>M|QB~rypa3wjD8C=t)`N6!9m}RTbK1^klkRd2(xvt_QcV0x>E@#~^I&ELU zuBnbB)`LN~XwZ@Y5~P;dUuuul{vS?pvQ~r)m#MpiBLoFEUpQnlR?ZX}j7lYmF{P%9 zm9SpTQ`Li77Ww2L6(v@obZ{YIth%@f46u<58m3WL5Js#`jvTctt68c^d(XgXRfgKG z)w%p-o!-nzS-6wFC24R6tWnPDB~MX?;-zF=jMs@V&7`h!ffT}~HWaxa#KD((>g~9= zMSDU4wTSX4LlfxEcCW&T9ia=N_|YnphG=1#RF1Zz3Y3vXo{$8d3WkETlA{k;s(zFb z?DJS(?N!aeb;Mc_^dWM}s%5KQyV2F_DZQg%VlNHST_~tmEw&?R>L9)oy{UkWbaqnE znvqWZ+5jb11*1gw($Sz$5DsgdkcN)lg^-pFLEDF10g$3qDYoh`!L|QD1}&%v3dkLm zoJz0SQhc<iil0D<;2D9WLp#e^6b+n5H%KICZ>Iva>lJ^X>C>0CJF%BDZ8*F@!k@_P zQq5RvI?i~MoW9e3Az0BXM%Y_r&iAldf(7jCN~Aqea@z~!4TTh1Eu&t>1|4Uxw^heO zovNq?OvHAVOF`&5eyF^*A?@-hO~Zo48Qb!uLfYG4hYGiUnut946H4-H-#YMyo~lUW zLWa!Bla0y~*-#zR-PR_#iXs!LXw<X~FmlynGJQ?Gcuz-q;bz?sj6Xy0iu8nRLZA?C z<jC-3gSPih!EBze(>30rp77)kFSP5rO_`HHvd{;eO%QaHqKb*utO2QSxzM8o;}=EQ zg4v2JTe_W5PuB+%Ai=d&OtA9=wk(@Q&@X87WQum?1|Ff*P#pgqBOl$tYU#zr$y5Oz zQ9tUXO?(Ja<PgNh>Zj#0yw~v!FF&Fb#?AtDP->9zD-3lGjy{&QEw)Htu0<1@w3wu$ zOMABq<!QgRczfxyJ*2I~U|c{+8r$T=IN-BWsx3;`c}tu&k;#bHi3w)X;NTy0q|Dm5 z*;b3~fZ3F6G2ttHij`pRJ>}^P#I`SzbQRgt_f~Uiz|9&=|1mUz@ROElP$X#L?Y}pm z<4M`HvqLx(n;A*c1emG!Nem;7B!bJ1WN1)A3wCx!?se6EmJe=s2;^KFgb8Wz?~P5l zI@&vLC<sn;^&<~+>2Zx8HYN%R=CUY*=h|02L**$|zgkU9qN}*sV36jrHg_ES%L_<& z;g{aQ@|6aL^fro4+j86OtO1>WP?<V%)|%;}WL_k=R8x+1$3xLZJI!D`B^Ajq3YzBH z@Q}8vh15=ZLHp2<4rXqk7G(0H!w33Gs!WHT?6R~a(`Txq=4dx1HnQ}(D_^@WkYpJ` zs3ppR%Cc)w8(@!!l+INQ(au2!5dUBKv;NbjWBNg=aZBC}qe^GYqS-QXaQE)FKAJQp z<~XY<)A2*c8J;&Cv8c1Uth<^S#{qKRmA4}C-AEZM?Fb!hIo&6X>2;hXl-ut(BPiD! zb(T=B*NHAmxxF}FUv9}fm5oN7zKaJOl>Ok9mjNOeaGZ%z;V=pg@4x&qCBOg5E30^o zlIa+TMkh+xfe4R1nfxffj)W6E?BiuCa}CpR5mXbV+ck#z++ukqHB6|v!o%of-#R0f z3=1D=nysI__13CM{H5c({94|ai9Nm(x?VHgg9lzh(oNU=^FidD!ZvEmCkOf#f9g2< zmK*$q{!&<ePdLu5GPGn0RJ!?!?}Yc&pJ{VG{nlHHF=w|wcz~jA;?<>zzl@4ZEzv!5 z(0R#uEAN{PNT{BOf?e_vg+s$+S;VWP_QLPx2aXd(g_(h<>x7bZ6Zv5@>Nz2B{xTef ztf&)(%BT(pUU$Ctisx)RVhqYIBh`1dGX15Nq~MjqCs8;YUD{;+N(!e<Z`5}>qA!~t zwwxz!7$k$<K{Be>n43+f^E!$~TTb{T_uM0ThMRu}R!6G7*@Bu_GAr*p&c#Bb>^oiA zx$is9O2a(!-mPVGGwSTaLZKHO=S=l7G=#Emz{38IJ?Fpq@VMjb#yLWW^%-^EJP(R8 zQpmCKgJ?ACmTuJldtrW|&@lU9<F1d+n)h#lu@l7$msZ}7Iu~Y;!xHl-jaTHsw6fU` zMcz6`cI)-7n6UR#*ZInX$bgB7sDtB#;~X>QG_<Rk?cPc$8r|)iYa)Q0M<m+tRxj9f z(==Xmc3Bmf*{`7}ze}e111I_+A_Q@nL@**$-f)}`TV@NmzKFmu2FZx?4We+;ao+UJ z<1r_ChBhm!(e(;1n5QQGmUXpc-2_$P!eqk<jWo<-2q)G%oS2A4&-&)~-jHwr^A#!t zc{PzL(x|N@Gh%QI^WXQJ$oC#lTk@s0QD?<7;n{--H<X4EOx^(Hmg%K4(Dnj$ERKeO z-$%5aGhd?j@4}cUs#JANpeA11{o0RTo@koKGpLc>Z(;M<D}dc^?{}i`uLuA?q*nv~ zLO%##Xhdl<H3pRQD(pp_Q)MKpgO{Kpd!1be;0q+FG3sM<04Ja|3=yp@yY)UUo2Sqz zo)iJ1v_`~{74vV-M4h|FyvT4k?Kp8`yuXuh2tpQ)r-Rois*$YfF1e;Nvj-}5`S1m+ zoxLcG*l=3;2Fgl6u#O?5AIhSe3Do(bi<iu=4xXEH&Gd^=bPI1tEy7$Nwr1h^<f^-T zd#-7|eG!rBp{8DT%`n`R%<Mrfw9*2BpJ5gfL}mWs*eY(kOGRUboapW?P(A9L^^hB- z>R$op8{ixTXUV}%c;x-)6T^n}n>DCY%Wl1&mrUq%)7kh^9R;L&@ty8yf}UZQHrzC! zfriroXZ{eqGm?Ifabf!g>*zIoDF9a{2^}1-AShl!v7|A0&9>8(5FOA(51{kvilV{Z zL{Il@63MjmB)sto{PIB{0UhQekqlk0wVa-QtX|}m(Kj1WCupT6{g+fWiwn*n-}yHe z&f|h$%nGiG&Syt)AtHHHS_V3&=J(k}u{>T4=0wr<aGb?28kuq71ayQ02E3`x86ot{ zmO~70I2e@!n1<7(88GDz>7(fSHwpvNXV&|-V!9ghGgC8-RTHVrExV?pGFNF-O%Jb} zW^S(GnMh@B`HtyuSLP}{z<ZJE+)9u?KhOLc6C#Uql@HhT_W$n>flwv(6;*sq6W_1o z4Lu>RbmA+Vf)_l=tD5*~rq)moGxeoTzPzmo@1|<<-B$X_C%#weF)bGq$GfPc1kWji zFMKk52b7l3cRHbrPzg;6FPDnov<B)<W=JVR^`Jw@z8=bzw{CT?1m6wCS4;6E#S>_$ z?CKzLhrULl^<NP~#<X{1ke7lb2IMZ@W##j|QdE?R=*zy0eTCOh6Zyfbs5+1hfngHW z<c(eOda7#hx-Wg9m3>PUsDhV&QC+?@Oub=-TK23pgdh@@Fov%M6PsG#E*_&RBtu@w zMG9<wsxCEvVvV6~_zeuwqo7_{H)Ktr5Gan6H;V<f&}zP$3&r^IF}~Exqh&swfWj@= z>+8BiM2d|3)GXF4cMO%wbBpEBoR7^d`*Wsj<~qxBNM(v&j^NOn+a@Xa;fFtSP0$&k z=wu2gJG2m!4NmzRCKpL>l($I1pty%zPm23swMiKZqb5bNylkq9E0hKbdf*O$_;{)s z%R;;=<(Iqkhy^I3E_>QRasFHcq%{#h3KyxOqCeNAJeUfRVDAchpZPAi;)4TnqQdI0 zzyMQjiZ51?PQUo&@Epj*c~Xd~7$#cR%(X;vitmnGX@*)ivE`b3nyqF?Y6Wej6e*X= zeyO8e;*Q30--TaEH|3r=<nZg4JMmivO$f)`rLxdS?Uj0v!Mw6-`GG5l4EdIk7%FcC zJxP!*d$0+Y%3f&;*f4cY@;uVvNSLc&a(PS?U^4TBF@4f3K|Px`=assJs$8N=OW@zZ zEVsOoMfgQ+m!1(G)S#VOvUV773$YmG`cT;~ZGl!S$1lZ(OAsS989{O1vKHkH#Zju} z&_#Y}tEfw*LBnhWR^Vz>5d<3gi(w<e5m%t1qUERMK(%a_2Zt7waOpd!h^PU}PVp!j z0QRWr4XH-6fp4?vH$u%;qXUNxzv<zG8xtE1ui0ryOf%eQ)*BH}F}sef)iC(Q+cdF- znoV-hOs}y)S>xPobhpKHQ3R8Ec)&wSAp=Tb*)5tZXN^Xyq4C#|f@Az*LmUw<7yZ)X z<zlH=!ndrOR|*wdk}ApNqU6BzqE|A-P9~O@N*ySKgpKfzEsn@5!flA?VhHiqDaG7U zxCn6@rBn&|5GYbjku|Xe2`J8A$Z<>CD2<%0G7Q&n5j=aC!TQnjq7fx~NJ<U-QYUv1 zyNT9-7*>KG%6g@3EQw^YEpcCNls1SE9($#(GN@?`R0a)r$+-_}5m^w0cmc0xP=scP zK&0?Uk{YE5_GpIC8il~Ug9@Oj6vI@F?hKW^BH2ijfvSPyaez|bgRfV5T=qN{x8lOn zF;s8V{f1kQH0lk%9_C2|NeHjH!G`!jieGO@s^9RG#2~Q~WDOzdz!4I9c+M}Pq~3)j zVTl8NnvEx9PYQhW+fpWw(rr_lR0O=j)Mlg7^4FvMh7ZQ!hV*lhRIyYmqD?Yl;42@; ztzr+3XK^;`6}K{(PQ)+LipVt#osx^a3(w8^DAc7?ezAiGEt}meZeU%^vb-<khBeA_ zN$DX!WJ3(&b#|6STPaA{QHP=kVi<!h#4tyBp+{nr7E9<MiV<*e5eLkqC9|T02Y%Z` z2y79#l<gNc;TPXon#G2I(qaov&~#V;L{?anHqt@X)Q%Fgf`wvtw^h_HZK7tgqA(b; zkwE}`#GoTvddq+f)#jeM(vQA4NtL8Q5{)(W9Q8wV;bK$|)eu~@dd<VpGB&U7*ShL8 zq|_R9Q;T3vA`i!ndKZ%GbxB}mr_i;K-NYG6ArG0P!q=}q$%Npe2X$}>*B}FtBs6Ve zQw!H?t$GhqNm}>ocoBGAf~k9mAu@~VG_&EN>|pn7=X`CRiQ(B|3svmn&}TmUfm1jV z8;gXH+{qZ5txF1X%&ZX#h6=n}oNX2#hX|pfFp(AlE3)7|GBZ2N+VP4V%&o{_HxKb8 zS+%&KUED3I1eMYd+R*H()ngWVbdh#O3N{fY#TjaEWP=41RHt1{t3CsfhO0(s4wPEc z9jY8>J}d}flN{>f7Gay126H7<{Xr8%Z(-=`F}OiX8MTbmLRBAIxfWTPT+G$tIId&! zYOPvmh$G8zYNj>Yv1t6FH`@ib%*;ajNX0BSW<xU`Hg~pz$t^iFGpGS1g=UtpwPp?W zO(j4nlw}r6t=hd0l0_WXv5^Jyd~7v)%(U7pOL4QTs&c4>TrddFN_kf#kaJaz$eSui zHZ@V!Dq57LG)gBW+NVe+b65;rAufc56HZnA)krms+tAQ?cQvxIigUPa)vs<|t*)-F ztgcqEt2S3V9y))$;;lYj)r9Jxa|gs#ceR80Efn%l$YAecYk}!1QjD-`3QJOKBr$UE z>w>&48C@%qS{3o+RF~3bwUd-mQ=y^eOh*%wj`f-D1yi40G>iTWLSrT}J5z9R)WYV^ zbQET0unWzuU|Z$s>}&&vwHbq751T);35lSRALg+%i+D3#EIl(@7p6E>GH@=`l&;WX z)@&0gETJ;N85$tsXF6D*f{YcG#Yv$l^yE-i`a)$U0{QMt12tEeL<W^o#aJ9A{Mo8< zYLbMKspX2=Mv<+VaDjbZ%3m?d8&lDbF~gc$Sy^6Q2`&5Byp_m<=*Rwwzr1lJ9(7VH z%gFRsHX(6k_SP)VJdmwgav%92B!-q<*?N|dKq8)!Uv*_8Pw~a(Et{1N9<#U$1^g9v zCA_S+1gTcxnIh&OT7|-bSuCvj#g;MdqN#egju*^~SLm536lU_+`~pI}(8<FY7sotr zz^f!<E#^HWw6M8_7Lxoz2TOXvP7C;j$V|afh4N&fQVg7&pJ}#<k<|r4FsMR=2Yz8{ zAS~U2SJ;S5YJx9yffSxmgQoE0o;pYtXlE8Bxtj$<5D6lA@|5^Os(fZ@D2DnLV=SwD z9c5RrRgq_eC5`MsX<_Ffk@{H&7|}AnT40|R8CqWQm$wc%50(!*Bg@MlInD>mOPGv( zVwT76FAsn3;>+0Wi#o5n%m3|cwAXoSX=xdgea`GY$9e7HOT){{nE(9Y$Py@D0p-F^ zqfT#q*<Z$s$(JKb%gg?f!Eqg%rgbbW<F)KK^#T%PpzE{*OkKwLico}?q_O@=DnFgi zPZw6vMVVrL!Bh%WGmGi5xdqIvdZyIKqXFgpX&?Jqz5~PsPm)4R!q!zFhk`fV%5NpB ze1SjH1?;Co(_X$)j$E)X`EUUVn<SSsd2l9ogRDqldb(zh@+?NCD1_($MHguCb@M&K z9qd(!O(G{h&1^5fq0QL^zdV$KKx*mb4a!m!H73gzf5CnW)g(`<Gu<Q$N>bItIvi4u zX5Qp`aEz?{w3~mH$)X}kN*dWn0(kkN{<N6a5}5`Jtn*-*=oWz(9|lnxWU8K;xB(hL zNu)#b=?GZ+`EIpbMo@0$HwU9<&PD%ve(6;7^Us_sr=o8?xLD?K^va;)eEhOAoru0U zg7?<{ej-}h?PMz_oi~Rsl@iXIBZJYql~d094_=Dq2BSiHCHm3yoeExjU*We~c8H`3 z0!-g|ztpIhrEmpFp`{iHmPpf*Gaq{oga-Q#=J-f%;?z{aOBK*aoc;EYcsTF1N)1!Z z&zpt(swvKy+Vs3xnO-%sa6(QzL4SJFA#AW4zZ>(@IjNsqPU8^%1Fb*(75YueFae+7 zn`c3PdV@`2xu;2|5|m2va(Q?98*&6bNGCU(=45AOQXPga11C(jR05Gaoo|VPOfb`3 z!UgfJ!MtHw`AswOV2d;#sB9P);K*|vL5_<wwU+x1n&Ia+<WwnIxkWkKgcitMFbz+` zC{YKtvIGR;0FH8T7J&)=bPtlmCJ*vLP*?Tvs4QuH5r=d?zbOzXx*6!)DFRJ?8ySmV zlw=xRTR2tm7bBHH3`Bl+x>DKa#E&>fUv&zV#mc@Yj^Di>J->LynNCGdEh25P^8G!N z?>J{bIOA7-J>{IL+;{FQzUmY!XQDR;o%4&Qqto}J&arG|QRypqaE>hmF)sEUWa8U| zaAnb}bT3wr#>6fyL46jHfuRPrZ7g6(cvulOWa+LI2;sDoT=dp)C^zlrLi4WqvX79Q z&(+P$oT=vK%wi7FnVa@<p=>i3nr>mM;n>TCv(v65b}(Xi2nJx%#nW82m2-2*$xhdE zJxIyoGhG1zPqU=R;gIy9=~ZmxTSo!V`MK~k_)|u=rQ}&7hk8Y(pX~%Msw;xMTtv!r zFl{y02^#LnxvdxkWuf%6$%b>3l%*t)S8)hwG=xkVES<~Jjx6jEn;_LH?&S<pLEI8W z=nP*>qdDl7o=z<;EG{hEcZSY6?<_9-*g17!Aidkk`-@NS#_{FUz3A<QlTPlQ^AYG4 z7w$zpr}KMryPbl+`1O0vhYR<kcNTX$vkRxAckV^+kaTevPZUQM7Z=<`3{4hL%P8k9 zh89{l3ol~Vxqw_`Gh;y$8_4$;eM{Fv0)ASgSwta}mn#3pP&SvzW}7a4>Sli4)bWI< zP%_QgvRTODf|$)_D%nt`iOtJ~;P(zt@-Wj_f5_Y}=47+gc6zRwjbw7UR(6Br@TUbH zUbZJg!b~=|BBzfrFeHV#WLC%^2mTT4uw~jDpU8l&O)MpRaHvC@WmPa!&qi|DjE_3b zxX8kWBrm%~HDGa+Z;~}M1}W-UG-tlGsDX0ApqUM4XfaA)2lGe-Pv9gZmcSZtp-nZA z@+L0j&i}@}=&ku(&cOT!(f;g%RKN4nsr$1ZILC7jSo!lOolM$!bJCmtt^Gfqo1g!w zbNhG{6f;b`>)f6{?tC(}%Nb{!oNzLC@6R1{?l$Ig^Pz<?Y%OdxY)x$Q^Ek5um`r9W zGi?^8rZPp-z|s!4Zt^+Yf0WJq)Cz`z8H8<S!&D{<3T%FM%T#7+3P)L%obs3_IoYXJ zCX&re`I!!6WxY(t6m}?&lu*`8nM?>2p{b^1Ou3mZ7RzLO<ZPaTf5;a<k^mt#fysX6 zNuIYUkVFxFW;1szLyf%5HXg|-lBpp`IxWu#XrKtTFiAI&R9I%9ifRXbAl3|&rs+MP z5vD#0QkrF-#VHL73)vKyXC7CPLaugo<Cu2&nJzWP&HP$hVR91Q(2~b=DcF-=Cl5sc zJrg(rX>=8BL=g~5DIB#j;f#2;C7wlJ5=rri$HqI+n{(-?GhROCJCP5HhkfUFGIK{U zME-y|A3K@i>(TFF(mwy<b<Cy@MGq8@Aaknty7S%J(VOMs5#M?8`Wy~HJ9P$6d4CFG zeDE}*+?vDGKOUp-VGL&e`Fuqm>=^r~Mzf7P<dLUCLebRcMR;<A2PKvnp2ReTOdrwU zk;feJ@o>oA54WbCoSedkKhttFmCH;`HmABLr<gkBPezdCPkK|KNp~uO6mJq0J?T&N zkb*Scq(LV9hhij<B64n~Hj$_O`Y1@+$EB1C<DrKVox-Y#BQxbrZdS%xwmH>7DtD?& z1$t9W5N%+ZeEq2o3TRGZr<#&UXtFL!!4CPf$YsiEWkA4fvvOeZNy!RNK^xQFaB9R_ zL*XQDfhj4duX2NUX81H+vV0-YGw~t_8!(DqgD+u-XtL&FPhBh;(aCD3Og^FF@fe5C zg#6Nmd~O!=;Dub#FK@sv=Ed;@05zH`=rf;Y`H2EZ%BAUoWPudHgBkd3B%PhkbE2JP z%A9{M)#Yg#ADHnGSqYEx@F)WO@H`82_`0R1n4w>L#PVc`2XV;p%U_Z`GnpfMq~bXk zvn9sDsR@6wHUW1}L?$ODJsffKClE3d9**HqIqyL3xJM!s@R8&SiJ9CoF+MSg%n9r# zB&Q1rIAmFWqKoBNW<6UMe8!PxCcsvuQlckhEaguM6GR^*8KE?jEi2JXgvMF6hXPq% zOVlLW2U#Z*+uT&JTBp`%O6NEW`;#3LIB+Mr<P@dQ2qy61FOt<C5J?g>la?!4WSkaL z7izcOiL{W+#X_>Dj><F4GU0LjP$w2e3RUW+A`=rFC=cP;i(7n5Cg^37o<CL0it~Aw zJiL)3KCZEkY>=vR=A~}Za_(M8wFn;Ia%P@M4N2B=O(}1RP5V#?&y?_SOL$bp1D&$R z^B_DE!V?CMR5}SX)EW;>_~UTh_{56tym5b`HQvRPaU4W&0E@@X#A-mMNq$grLepCy zF^DWPz6k}TG=3~^pL`~oq?`x@)dL3O6V-7>pOoPqVnY*+af4r1nXjW=8Sf+|IFlwc zF^_FoshH$y_Beuy{Kk<0TX;|#N5#ldQ|Lq&En<B@)eNc>e4h|fOOHbM_+p>|Ly`+! zb(}Lj9YdJ#&S1hHbH~LwY#t`NG1bm_@RivJc9=58!vZC!V9yN`%SEPRlDU|}a{*4Z zONw4IQr=j2bj%-Zj)g}3vDT<7dovyx9Yd-+hCR~FXh_aT6B!>H^@M5@j_?^D!w)%x zN5}oKE)*Oc9S@DWdhU%j$Yi`Zwsl-dSwe`sv5mq3>0}Td8}~$>2YK$;X7WXrWe-=3 zbwC{WQYUDDBWe}qNvAOKacagM7nQ&gLRi=xGvjrz^v1e`7ZSWt-xjgvSCIrpuoRY| zz-R|bqeKWQ^{^DqtdFR~XdPr8%Ctn87UYJ;8>FORW0q3AwhC?$6rpEZ@QF;Uc!f^R z8Df&ShdWO5wJ^ztM9dQU?Kwc1k0ceQKMR-^Hj*b)cIr`Qs8LF$NJ+za=<fE!A?B~i z(v@k*P8`k1T&K$^M3ofC6cPT6&_EfP4K>OMEHJB%U(9ez*lbLVjgE|sjEs$q_@f(f z1ha95lTJBgHJH&YBx3sL$mqz3J8DKe#1S^^pJpQRMzNDGNZ@2pg+^MSG~B?$fM*9q zaff_ww2RVs{umhJ2<{eL{Lv?vL79+-FGc&KJt|~mtOj09)&vqG$ZtSL?8lmr=#Oro z8p5zOx*_0!YVDD9<k3!QDq14yMqo%M#EpPyXsin6-sqQc2C0-NdP#xNv90z@GoW)5 z)HIYXp^2MCv^ax4>{gkOPFrCQY3rlUkhicBF;s?@vV^rjZ65VUw^9Z1ii$?>5g9`D zVbWVBN-^n&(Bgz6Cb4CP(k*oJ6ko6K7_#jNQb59abd$%-d%l5v!=Ae&lp^?L5f_;* z=e$uQ%-K{-oMYpJKF=_R&1qF7uB&(@x1w#2w8ugl7Vrp{k8!!uzlGaAKAj5<t;>}` zmCe<%|4{BPE}QzVD*N-Ce_pE;APdcEwQ=AdQ$5u(;rdN45xR0v$R<tb1%KzF372PF z{>+%recVn~J6&T|CuWSbKhRQbNV#T1^IY;uac<&1fGsb<H<PAg=Z}80vuPp=$>}C$ z&F+C+>fWr0+|S(i%*MrYi9~Y1pH1MY-xqvpZF5azG<mgUzOit5^j@+tb2)K-+?d4+ zV`kyPxLLe3dM|Nl(U=Dp5{bEsfy@_F=H0|q$Q&7h%#p#O*|sZ_xjzU461Q5WI%CQg z#Sm6i>ZXY_3zcE5&Nb2369tGaCliT_xkO^}a$>~HCDO8$lgaa!l1X<yakX&IipIj) zojot?{Lv40zOZwrZ#wJAyGg8a-TW|dKAAQKyF|KV!n@A+_k9z2nDAZmweqF0WMa`Q z!+>eCcw;Pq6HuPJG-5ijPZU-()>1Xok#VBeP%!440eYqJ17~>IL`I^=zNq$Z-AER& zPJE$a=8_j1<~q(+l9&8)a@drieK~o>H<uHO#l*$(d2w0RY=qK3`r#|z{qsM8-cOER zG8f^f>13sLIc;)@N_8MzHl4fA#{POYmgZj_Y(ekj)zuq!&FY*P9w5ur8~02$QK?@Z zG+o(5tDJ1HfzY=#vvC3o<9&i7sQ8fMyjeFr&F=%1v2r_SwQtAJzxX_XH-I#g=b<og z0oUP{W-?JNCx*>DyvRLF%C|m8t+f4)aQ#u&%isO8KN0=UrQM-q)7-|w`G<q%_C4<A zOy{mM@gM9)FkBge{&Pv+3=iQ?W*^)ffFzs@8kk^4p#QDJ?dyrE)qkjFo`C*N$y~!K z^xB@+8peC$Ld$gS|6bHt@XfD}>~W$4STg<c>g<n!RT=(U=X;;Qd4GE$;k<$+?0*k@ zPiEnfj>0v+J&`=;88=DSAu_HcN~WGX@3ML(8DLDjoB;fwax*dDU$V7ic6Pk5^SgiU z?KI}8S;W-&MAlqKMLirc*I~-Y&^(Mh8~^KFEfX0&FVS^TtbCZrPhRxP7opvd_yfjv z-ME5<dU)oo%MZlL*P<7=q@6H@L9D&cxaL>N(ZSP5H6s8geSG0U)H&6dz)JC9$GQG@ z&UrK8M>oC#s6ZyVFZEv5n%QnZ{{sEN#eAM-!Yaha!2GSmJ=Ej*y9t;$mq_N)sOW{^ zrP0K-cJtl&r{8%2)pUKxH(T!v_zx4SOCTOet}dM$UVw#W_YZb8%{P{kXvg)eDPIyB zuii2bVWXamC#S~|C|w!&uo>8hNJLHEd~tUndKM<!iN0xiUxk-8op!wW=t~}~zU!N3 zn}318q>XPxhfOK^ia+7JT+d=L{Al!*$+<_mh?dz@zm-5BUi0S@X_Oto@m<e&R}zUq z$S)@@CKJg;7>pidVa>qrd}k+Dx+j5V*t(Eds9#PbE~QQVax!@-y<j@9o_|-}{2IEL zMB*0uDc_`rOfH$Yk$h0TBz1_M;l`ao6E<l-5yEQwprvh_a3&5ruk3yZ^?_o!6&-fX zX7~HimtP?=V81i$o3Gbi1eAgHv66uuS(=C@alYF$037&YsPgKuQgs3Qa+@wHrS5sA za}K7}VSv|cY6miDyq#E|Qin4^F=rybxoh_-t`{M<h9~L~R6)aZ;o<rK8ng+!&E@q9 zXAw*1rxA4K7|<eMv3WT9&c`1eh#o;KA_l%*`-_)V;a=FV^5XYeRDOazikbbXv+L2e zHEtrs<lraLVqP}gOQ@Yojo{*f2-rH|j5J@2mb2giCeF>4`JLEHU<G$A-Nbo1ReSNJ zd#jUB=%%wfcPRRSIE(V8KP_Ew-h3p;Q;_G*S5@BM;3~4R>QkCrRnYTgfM*$hU?2@0 z_Ya%~u4gMRUh~Y8?>pBFS`(xIwl<uh`4@a=Tfb|vI7V~w31oR0kE7QOF;eS>7;>pE znMfv@Sbz>I4cdS!ZKF!`g;%ZGP_-TF7fY5=u`foK&pr~*>xgK;P#KJJr8EC1&7&ig zR%L@eJH=yEe<^}zp>8FDN1~oQN!24h7X_8jF=uPL1fHq#+ma%Dwz^X3WF{ZHdX^6! z_2bDZIS2bi5H@7P!&efLB-kiSvzf-Hw_c@7Mf*!#BCgWV2fmQZ{0da{<#{gE_4!1% z0!0G5DtNNX$G`ljnBZZsCB-8+E5{ZAp{HDw-m^aO+hVCb&1HTQo2%q*rKOLYX#|w1 zbWq=>7MBXL&j0yAq+EF)$^E(5`LD|T`5~r6_M?@)E^I_@5>a@f&R9HIN5D5u)*Am< z6r)u}#-IBX_@e&9_f1#zn+vPYFQRnyn~Nxo(|@XT&x0M?XN~DUgwpOEx2mO|Ut#Iz z7j5bGMX5)wMXht`V65x?LnGbswE<$y{L;hccKo?-jvWS2=zrV(M-!&{o%{dC4ge<a zKDYfy%lv-hZ?<ob`3wJh9w|;8CvgA?|6&D3)c<D34xT*!+4DP4y88Trx%<uS02E8h zUek+1OS4X|_SiYWvGdT{*g1=_b9f=?CpriG;<~Xj9Qo|S=RSMxyg7ErOg(qFcwl>Z z_1oJ&Il5zU>bZfj=P$eFzgvB$aB0W1`9Gn^e?C}!7bkgWw8-zfh08cu{nqviCwB}O zC@zHt%p-N@^11{)o9FQJki%|c@)wc=s~C)rV1zD7r@t@~zq2+He>hY$PwdKM@88Er zoLBJbEU(}){+E!Z4LfSF?aLn?HvNBqXIbC=aP?a^p<}9ld!h6n4mZuebZ4HwXFlE0 zEIo&}#<{c4-=(s!04Fow!pZZ~Fzywz`usxw_I&9-9D2k8+zzZ+FrU1Vzdvtg6IUlN zNSVV0_tI?gO5y&zT9B3dAoC;d(b4=lI^aPPgL;nU&&p_iL`L&-mt+9HHk!x9-#o;f zf{f;qGMcwmKJ#$La{b${96fA4_#<@P|M}4B^D9s}b;{cw`p7lEv;1Fn{K58=ng8ba z&;HO~{x92kf_4Ejm-M9iJjREA^G7~XezwEk9{JFk*$${J8t71#LwyW2t|c<f%NR=Y zu7F8Dv*XIpPVYyZ96jsc-@k~#WNvNne|Z>#e~c^tY8S#z2G4f9&%ys?zns9G00;j| z?ZJOy-QfSL54Km#tsUF@P5&RFHvgAntKY1kiiVE;0hX=*?!iB-nQx_x`L6S=%SKLy zSZ}b&o>ZT&8S|%apoSOv|2+l=>#l~V$xU;~TWB*d(f!;{bj;z-z)Nhd&EZxDDHuMr zD{|utKm5^;<PPBl+~J(Z9YUgIZs~yk=k5@$@(!V#ka1UVhv0GS%sT|!Qs55Z*5~W* z5T1Roqhid<JC2#ujsf@V_9-#)TdA?<`d3R?G`k=Fr^?wK*MI@tv3<q-_>U`Rw_l@4 zu=B_NX^A=2Z^u`Mp2Pn6g|QvSQ0R-b*;7V@n&l)$M2|1sOk6fsl2cf`$dR>YI+kuF z27;LNc0T*vKgS*D3&s?a=Wx@By9BvCkln*UdzY}geV2gSC>l4C$WQPtL59<G4br-9 zTm@=p-3a>GvFETxVBuRptDoJmeft1vi`DtSTzziGj$^QN=(+8G`5ky;_1pUmys`cJ z-`OF(%kzuvlRw_E9o-N6!D~CV!)IUU2!E}4F7aUDdSb%h#$Y6I4R@f4%<N!;H?U^m z!P02*TDybU`KN!fGq_i{JAkI9_X={$fP01AX4hY>-792*dxa}<uP~=$>4{`+909a; zuOK5U41F4_E|94160T&Obqr@$8>SOrR_-@pjAig`nN^&D2BWX_y?M)QSU}&Hgxlx+ z#8Vg13rylpAlcw8EN%zT&n&iWcma2<7)@98b|A^y0o(`Rc7S&U>uv|mfx|7_;h<s$ z(LR&79hl?o4(|YyH}0Ua%rIm?)n70>g?S*1$6GpT$A!@c^aQ`HhIRsz#@`uwfn#_N z?yPYP{~Nn@VIWyuZPiSt+gcmLqY^NNZ($7o^Ft6j$avXc;Zh=kZsr%y6zPD0!{t>S zF8};+<%{!WUzlrJH{@8ah4y{_&`{?W=RU%@D<$JnuIFo2dh9T-JudTQ4C>2Rb~7^N z%Yh&VZ*^=Od%80I!?+b69dBwLhpWuPSe6_b!po%)5h+YbiP0&OI2Po%P)3y;MteGn z<YAk{ENu{CEwGLigfxYtj(>xpG8ZxGAXLY;!9qt4Iyr8YVl3h>Ro8~e+h~e>tT3Tf z<$`fG`RP!f#sy<+B$0p|IqFph=}2DOAQENKWMzFd+VQLhWG)fMCe<lmTu)%dn*&fU z(Y>xk<SK%gi0B?-eF^>bapDuxY|n)ip}!tB(gW=~)W#C?#7}K&6H^HJxIi8&^x8u~ zVxR>Oy^0Krcs8jgMLQ8Bl2MdUXacS&o{aEo@yf2i!g0<FW<8=Z^%D$v3Wa&HAy5Rz zgi5c$z6nr9CLLsf&^``BsmHB6D;I_moJ?LsF_Q*7ZRQ%RJOre30BHx2V#;B-C`hpu z58YPJQ@0?89%Ut|Aof0Mw+8`mKeLvK%KZhYXq#)PR9Gtn6%QMUL-&Ngz_jTgq|y|V z+CnGbl)p?<R6O$(&TdW6>Sh6fvs;f*kXDgYha&qW&l~#cI=;d`IA>_J0ql%Wtr=)V z4b;(m7!}y_5-tsyFP!0d0bu2Rs#`2c!M1KKj#Lddg3dRAp-qMm=*4Jh3uk;W4TTxb zAz<FM!n87|2ubu`2vm+GW(I3b(d@9r#VLKEV0_JHS#CxG9fBF}C`5--DgD)`+DbL7 z2s!csZJVm1KlHdYBp_5QeIv*=sJI5C+1em;X=wHj6{Py$8%!s&1e+IiWsrF5oESv9 zxFs;D-NqTFaI<{eA?U1!n!>*Wu#_%%dPA>DwJn*ADWcc$u?YFO23JP`{N62S>9U2y z3-DcG>Gn_{>kW%+*L6{?@<tT3?65qKE2QkYE1;XnPeAqhHvo$Jua&o1dMi#~^JcDF z)@+eJ1n@gGQi#5CY02s=Li7VI3Dze?oqr#|e;3fDUW&X|gNX2#1zjk-$(l@|E5cs> zcYuI<{UZSVAAyFz?uDD+`*B1IQHbjK_Ky!*D8s)7pjL}*UFB~B$}Se6)fC>}fii8k zqaBN+uK`akn0YP`(zQRro-2QRtQ{hhop^OD7urlbyWr1d&Cq69C}bBFVSxyAdyH`V zfKLhfgk(L^FOw+X&b@q97=AqnAm$zJ0Z+~5x+AyTf_UI%iBu=D{mFHidWc_H#w059 zh{|FO3$^e{ZL~jm&LM|?BLGsYZlOzsln85D%Eej4&Od971ZVxyIn)YYg60i?)i}r6 zEBpz7U*6O<3@YLrj>4*#poF_FAOA{G3R4Lf(-L?-ID6no=(xB^{yIUlrYx00`$FXn zlE4&z)d|lprGn;zdX$Ac$izw?Sc3&+Oi>Uw|1d$9<?vq!1fsqPB(iEp(Aqwh^l%j! zj6y0)itb#{gXKZOWixWfomB$r%{<T(K-d9_$4Vo{2@$$j5kxuIKnNXBfY4w7>Upf? zNX{fveo|6M0@2h7Is=_dL_XIS5g-rG5WU=mQzS^35MxfEz`rYhmZ!B)0xA=EUR;7Y zz}Ax^xu7Q?Mw_2<X|we$brW3$#x6^jAQh&89>{(z4Gt|XauP|<3+tK$kIYq3j|nx| zP<Jk?Ds%l)1TuLHxII$IjDTzX?+7Z_Zh@Nt|3%T+Hr^Z1U99CI;2EKbt;uy=fL)VJ zWcZq31tL+Yb<Gxva2c5JR1kTq*iA4wl=B6bPDX*YC`v@N8$i(sH-=zU7wB2!;frNP zgp3ndOw)nkrr`=K2X?zr+${2hcvgVrJz@=h){#O9v4?hf0+uJd9Ea4P4%S5V{(4|1 z<N`yC9BT;`!8#|AA%8p|%hs@#$=WOA$R-><0=|kw$2sBjG#_PQ=O*!qa0N-Hs7bSQ zBZ@yb7EC^H*QE}Y?owq4Mn@DPp<RC+De#6pbMp|hScVM-n?RDQ#Z4BZjM9KTbLkbK z)i4$%3_!_3MkKw$p9z8X0;DzSi3_}#M~t-qp=U@zq%+~rlti4jAfDkHz*;reQd#D} ziWVDK{zVMA=rE&DY3cxy86*>0P7B3*0^X)Rgrm<WSet@8E0FMWRagPyvw(i%9QiB7 zjv4SEa$51{0Rg-!DMYBZD3ri<s~**`BIW-90`u3o7~`Ya@SN|PuJWQ;ng!Zf@zlgk zb8~^!?IySuu<XigCwGEyHiC*K(z-co2<B#vr|4`Vp}7%Gy}~m15OJ+oYynHNAePw) zOnYh8mcx>|86v?~P>v{SmLVS!u3FhG$^{I31Lg74mPAT`tRF#t(;8|)$rL#?OAI%0 z;7D25!Fw~06<o7CS1py6N;8Y5ZlTQ$;EcmF7B7t8;tDPZUBwD6g)IwKn22T<Xl79d zU}CHTBOn^sW8GScFJ4w?aiNMm;mKHv2F^qn6ORnMHOpxR*atY}5|{*_<N%F~OyJO= znBuW3vXTt00PdOqXR;+zz?lh~UcyF5GncP11M&fTro_-J6$}^Jp7@m^UC{;vX}&P; zFTg3rEnxn#UYN!58BZ{}#OYRKja^=_z(frzGPol6;A&x|K&UPewxlKgw=R1H1#{_= z0DT*Z2yPX^Ggt(r@MDiBOZ?Fys5|5+%s8OXHGDqSL4mh`id6-onJG?$V+o#?BxD(@ zr?}{@$^}#f0E8urYp<*dP}5?D37Y2e!2&e&XB1;>fRrX?SoI(@nQH~fU6xqkh-b1G z3*|uD_UEq+0TG+eFTsm*)4=6Uub9?c)l~3jdrPKPtYB#u!G;271t1l`cHsVqoQ+Il zxgqe1EdUC={8IuOwJ=#(@kL-GsDME=(^%Rl=vUH{8<vN;*tPVKsVm^z6wa%b2Jk?X z;=(eZa|ul)9Fq9eEf9}nFeW(GRlF<VlHe-HTEQa{%i2Mjy66B02zN?Hj6oW=1`v(l z!~)2tZomfvv>U>PwQ8a>v{bY#k-Q$1_>wpbxo{0tA<WSQN)jA;c+Qj-@ya}I5$a0; zDAdYtL<*x0S&e)*)kg-F<k1{Bi%P-d>3sY0@(thx$)}7cugsgpJfW<ZC&Zu8%p>HB z^npwFKy|@s5_}0LE7SRD5Mi0i2{O~2?jT&0CZI+Fa-N2X1|_1CJ_dSB7y|tX@Siw^ zX33WzPMm-tv?4Ka%z%R;x20H4rskdza>8i^pDNf+l&2cqqSiD(qJ*T91*2yZtmKE~ z2qI-3b$mvos%#6J71m-zx5y^Il*F6JfGPNu5Tmp<mR1c0X*Up&By-#9MxduR-GhRn zF#XY_-Ef0J9f_?#!6F8b0`;jU@>N9u)gT7`7qyA7rTR2eq_pcXf_iM_o?d3PEduRX zMI~03E9G1neOAd6m?UtR8-alY6pon5x}YDIkpnoMpMxUA)d3qySSO*70-xNF<ss=^ zz$RM?w<LnHsU=Xhrim-uS(IoX0f15AWf7u+)eJzHOSuSmH}RVjkfs7h2@M5E6w*4W z0wAgedH}3xQJ_Mf`vPPXSiWh%IHh2KL$xF;;MEXxDA4niB>-4Tumr1uP0hkW1%e8K zwcUAPXpsHYrMdiysRD+V1*meSYHE4h=gr~2JLd_!goR51u+YsKxL9zCNVhn{2vA}~ z9Jbn+$!sIr4Of$n*hddwNl-rm$V4GvB8gWNC?tu9Q|!<(9RxvYiohEQXWY!J9LbT_ z2sCP}18%NArrc&gR0VHAORi8wip&xp3FM{7^8mi=62?|t=FqBYb|c9tF++6(s!3A` z+4QoVl1|tuHxIrs_PC*WWS>)LXr>*>aCs)=V!>rA50_^$P2*>3SXNNQI;%}};Q18$ zH&xGs1TVOS*gl~21TP58Ubn^LwK72O0ms)`Ll^?6=Ve*|6B07G*&_E?92iO98j1Cj z4@3Y22(F}4EFTJ*sc;+VD5NOhWxB08gf523A3($=kBMz0B2(amI0mv3+7K&<uRqnv z9K~i54haY*&nd8jG(d<!KR>gT8WDwvY!*Zb;Np-CWOF8hOaeI}vXOa8@<~QY@dz0C zOh+;DWEOc)2^JFoCMAkp#DhkV>B+AJRCdrwuJxc6mmC)E6oa4-v<^?LHJPE-)YG|q z4nQ{fW;2shh)bO1GT!6{O+}W%_y~(@V*~xku%hCKe&c4LeJCRZh{ID*oFM=Y1PY%6 zt_jDAD^#c-kaI|ZFrw|ChT`-Hvva39nSeddSYE(*QXbGJ5_m}Brf5C|?^(E@;P;dr zafCty|4mM{0QRE_q8Ro_0`yB|;pi!=2}ScODnN*^b%7g%-~bPaux7d{=UT36HkHMC zY;4UoUJ-=QSx|zWmDdW;jlLisMIc-do<yOR*xi^~8=!4US=`zrabFt%`5G4-8){=> zTv2n17IPIQCh5er5q74)xvId+JmAU{>*fQs=C&bcN~?%E1?qW#ml>fEz#Xw_kfj`X zDEKpjRDa?rXf+9q6j}$}pxi`&SPQ{(fJKpnEH?`sNO2C$HxucHBNj!8ZkEJx0HX6z zg5W95BGI@Doz&t@D8kbGr6O1(i)~G}@r^7XoX5$Cc|PHTstL(yaI@_M$y)OdeFD6l zmDp{aPM=sX9=+V|6T?FRY|S0tFaf<D#ea<pn5#K1U@ir;5kY1qI)$!9EEztE7ZcbU zuwOiD2%gOoJR2MakR$!;39igS=c;R%G~okAz6G|0KuJ&<zN^B}!s5u=OqlV<G!Gnc zKpmkv4tQ+2uBgg23w8@L1L!u=fH&B&6d`v$2$gAQq9*E5I00<TC6ukcW(qNKqDpfd z94#MU?Aq?cY$m`j3Yr3%ix@Bhu<#*7j4&#Kv?54#L8p){rh3>Eum%(wJ|x0UiMoW% zxIfly@mvA8O*tq4&JYF0LqfWmmYD|*fRKt%Z?q~Rfpr7wj8dQn(QE!#2l-MKv17=M zjE*DqF;IXEc>+=M0OkSEO_>?!PN-YA5`Y>h$Wt4LFeBg&FeTw6I6WfBz#GTZN|A6- z1Gail0DOdploNeKtx=MWkBv9TA9-q^x`wi$+o-6e=s#q%tD<8F5F?*ZF2ap0{HXz? z6QNg3A=*lIq<||&zHD(xEP$MVP(fXUhm8Q>wF$5#2)4kj&`1xtklY`AoEbP_E}0AP zYZO>1mbEx6G6jtwpFBXklpd}XxE4zyl|0ClfU`PF3zDi^C655jMfQ{l#20?mnwB8c zh&>~+kOtx4mnj*gDMmq9dP3vCL?}IF0vZA*30niWOn_$I=+_nb1yb=Ke<{~)^e+Ki zl*G{CAz)!Zy{UnOfr(^A&M6{JYK1^LGeQvLCRPNrp?IRp5LehX1vZY2v@7&c1XcU_ z!TQx4YeR)!oVtG1$Qs}EwEtA<P}B6(v5wlfOVv0Y+H#=@7qPU}A)KiG8P;BMS>0VF z;rjP4qNTcPRjhbl)itDR#etG~>~3Ocej)?x!n|=WTsb6C)}T_0$$YTfbLb0Dsml;) zp;GJhiCj;NdFIQN&nC^SWCE*h3KtSskZB&A$MVb*kFxK$3-}M<UL%9BgNre@?OwMS zvo>qy6c)9nF${hdi<hoqfg4w-jwF())=c8ccya&>nXp#UO31<oYbzxaf_nl&1<ReV z{&D?ENsD{BI8LZjuu^h7iB;@eQ+a7raZfYAJ+0L?*5iG3G>K(k0*z@UulfK6O*ID+ zRjy<FNKC|HO}mcqJ6y*&c2Ph~SjSi;h)H(q)-fuG2}>70zef;LdcdDcD2OSkAf`;R zHJ4~|HN%>#o91gP*AiSonFc87GJ!}~<dvwppJUhdLue<!NW@Z!9_P}np#;E4x^nOq zFi9g8jPzH#PzAc4GJ(~FSjJTmFcQ`s;-tOQFloU^>%37n+XfOvLZO;Ttlg89fWT#7 zS>S+w(mKQ68F}G*iWMrN0?x0k0=$M*X(L<(xSMM_xeD-{FGw_5SoSd4UIjQP3nZZn zRsqiGD!_HlKv>)zEsrG=4Tc2(Tew@+g?fuvqnEhW4!jrs>^qOF(c|L0VZ;%a>It4l z*XUIq#q-D-J!9ACjVGqZAVk*awPZD7yHe1gp8Xt^kjNWgaE!SR%p4cnCAiowk-WID zrpI?=on0-7m$d+Pv)G2+*mZV*#R%-?910V5qwDMvSZ6mZYM_E10CvN5c4-L262M0z zG}5ZA*0C}gNDutaE`GgcLql^Cz`*begvivmyv{;ou)J;!BGa-EnajGoP9QRCHtKRW z;#s(KP?yzxF;~zhD~dj8=l#<i;#ye!;%@R6a_Ab8MQQ{}=$bBFRE9NivO<i%cIlU{ zD<cL&Q5{@?=3y~d2%91^0x*Rx3**1&VQH8JOn8+o?S*H$#*L-1+!9n+`6fy%A%#+8 z^&3*`GBmfs6?&=;imIwyMJJ2+2&HI)JJuHA2`gQ%Mumw|p;%&B6xP8de7bZ_7x>Zc zHe!RC7+4knLIUW^<Lli5b^(-y{}-ss2t`pASKhj2ju;o3*02i^p$yj<GKnIgrub4< z;9+rHyKQpy3fH=Di4j)FV4aLz?j}cE%*B;Hy7-6dVfdAGU0e^-K=#^_F<sn*B~x4n z6apVzW5k74d^3iuMQU+Ll`gj7YB^oVl)_6gHm_S>Bcj`jf$%C65vv5MkzMu{EIuN` z$B-{y=!K6b33e?Ob5u_*1d?TPLevuDnjqe2ml~lc7gGgm;6g*Xn$T~r1qwux9bfLD zE9*pKCh2=VR1bZNi8|27vMDX1Yt{6nBGeoHkY!xZ(Z2A6;<Zu!W2?gc|Cjgw0O!Rp AEdT%j literal 0 HcmV?d00001 diff --git a/docs/intro/_images/admin02t.png b/docs/intro/_images/admin02t.png new file mode 100644 index 0000000000000000000000000000000000000000..d7519d19ab1f22e12e4ff9d72a0aff9913ab1d4d GIT binary patch literal 24726 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 literal 0 HcmV?d00001 diff --git a/docs/intro/_images/admin03.png b/docs/intro/_images/admin03.png new file mode 100644 index 0000000000000000000000000000000000000000..77549e7c09a39f219f0d73756bb4d4a4f5a2b33f GIT binary patch literal 415869 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≈pA+Z;fT<`QZ<pJLl)mG;ZAcRO89Uu1seB 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 literal 0 HcmV?d00001 diff --git a/docs/intro/_images/admin03t.png b/docs/intro/_images/admin03t.png new file mode 100644 index 0000000000000000000000000000000000000000..94273cb5831b4bc082c2788daef9ca3c3f871ba0 GIT binary patch literal 28131 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 O0000<MNUMnLSTY$2L!VK literal 0 HcmV?d00001 diff --git a/docs/intro/_images/admin04.png b/docs/intro/_images/admin04.png new file mode 100644 index 0000000000000000000000000000000000000000..4090f892e73c4def356418f30501fae6e2f8af2e GIT binary patch literal 397310 zcmeFa2Vhjy);4@*(&$|*S0!RsdIu3jigFc2#Bz0p5Rw29NH7UP0!p*%l`ASX>@_Ih zMFml?cN7F9N)<#wYJem&nRd?qJZtSU35Z^KzwiD3d+#46=gdBPuf6(OyPR`|ZWj%@ z%JNwHF9Ba)T9!9x)v{Q|zp<}(yJ*0`#M9-Xk({fYr0q0TbRXLDf{EkOGe&0>qz=y- znVoZf%hGq>Z<(5%d49`lI}dC(a9p3PQQ4Oi<z-z}bor2sqR|=MGh1HJt4_~}JtmGF zH#VyvJ$2&PF**4?CZ69iJu`QBRu7a}-L_?_fE0{Azh%cZ?c20(-M)Q?mc8nvrl$7H z%N)^TaNqu>C$7$KIjW#wT#vSGCrp^oW<tj{xp^bow(s7(d)sy$+IHyB8W64X3v&w6 zC$`SXKUI;qc=~4LXXIs%E6C2xNhRL&;kn}r&TrY0gyR2{#mtO2opIyy#t4<njJ8>0 zvc_iR6y&!BlWpV3(YI%2MvoD>d1KQHdZmvWHzqqHomAT1oRir`L~S!}RBl0T{;1q> zJ=<1+8p1u>lACJWiRi?7SpC1^dSd#xINLe-hH^&k*tTc@%k2(j8I?Wy<YlE7<mL^@ z%^lOLH*JzS$YnIO&s7~#2c~Ca=aBK9#Bm6CmDYO3o3i?*7i9J7(5_wA*6lmAZr6TD z`;I-@b?(ujUF&w;dbDd-4T(Y?hGSrEX7-4}BjM=MqeJ`ZII2M&jsp&rnO>0or?6Cq z{a-M~z=3~kj<I8ZW08Rad-ToC7*8)7(6`t4@!6R@dUx;Cu0!|E-Fmn0-oJhOzJ0oP z?$@DT=PsSQcI?)@UEki_M5~APJ5(oV8<3M<ke-u~br{a>{|aZde*d@iQ;<EPDwq%P zR<``sU0K`Xio9%SMuMwX`<`uoQ&&xJX}fN4R(|f7@eIaZUE!DA+qG@q4*yKo>dl9D z{o5aRt=@ci*Q%aZ=VTZ3>R_lHR(*J{%OTdyS$(rdX62(#=Ps=}bnc3y8;<U+I&|sK zszcXKI8fKEQ>)G$+u>-BGU~f^Y}KKAmsTCywQtq2eK#E4TXpV$qhklu0Z-R<H~`y~ z*PYRhqhqIz9nM3ZZP%?|m(G29ckkD~W9JTiJGJlIy?_7S?fUlZ-MxFK?uPM0I5TYj zUrSn96SIHE57_csKVWT-LD>_t#$4Ao8*!2^w(SgFkJwU8%T?`vtLoXI9sKBsEr<8) zlRG9i?<x#{S#&+=QmyK6=tFeYu}iluomzEj*S$+SIm1p}+jr1&2dU9>N7Q$2uP~ij zu~%0)!=|toYH&tPr*56w$r<)U8P>!Z_V3ye-oZ2AaqiA@H$dV{S{>mlJd;XC_z=(N zi?j5F2X$)S39USXTb#9~tCYL(+#P)4EHK?WqujLv>$}3+aE4EIYTq3=d1l}4-PpH# zH^Ox9Mwss11*Us@DHB_F!3J-Wvh*b<uuGR#@Y`1K^;TV4b#2wHRrgj<P5bt(+IMKx zzGJKQom#<<0o1;0D>!`zz#<e72?&zTh!?m!A_ES8UjP1GI(F~cw?pqPeLMB<+pkZz zju-Xoi;DK0y7cSat)uHXhgj_YwwK4p|09nG@#f$9d%UTKcpFB(tX>^^wmnjHH6N^M z9?+-HpuF4>*<-SL<qy92qSOKX`gCdEy-SzY9ooQ+j|g`}JeOqWW2R8pHa<By;;co} z0%mNO_qB~r{M<hAS=Rqbp^EMQ74(X<hR9JVw?<tx>N+Y792Iblch#uts5Ed?z%|}g zqpqXUz)=C$cvp?Oj!FYZ1zh7@HR?Jl4ICA4jd#_k>!>tvRKPXfRimz>(!fyx*LYWr zx{gW%M+IEtT{Y@DDh(VJaE*7>sOzXSa8$rG-c_Tnqtd`p0oQm}jk=CX14jj1<6SlC zIw}nu6>yDr)u`*JG;mbFHQrUDuA|bxQ32O@SB<)kN&`m)T;p9e>N+Y792Iblch#ut zs5Ed?z%|}gqpqXUz)=DJp?B4(dX+LO2k%c#z>AW6(=uTf-?Tig5t_%2NxeBMk8ih} z-xBZcwM@;*$-w(@IU~<+dG(O~t-Hyqm8bN*qR)`O4eFPQcMkIlQU_gq(Pabrq_%9` zwry{`hM3j1ZQmh%QwLo(;Hn|1eE+X)zsp;uR)2w#FDquX;VXgw%x{Yq1;%CN6%<|u zWUbMmO=dwRUUTfJ*biX`wVBx&1-<Ij?m0TEuoqCYQDo!t@Wx=9LFps2`pXNEZ3Ydz zBsVX+C>QT-jlnBWJ=+o<-Awl*_b<rid!}tN^!-G)Pwk%h1wcQt8o3*DhbwH)wx+F4 z?LS1BU63`lcV1q4VHMJJUV<fbbeZ}c9RFG@A_3E5@VXh^g<yer|BxfRnpcq3e@yzw zI7fho60=5T<@Lg=YHm>&Z0mB^v#rZEUMc;vmZ<jroJ%Y&@)7O$pJ0b02t|#%YQtMD zZt>sA6jx=WkAW-y_n6@@f#QJx{r}s=!8OQocuD)eD<2&}sJIdSEwho!@L`_wpP!L_ zN3ggx{!Kz6fBf(vI?j$u$GD%Coiidg%^gjTG)fN|IA~DcL4@st*AOpHADiW-uWBRb z(TpR1c0m8b@$<JMdhMR>*hrPTBPPp~>JOwKh?z!QmQ_%Yl~;XM;r2g#u4Bf?BMswK zqtIdFc<uP04T|xRyjrc{bVzpY$aK;8f3CKFM}}&;&Pi`Q=HEcwha2{g*<SC=8^`At zWM#5)a8^daf1>CA&jh5Qs>KtoWIS)z20mRivj2<ft{poa3A%IFE{9ZCi-rI9!|hM1 z2kGy>+yM@k@OM0*b$k5y$ZtL1cdEN~J+cRMKeYPa%mbi`0T>psiv5qy!oPLxKN9Re zAvIU=e|1j!e`Rj|Qxg78X#W2pIUiX+sQvHB&VNqC-|>Op$-}=>{hytl$BoPU?@iIa zCtS5Oef3qT{|*b5!-pBOH0nKQ0G7nu%dVO=n`KtJc5OOf9{K0?ZVL*>Ra<eIK8Mqk zahhYcu5GK~j<31?Xo>n;UfmVp;jI1<mg=0k{eR1-yGMRFr!J%TeID-X_o^fJ26pn^ zfHhHmxA79|5?**WdoOhMIr|cly@L}*CY_ZKwY;cyTYvDLCBOWbi8_y!kicJj^h|M3 zc7G2N6_z!smUX=6A5u(}^AS(N!(M4>WL@IDT(FpL`IX2sq^&_!=L@D<mbBEDx<s5O z%JuQ_>yrg*nOxVFGfp1uRY$JDDPhjkU#6@R=iDPbD+J~etL=ypXc>cZvgxHY&p!5e zyrzSoz8+^6rnA(vuBs87mAJO7ahByA@n6EPY(8R>^MBGt+Efw#c`cDHk+!rfsg%}s za_#kKEBU4@w53<tYe@|?g*xwrdKep=jN0nBPT*z20Gw1CymWsX)UxVWS6ew&ft8J8 zjFn|&TCJ`2Xg|bnq{kt3_+3%KVOo9*5N|L{@;Ybym@)XGu*vvI&YaBrD~8{gfh$97 za7F=1iyDUHj!PYrn==yE^6#>&5e3z+FDl3#Yp(G#r<OH%<S5fFtR?5;w>h)&uNiY$ zJ{moT&`FXuR5!tqA{PVtR>Pe#GB0=hxI?OvabpWVgqoEzek}Ub>vt8g<8}n<a9uxr zd_nHTSvgsGxWAK$3Tp`RmjSM$z^q}*fUzS}@%6tge*%8YbV$GJhJch&E|q_1&A|MT zS%=glr;jNZl0Nc~x&|3p=$AFIU_kyQLk3<p96umRgtgr2Lx5|K%FQe4JtljktEq-6 zJnjo>HF~CGW{pT6Kc)c1+Bai&{s`dQRh8;P!RrnmDZh+XO}UK~|3w$a8_>nNJU55B zu3eBj?uzjR`B~K+r_LBS(r;?(4bLrrL;a?{E=)Y?aBzvhvq;FQhr@Hhekp4%Ybe#o z+4U~DEITLH3-=$JQ;^3WWV`Nf*Qchefcw`*B*M|tGxEm`ysAHKWZ}o!Qu(WGib>8; zbD%`6x2E+agHltgwf&i5<BV~6(6VO`fIDX5Cvj1}4dpQt3dXUXTsIp&nq@CTu2~)! zMEN+DM{2p1z-akGmNUoZz`?!bd0gh$OqM@E`L3JC)A187L-~%Iv$H0k{2j`tjTt{S z8)atNW@EF`5sZn{*=Yq?8KY2chjP8VA%pv%+!J0^Z)COd@M`4(cpzY{KDpxx#U`m| zWt^Rg-xTbYdP&v<?kTn&gkLO9&&y2hlRI`?dQPEbsm$zUHTlgi;z_lh{;;tc+#eNb zTWv49Qf%gF{&iJdRnMxr+~<(5F{&l}qpEKBW0tk}c03obzN+rDXDqAXZI-oYWi@%4 z(_gCnK5}+eMjI+L{_kG`#36sbP>o(2(u@C^U}|3t;Z%Bc27WDbd|qlke=jq&_2EwZ zKkitKt!jL<8k{vED-RDyWTjpMFT-tBm^&vko4@;-nw@jVZyr{|@IUNU4Fikn*C;f7 z!M2*EwXqtlY-T0w{n|=wTGvYOJ%tue+-{fEzQ$tYUE5-Z`aQ~Mm-8Vf?@U~J^Rs1G zu=)%hlA19-?`8!_<W~~L=!RA^>v-#A>s0G3jL#jcuGV?hg;qc7uhtdT5bJN&P%Fb4 zWsSA+tO?d+YnpY3b+7dg>tXA0>uKu+tJs=vEwmO}ORW#B&#dLvx7J!~gSEx_#oBG{ zw*pqg<ME_;>U)}cj`y_iobEZ-)4|it)63J(bD3wb=Wm{2o{^p$&v?&d&kWDKo>`v9 zJ<ocIJ^%D9@qFm{(zD95&a>6C({s=h_9l4id7F7p@}A*s>+R<4?Y-1H#OwEt^xotx z^4{jX-}|WdIqz%UMcxm+%e`y8TfDoy6$w^C-Gt@|rzEsa=$6nY;fjRo6GkNDCES{D zPr~ek=Mv^8yp!;G!kUCF340PkiOGpg6H^mgC!UvhN#fOs8HqO~-kNw{;^T?0BrZz) zBymmR*2MjZc2fPM6O+zO>X9@c>AIwmNfVOpNSdAWQqo&VpC+wM`XwoloSfV|`OM_5 z$(JPmE&0aeNy+ymKbgEB`Ge$D$=i}EQc_ZmPdPW`{FEzF(o+gj?nrqo<+YUeQ&y+^ zl2Tc#ZmkxzI@Ic4>-t(bwWimaU2ATw_iC-KwWC&~cB9&-*X~jKirSgA3v17;{X*?` zYOk#QOYKOV#&yoDbAFv6b#AOPt<Ix$=GXbO&c-@rb?eq`S+{%LE9++0om%(Ny06#$ zqVCqZp?Xc~ol~z*Jzu@?_3p3ta=j1gt*cj7zkdBQ>R(v@`uYX+@2_86|Ks|b>sK~t z+MrE?0Sz)6Olj~$gGCKiH`v#(cEi&f_HH<|VNt``4c}<Evf-XawHuw$s86HxMz=P4 zqS2B@-#4mg+_Z7~##b~R+xWi5a~prz_}3;WP0nc2uSsT;+nPMz<l`pWnkF<owP~NG z8BJ$2eWB^6O@C>Y-0aL|1Df5~?A~VcnyqNI|ClDnbUNmmV<sN+#4*c`+0s0r`5Daz zG#}G^X7h#3OPYs|J?Yrq$7UUS_p$SjU43luxW62C;c;2V-E-W6<JKM*K0fvMe#ehK z{(<8cAHV5@#1qar;mQ*xobc2MpPsPiFU|gP-d{5Qa?f8D{$>4%-V@I`aqx+gPJI5v zuTQKv>Ex3xK55)ZkDc`KNqbIie)5GU-+1yvC%<>{&K6Bu^lFja;-MDrx7d|>Olt4c zF{zKHev-QXloL<6<dpHJJbTKDQz9+TY<YFd=`9zu+;nQ4Q@foy;?##u{pi&Fr?oh3 z;AxXjd-b&Sr`JBc+v%fDf8_MfPY<4P<{8(XapxI}&-nGs<IWs#X3?3ip1JX?`e$8m z)=g(Uch+}jC!gKz?9pdGdG@#Gc+cs4&Zu*qIA`U#-gCR0n|<z+=dNm%gkP%7Y4u#I z?_1Yv-MjV8tzT`uwN3Ljm$jMRW^tQ+ZBJ`^ecK1xe%{t@*SX!8b}zKs(7s9gzqX&= z{+;#*JDk%Yqr(#&zUx@OWB-m*I=<cUK&Nv%Wp#S0(+{1Sb{^RI&dwioj&<qUC9li; zE<3xP)^%9dIbFZ+)~ws0ZufQjqI**Ji@HzgzO;L&N0%N2Jr?#TJ+Jk7qtBar-mg8+ z?3vZ`g`V5aZ+U+D`OluerB`aNVZEN|wdI0SE=a%NxeI=}@YD-4FMR339lg))ePi#} zdhffa-9>p9y>(HrPmeyg^!cD~Lf?z~-qUwQzb5^z?)P}V&HY>UAKCxa{`)WPeDS1< zKe#06l1ndn;F9kLoHQU~K=FY6f9?9$TmJgVrS&eo>e9zA{pqrEF3Y>@oq^tge;xSX zz>SxmetFL2i?6V*7;wddS8N(|=AfGfy?bTym4mK);>zuV+Yg>R`17lpUX^y$+^YgZ zE*dg($cC%Wx_bQ8A6?V%8s9a=*95Qad+n@iw_Mlux?8SW{<jnUmi@Q4uTQ!Dn(JS> zzT$>{H#~g9FTT#cJA5VnGyN0&Uk*KC=$N6)(i*0vr@b*OY1p;H<_?RdUy=S?dd2Vo z!{-d&pV24dk&NA$7iK<`xijnhtXWw*Mw~xl)`(w6o<H)zkvm6SFlzRwJ=uM-AJ0B; z<0UsfePeL+6{BAs?Top0%!0AC#ts|1B&SKv=$ub-PtKi~yK3CI<L(%@<)$7tJ$%#t zyi4<5%J<~^^WQFLhRM{|<Ifs@`}nOl_qzFsn=2<=GvSSijVI<z{JQX*!n+H16!kB9 zaZ=)>j7c9&K4tQ>$y;yfeao}AdTt$l>qk>gopRfhU#4C>^_6LLrj4HV&GdHDXH74k zaqWzEZae9=skd#r{o>nSy`#Y$d3St&=XrNNeOKaL*>|nDyW`!D-EH5KdCyn(w!3%s zz0vzJ?)&QR?f?Gh-<|tM+`nRGmzhufBl#aW|0sFjf(Kri)p%CXtZfetd~nf2sSn-r zQ2E1Y4}Uqk)9j}osq@JAN47kA*`seicG_eAcr5z(sK?hnanTbC=A1a^?m59HGoM`j z)P+yYfBK}S?|nM_O!hNBJbUr8i=I2<x!KPrKY#P{+h4fmh0kB?_G0l%C%km;OR<-8 zUf%M`;8#8=?pj<t_r$p~U-iB^{?(nY`Cj{WUf+3d&u=~d*#*rP-21xq`uNv({d3qq zOBP<b@S``ny)pmI)8Cx)R@1lcS>#z%xM=_4QH!^{{kOMQE&1z`kKQ@&owwd?^X|(_ zPg(lJvSXIbe6P-Xx4q}QU-W*(2jf22^Wn%3w|$iM(T0z&`}n(0uKZ-hr<Z>E#b^CL z`}p(TpTGab`Clykvd5Q8zUubX;^keIFZ#Ok*Kd8(`J1;^bXl=zW!IH&f7|`rcUJXW z_1@|WR)4sr@0!oP8}QxowU@75RdRL758wN~-||D|55KM(v+lt9o7YD+Ox>8Y@t#eM zHqG9A;^yamJp0E5Te@snwzcopuYbDgrw!XOw(b5o|L5p0w{5S#efEwPJBokp@axi@ z{da!5>xNyw>>jr}vgeMyjrY#kch<f)OD`<_djEC%e>sqMz&Utd+3{sBmv<`vsA5pX z=D^rMBzRBd@s+QHx`jRuUmM;LnGj8hJ{mha_Ktn2z0n!#II`AgCbI!f26Xk$8MKwc zbv@@3&)_%*#VuI)e1MguZ5?NMoFAMmR-?c6AJE_Oc+EbMv)8I8|Mx>$pMikbXEl&3 zD|4!a?#>45HmhE(TD5A|s#m*qy~cIx)NOoB!+P}^9&=pNrpGjGdR*gr^3Qzf#o=d9 z{knDQH>lsJL4!uk8Z>CojHd?8v`gbZgTVQ~YFrEAJd@yQX?Yua5*mA)P1q5r<9y<| z09+<vs)B!DnEw(WTw+pkO0C*;>SC+w&_<8tO>i3<S)N2sf;Z8dl#*O4DWP6RG&W91 zJf%tdq~2GiH*I;-v<}J59(eYj7oB?AF@rxG-mz2O^i_RQPM>wv{;dZx@;f(wZsCkG z`aU=$v)@P07j!vx_0>OR9em@qkJpUfR@VQ_hhDh-&4)kv?&tCs-}-dzFBR8}xcQFR zFD?44WP70N#n+CUaOWd0FaG@d9l^$y*9&eFg{PF{q|U;^Deapif`gk{Hcjd<?SW?G z;KRYI_IEsO_}0AXv-(_hOh$gE1E(jGfs`{kf3zA*Jb!FvzpJ|xWc?Ip;rBT>vx)_0 zy;UzkXg0Pku->?|-QQD(Zg^~1`0|XC2L#Xibw>DtXLmZ*miMnH&+heFiwl=LJ*wi8 zaii<jyX556WjkXj=f$S1E~@|j$YZ<D{35?q>xQixw)FIR!XJHdW#HwC_D^l^mT8Si zZCAJD<^M=HeZc4QHZFc=S<m;bX)$v7p2?MOymZHB8(%)@v^^V67#*6QvuWpy9#d}4 zoVn-ZDc^+8U3K};ZX3cQPWrj?>mvr7{``!{H|yu54M@EAx;~e6yR&}1$18$UUKssY zte{&o%kFAVUoi5MDffiF7<u`$)?YnXzHH8ox8Bz^c=IzGKg*3Jv{{!B`s}1Np&xs{ zx_aHi_XpnEv*h+gz0)_X*ty{Z`{vJ!7k>7)=!W%`({Fxk$2I$>bZ<QC@4F^{b$`Rg zfnNTFD>qIF&9{GEv@SB!u{!^_aoOc3Z3_*)bD}+@bW-^JdwP||az8xy&CJ;6j`euy zzDqM4>n6wA{%+)v;*Xb3IcHF5i?1G8wzcxreU4QUZP9vkgRRSEk9pwT(e*xwEZWy% z!0~Ih<^<*}d#_;8lwE-Zml5r=n=g1c;faqAT>H;$mAyu+fBl)#?l&yXUNp_KY|h@2 zDcz$pqm8@1e0PKI&*>d#(f7t5qJh%D`xEvpDH?O$=LcVGa3ESd>AjS_SD^EhU$1!V zp4Z=eBrEiE@As#a6+bz&%httvPk;Z(cb;k3I(*)xjx~E(7gv~Nr42tF`uWT)p~qfr zIQp)e2aQX7>!qo^&wpa+1@=?lEo*glxbVtt0Z8`ZwJ-I7T=S+3`t<X6zg@U;_1;bY zoR@#!=+~|}DN;OXbBlYH&1~_pV_h_P_nOZ(Uhu-$zhCj<YhOk;ZMgORA6E{j$hhO( zHQgJI3pc&I<bjvwpEqZ_Jz;y>i_X8cUX!|;yX-1mb;C0WH@~-X(^a4CI&R4oomY+6 z(dn}0OBQ<8`@V@x*gIkM4^-vzKOBg*aK0_SZ%@(Kg^S;Bmepg~4X0h&dDF6|o`3wu z{Po`zfArC7o%cTb(9(~WU*D~uH2U#d8;1HFYx<NI`hEH7g4Aj0<LZ4kHvfs@2loAN z!;-$k+If=}EnhO>mA&g{zq@k^%-8GGmkVyZfBs`@Mz!v|`m-gkU;k6>g8NTe^7+lB zxvK|9nm5?-?wVoa?{6?^Y6su<Mc)*x3|~>y`nr!^O78s0{R3`lb6Vw+Pp??h>+I}J z*S|GoM8T3XzkPM1)ob%d8TPzg6CZta;@H-ojUL_L@1GCeG4?Ol?>>3kJMf#<U)YZw zxKujzSg`cg{gL<A&pr_O7%p>T?q!uP?tHr0oBQTnyZM5NxBR&G(uuLH!6|QbeQEOG z@|E{oKjE5JOIs}MRT_9v`#k|HMI%3Lecr2A2WM_>F(EQoyA1@AWgUN-{p8xYk<UvT zz8fpfm2NKq$xsl#eAn7rwgvCpWPexppY2LtzhU%oyRE5}cV2wQmMhWi5l~z6&Re5T ztmm!O`OO($d_Q!3<e>wv??14o?dQe!O)9@>)Ql6K2ieq*POSIh%i}L_R#p7v1YbtZ z)@QeOu2rylz2}%A$G2}+c>giC&AO_7iCy~B?A=o)9Jp%0>FqY<?z7L%Ssa{lOsB(| zPJIF(SG@D%rs$B>11{@&L*)H?ZkQKa6)b*X)}!puY%!}IA8_^^#C7TT_us8Na?>Tb zZJMMu><s+QIvF)jks;!0oMpUdX!XYCcCIxXo7|~bnvX)c07t%*#sRG9zko=!`dC+C z@ePE!*VmF1JZ%OJ<oJvKXDh|iMDE$hT^G*@Sh*9_vW9#95-;EAIm^IcSoXA+&2aA6 z=Xp9vnPdGw?#z}=aQ1xx$G29U=z7b-oe}f>hyR0<#s8M6NBa&v+O<#Rf6K)GQVB!l zGq^7VT*BKkUKhVN_)LOZ=KmKa|B^jelnX5G7*xsOIk`#>&l%O_@OoSvo;Kb%Zi9`p z57mQw(>4vCk+#aQ={ea02KOI~t39mmozs`w^<U#?goE<qpSf*7j;!AOud2SAYxT!N zJ4f8)cY6sAK*<Jw|AsB+5etwU`PP8jOEzBm=O1zp0JQVmTMk5G_0R90=hEiw0~h;c zeR8VtNVx{*%8id&(hVok!LxF8;@A;+*dZ0$SCiSu?%h4g^6nlYt!`&n3AZ>z8}()p z4rlmMy;;PXgI94JY%t^Be$(MB-oyGcN1cnXgUWj!*y1IwG2?T{8TW(hSQlC8*kc-P zjl>>Pt~DO_j4}l#CqEDEiNi<c=yhRsCa-bGy{n8d!^iNNW*|JCJf3LU<$83^=-lep zWAew1FxN?fKVuB>AELPt6Z06Z)Yk9)QynEzZfFPp)-0!{_BW@d4sIi6)s!Iq)u8#) zno7AWy)Y{;wY_ktT4LO$SeHRdg-9@YRw{S+rQK*~OnPCSTvusGX7m3C8dCg6qalyg zpyu=MrGaVAH0J>vJnu5!HCHv7sPT!Kc&Nz?HCeG{e5e@>YevJG(eS@>G{mZ`W<~OE zrh%Ffr)I>d8F6Yxod3=drzX4AWVf2^R+HUovRlpW(vfzTYE~rwek-z?F}r5Wt{Jmy z#_XCgyJpNj(wJQ{KGcj4HRD6g`0(F3KGdv8YE~pQBV5f0S2M!ZjBx**BV0{(tI2LP z*{vqK)nvE-jQt(Fc745fD1O}~!`su_AHVOyUwFy#UWDsm-s^Dnly^3M>4m@Y@}+mR z_gn8O@2h~wMoT~M0DP|X4o1&R?^v(TYT)_K^R{)r_bhL+x3%{??>U~J_jvDQZwKp6 z{5G9=Hp+X4TRQB!Cw}{87~Z$J&AQ)H+p6?5_TXhS%drkx5xhsX-n!XpiQmm>;r8+l zwwjwy3%s>=Hr{6%;62tm(X#{ZHjVY{^4{cG<GsZSS$pwoIbT{Etu@vTYpZq8Q`fRB z8}GvH_tf&7Xq8!etdFhjcu($SYqj?@{AQMm_4mG8T4&(X9<LAb=wNjQUwy3`JQdy> z@#cOHYlio9?>M|WcaAsJ^Q~ttenBVO+sZrA<@;ZMM}3yx_BnpXXUpO7$z`I?@7EG4 zqP_%N7%;~#AeKL(wNYPPzt6|^L%R@dBI<m;C=d`iYfLwvKj!nIQO{AKZ~4P<UM#fK zAzC89CnN|!h#w^t^~Hpvh;&Lq16pjq<s+dOFnR%MODX2__yHaAC7bTH5LdAse-OZR zq`Qm6(GI8-$w*bn*djuuA`*In+Xm|?(pl=DpqP<e8E{lbN}XIfzS>013UWqHs05=~ zDv2`iTPj^Ou@a^rdXXq>lqh-@EJ7NZ1q~aB8wdfM46QKglk}1_D+P>-w?SX+qq>PI zgQ^u9&Cn(=R_iSc(6Ax(17e{LL}M=hs$zN%0O3<WQVF__;hW}iDLd%jRC)`qE+%>( zNVyEeDa3@bAVSGebsL=tyr~lHiq0xUz~<yZc&s|Himpj+Q-nG=jnXFwBY(!(=~wF3 zWXV>6X+~S^a!3sUR6?4P43mJWA8b*h5#xvu3uN#SPHopwrHguV6byw#byTzoIq75Y z3J2uM)dh(&7HA9ipp=!O5{*9MR_77NqAyw?<VL@c5x&4Hg*fP|r<}49b#z*qP=lM{ z#Rdc;IU@s#79m!P4WfDCq2EycKozXZhB9W0>qh_v^i;FkR~5=AkB5A)sy(Q_7yt>^ zpb^MK&-3{!C@S#8gc<Tf9tlYY#h3UERU$$P!(=)L7!!B4F9KO@e|_nU{`%)8(FB55 z5r;kmA|O_d@+>N`{Q^j5Qsp_2R^^ZSnn))y6i08gh`tWG*djUFNhs!CfHPMO>dZ0U zF~s0vi5H-bcoHE)F{1-buG$3<8Vwr9CT$A+sDP6&!&oy^vg!eTN$(<uCR0;|s^gH# z2NdGmQg2+27}YT9vB-?VG&rXJR9TX!UB;rWBN`E7Rr!iuNhhLd-G~XPZDUXp*>?QO zGAUSY<TfH*mERPUAD0Q`k)~!WnhdTAc72UXVSMAGUaowIU)ks+*%{-S8pA*_3B#Y* ziyc*C@Id`YgXDS99gSznh{ar@(vTrF7w|JXxJd@}t_y0Skt{~dIR0izQD_Qfk=)H0 z#>adJcsKLPfC`0@5=V6EQGM0~P7t6}D`k-3Lqq{ubz2Qsw7Ljod>4^jZCM<z3`hDE z_16}R!Ys8MA8x5xxu7Ya;24$brc>31adTCU3>-wtoB|IJT$-?mh|O$;|GI&w&PGA0 zFP%-W8@-%{2EA&Dn4QU>swo;*jd+buN6&^r#FbDwP>W_{ga}SN8pUPAUDSmL$J`vj zK_8Im12Bj_0p}(cHyP_-=gLPRcvPEoi5Apz=uz&}3kD=kfu<u-B$@tESTaF&$TB4| zTBvlBI3X~8;)6z=n{X21MhDoWe+jqs0YyN9qGV>6RBwgwNfnbTw>R`br;|iYuQx?k z>>vPXA*zTe23(@dEDKA!6G;*xKVd~f0(52eVBe^b&@mGgO2amBD)}~f5Ufd92@T6f zgHS}xHR>&r-|04W$pR(i7c0utS($^(#KxW6RV6poEip3pkPq@20v#Q?6eq_}(k3)9 zbKn-;a)_d-;%@5Z*QgI3D4pXh!7G5qh1GFieZigTfr1X71`ELHN)D*SP}YcN2q{Tw zg4~ijbvcO?*Pa}-!9omJ!7DAP9->|@p@)w343o+%6{}uPEE4PS@l#og=qRWWNKUH2 z=`|ctL~uG9aZs&}4#Jx8NM5WOw-aSB$p*-9L03`DNGbt`XqQ<Hi(&z~t9lZF9co+2 znlAy8JjgB@792r!zNCI?Kr4MA17K!^QBX6=Q?0S1v}vew`m9POv!Wl)eCP?1pP_9= zmQHWMmF=%3P5>1HfTA&O1fga_>K-I0hvIhqO?-@`OrZGOoMFau;;EL~fma!p*fkSm z;-*>SlU90xdLPvi)cmIEBOwuiwkER-Zb>7?8El%t=#7rWU~mT_oxsq%5uE~vX6Tqk z48hE_p`k&N3|HXebc3UhTyxk`WhgB|=}L*-1Y9KQNMgaYa3p95<*s~4)u`C`uTIQm zT`E-68HG0k=sF3Npi%9rmW-)th_z~Z9RMWwap(0KSfYD%X&I2vtf`WbPu4{OvnC}g zOf{<Kkh&eK)IcOkwQ8ihHk3<B7?H`JXpxART#Q$#Wvcl<`?@)mY@1X~TjHbRjXR#I z*lHTG?#?tV|9;S*?~^#AFRa42!?=FysBgT+@S|g>pwwgsl{z|!CVkh@WO_j{s7iOm z-GD5L&Ey1N)vFEinoX6iYf)7e;?dxt5;b=j?Z*c+8Crl^d$?-mw_>E_G#|O6wuZe9 z7J`*>fR6E0aH`(Jgsgpa4bFa0D?WO12h(_Ds7}>I$bgRe%mdUj%vt65D!mLaY9nfg zDw1SwNRSY17iI3@2Y>3|tYxyINX9yp*6-7av4Wz94prbpj6sXL2|Yd^CtZ4)YA%c! zQ(PW(Xoit0P}j1;ir`ir+^Lt^UnVyc#x^Ss)fQKUOpETEidNM4B3+k0J;t31%3K`R zw1z7NNU>YhGy%<VN`xgbQH+UD4(-?^!ADNgEKr)~RE_biGeMv&<jN?vYRs;(q~s$_ z#*&wHPGQCy%I2C!(hA7Z8Jf5Zk^|+*SCx4HKrA|B8unviF5;6=H$s?X1q{?%<0|2d zco?|IK07gC#^PC7_%NucN2*n%6Nb!q#xdWGI(mgWD(Vtm)hMLFy6Q@88J{1BKbR#u z1E?wv42X=E<dtfn$t&UEz-IEgi`)$_qiaVLjSG4;acbHit5qH-C8|+2HgsBU`cow) zgHiVs(jADyib2N<Gr6$AmF2I(OnN#m0s|U`8cMqIbWN&ihv#r*q{9^{abBz|GqE9+ zLKxIS?rNS!xil2T`B<d8vsx5HA*AT87Sz)ePA8E~sUi88F9wAXDhi8HVR2h&I%5wV zzt!}I(ALyL5LLM@4^<?JrL&9}3@s~pf{DgWVsb^02?jXQS(h0(Nmfa^`B25D1IK`< zing1}=`NZ#U>f`xs_yE=e*itJc1)C4H3NN>0j#44wJLMFVGCcE>c-F+)h0^Q6IoZ? zvlKB~Sxn_RRSzly40U%+Vl*c{p}26?<SB7S2I#kLlGD{6$dN+W>^`^=$aG?ws0^cC zP5T_5;ZO=ehSYh*UrEFa#*k9(HyA)sx2z;&Eftk%9|e~>+jk;$AbOxG<b#v^;fgfX z=Oxj(yRqO+$cXIGYBMYP8ujche{}-uPP`cdRr`2~f_zisoUDkOt8=j0bpUN<Jp#hj zENvSf2;G=fSEoDBcm|#$keS&sO=u1wjAzQ%u`lX>{AwYk9s1!{xo8cUQBx+1qHMCq ze%Kg8EBndBhN_w#2uy{lQ~(`06MSR7Ud9R<hrms6EqLNO^{Je?CXr|){jpy!qp}%Z z>}oc2*@<aMV?||WN;02V)hq$iG819MX4D75y0kMKuv$lS*TiHs9>h9$Xx4?QjmFg= z65!M+b-^n3)TO&h2AXdAR>w5?OIg=#C%T3pW~?)=X((f8s8`J+vk_{C(7II!+>#49 zi*-{3{aam4=Et~<f&oIPC8~{cs8fI71duRd9DLh8+0j((7?n^iGQurwH}T;b*m<W& z{y>=}P&Y#8(t?c=RjM2;y%q*zfri0A;5&d1I~bTEz1?L8l}O)YLckwKMw6teW;%kq zg+4u4F;Uv76G~EddSE|#Xh#`jPyr;w07dB#%LJm+0><vNz=623fy><JLjy+_cO7B- zxak!CF#fr?b!Rl{{#36nd3B{Mnve)I!!Dg)$4z2__nJU-r|m=|0Z9exuA<>XJ)bV& z_#2`tP>XK(1tyVhs`4H?JN{#YM4V#+@J~~&Q3vA+<Gs3z@JJ3cnD|XUpfkF=8>As? zUVa^7A4!6GtCbF_6E`x#?nd<*`m%E%YzN&v2{Y!)IDi&+po-B4RRF_1b4}G0&q&0| zQj-$to@&e#|AN4QMT<Y#Xa|zl`~AbVl}>asnBmnGO}I0A{Kg^-Jh~Qz<X{dlCLa9J z-5^fzPdu>M%y;1c6Ze&llTnYmY{(%KOZSfhYk+~apxcO9CkeaYj=Qj&d#EwZ6oy|q z$*0JUpCd3$D>mad<>F|kDPNo<D&EN(jS4_JF>A^nzUT$w^Jd4B?eIpL!3<AkUt1G| z@kOH!D2ddg67iamDWBvljpZtK8I@EOBhwNCiP;Qa!nz7e0JE`9E5#&Q=pm|FvnS;S z75O(#$$>=}B2E-tQ@9=`w~?8bxzWO406*%u%9*Hv{F5jf-25dC)z;%ehBGatLoPW| zYe*c6>iL1)Y?@FS2s}w<gdJvE3Zp_X#Fz%+enu|caVmM}C|_P6Fwvbq$kLq((ET5v zp?#>Xl$!zp47|)kymY75e*aCuz&O_F>`|oEwFkj?XxgW_-Q}7_Mb*e6B`N|CI_x(y zqL84-Bqj`+o5dn#6+!}0gMqkM#?!>FbXN?`s<pTiN-R)Oq)P?G_d+Xm<Aij}s5X^a zI;x?RQ!!S&*|?)9sQT1Bev4B_1mg|#PHxxB#6T&CwwU1QXzmEj45Hek9q1~Q!%Piu zMNLFd!<iFx$0G(z9I=#3Sp%Ss%RSP>ezfVwZ}zlY3ju-?1#Jgn(GUfkAKXopoo56C zTm8ef?40ONU$HL`IJgwRg?oOub$c+dEf;V(8-s!UAN;y~oZmNWWmzz|^J!Fq8w|VY z-|Pzp4=%O+$N7eD3<UOn0;ls$-2KB{y92=uzUK}Gf?wlS>x4b)k*XBq`9F>G0Rk2N z*FdcN1OJozf`Preo@BQ<Wx-d7GElb6=byv+-B0-^?A`$O(^iy|GOz*B6tMOa-Il_; z3k<p?l}vR(Mso{9G))at-&GOq4nNg*W~mJIZAl4CSP>te#(=a{hn9pA)XFP8SM8S3 z8NdTM3%M&;qA(k|nl!kho%r=^RO|4iXW6e8g6<$sN6Y=;O(OK(@Wf-t6C$SGK_Llu zqV6J)grLK|yA@b{c3>WuP@XBVJFU9;q1#9KhkpI24qy>?Z%+88QcaqSagIWn<%5&1 zP>9KWp2f!GA-Civl5n9^wec)s*5Wez6Kn<$`Zi02BseEJ+rFmj1H1jhN&{2<GXjCV z2ZMoE{Qha-z;RoAzKqg9aCaaOteE1<*n{GMVBlT#{f0Aw!Mz6pfb|VW4*fNV@p+<e zdN2?~$=YQH>IMVv_<hp?`+OLJ?SLm3Xd2jpir_xK?@9RazCa0*Fj^8{0|35Ty*48d z+y{St8DRr7fqCrhC*i;@RD<v|R^xB0n@kzC?qdexHPk}2$G9M!>u~WKZM0`RW9ib` zc(d9-{ga;T4y%Gi-5GX{%3vmLp{bGS*^LSsQKJ7is20IovCcQNwAANY^Ru|aFlQl< zG2^N8%CN}MPO-~A>Fv%&?dwFvQesl38vv)3+m5I5JwnGfoOn;i#DiJy3n{t=RKksm zq0vQVXIXB_u-fmt!_LDrB7IBDX)qsbx$c2ZR4T)nG({HUml9RT2jYZ)*BfYDzn~L` zO?126nQr?V3HqB*pBDU1JejC;eA2NEc})n?j%Mi|CxR%4XOet}`GN9rX?w6V$bDy| zFYV{RYPbLv8*lnP2|%Y`2Lg}zhOG`%O!R*pta!{fbd5~)Na0*|7`83A+6T~z`}|`{ zf`N&2pNbcK-v<H*9vZqeu$tb92$*gMyuf%hQ2M8`;)}pKzwgG8ejmbNDn!E~xZ?3_ zU(P$Dd}-U*4HaDIOlABC6aLjiKRpmMtf_QRAvYn+9z3tWnQkQEtLpw3q1|jMJ#BM` zPSi?EXy{YHn10}+NmgcoCOZMtY*KUBBhmQy%8^i~7<v=VoqO6oGgkn{??b+u9Q&rU z;8J?bF+;-(K}DsYq2vz+p=#q3F}gg)$b4s==EnuEx>h!eP9jJP{!}pMXJ?rNh^A#X zi@Jds;S$&%SSvcIH8i-^?<<}`?;@jB8(Rq<!9LjS-03XvkAL$YX`y*K^=2?}z>ZZd z!|0gq6I4_e1>hIwAXsDNJ4HZ*kojmIQ-4}$9TDrqjzWoc<Mhc8BOFr>Gb{IDNwOPt zo&CsD6Vvu!JQflq;v2!>3qJ9X^wPlRpqvMoVWq*(!9zxQ;1#nih3Ner?#u?;cM4(X zX7~Ag#dK%?8nnSX_XwsJ;Bii%-V||H{|AA<+vK+n7dF6;Zue60XZifZh!l)?VXEBi zBL|S5Wa*qQFcSx+ps%innTYhJxww>>-!Ze$=Ug|@T%(rP^&?ekZVywdj9_=YMh#P0 zWJt|IGiqmv15uPrkSc|W`V;BVno(a5l+<LeIFp`toF{H^ravBa_WIM{l8*%)XP)n| zkmJ1VOWXHl$oX!CV?XIb`yTWG*%OEU>NvsY{qv&EerH|UzFk|KTXt{v4c*~5mCp}L z+P7<+6M4k;T?OE@Fs$y|7w|n6cI>zPzQ>6>?Z7<Wq{>Nxd(8?bCb&U+-xopWN8cL9 z2~YajarTa4Y4Yw@$cinjpgHXO%fS!G#%<1r5-@3@Z`f<7^hj&G?@M0!o{2hvV3F`_ z`}zX)im0=Flmhv_bR2j;&%Pb2eGfTL`aatv{6X9m&L-c}=<F1UH~UBobGGn$$lU}$ z(24)qs8dl{M58<wZb-2x(B#S@;as;s+$}V$f0#NtEJhL&7xq2#V>w28dJw#uxe<Q5 zC-^doa51|1%aCs9&cJfb1KwwTEVBd6SNqaR123x|V*F?R^dUU3&RG*&?Po%T*YVnd z52sAjlsnB1dIDb}m`Owk?Ba6rna$;P;8c1(;sL~_DR0C+bXQ<Gu|xLhh!C@Rhz7`@ z8Iq6mSXg$*9t>1qCTa0yszT8{`LMSx2h9T7%<rH`vmZsg)Uvzr%S%bz{E}4d=0V-e zS3Y!ZO!v2u8)zN>IA`AS?ZHo$RAxD!4J%)Tyqe|gx$XYRS<dEBA3C##1)Vp)bjt28 z-=yv6>iAAfTlwH?&d%E$=bxM4#6c&rz91Ozr>&Uvn)7Q~a?lBGaW;blyqKxW=YQL| z%lVP$GM&A*-9L$ua=SAr9k{=8%KlE=pQe|u!u5Oqbfy<Yf4+U_(n)`J<`qSMxm_6A zJn92yHky~A8Jnp^&U8w@(3#Fh$J5HCn{;_?SQ9{@0qkdg=@bDmgtC1-hXw7|Uv<75 zx~vFzGo268?(=6k9}K(Cw=#sNS?v$K4|$cy>$hY$o3dBflc*j)XhD+WH5gSX4-@$p zNYOqYO3g=p=sc_v6%~SYY8Bkk2s8mwl{m74MZ^yHo=g@#2?V!)yj^l39j}SHFQ%1P za~V&zeP<0Ngdp>M5=4g`$lmaG%x9S;Iaz?`BEthiBe=3=R7^iuJ1v<G3J9z>ZeE9( z?+(-fHGB~O+&>o{fKq)K5lVE59_a|^Bqr($B@qZ@#rjwQ8?HE~;ynXqPdKl%TIT+U zz|dLTyYOaz#SC8Pf#FSOaCpX3K7y4+`D3=NtO8<pA8%$$f%62NXmB`W-e~75-MnY< zPrq#c?iFX>ug(@&<Q3-$^mz`>GA#T}T4<^7cG&F4O|LkmXeYNP`TP%T*y{wAIP3fc z&bnd2&?w)~V8GN4OAdxPcMvmPsgAtFo)2`$o3A)?z$u6jX<GPQ-yO($n}Hj&x2A<Y z@lAFnrE!)v_Up~g!n7bJ*`bAC1!Fl_`NTijDWZ3HmQ+N2$GoBb40NBepXu{gy?Pmq zlboWLMJlD~_wC-~SHuULwR!%ugE%7@-&?-7>^^6%p%Px|_dS8~Bxe%rbixwI1;>CR z8>OU$AqAU@U?Q;A9CEFoBi{yzz%Zd{3J$ZftAwN(^^bWDt0rIC-inDCWq~*RzHf~e z1Cm}mY+v9j6c?eGUWx^g&p-S?a2|2_{F&u}H+;Ttk#sSsScDq-mPwh25kPzg52sr* zp)*ZSZ;edq<CK>OMz072?$FtT004PLSx|Ub#nFICw+Y=JD@82D{KF3hUL!VaQwb${ zn>*0!{e_6T-J%S_k<^VjlQQ>Hb*-gqgLqEYKwze3Mm2ey_T;XQWM9qYX3--xoY+y3 zocYF|*U|uhOLG@Pw|I2fMMSpmO8-}mGyOfsne&SC@f!<g4GsPC6=ybdfvE=u*43JJ zCi#AX<9+nT8xM$@{LeY%%fe+#Fht+M?0k@O+<>VamJ}?5%dX=H;Ds;PzDsvkyaL}% z3#}H^C>Wn!h<Spd2I&XV!t-%mG%U0Z{_#_Bbm1^ePmr985mRZQRcJ>2B+Q(5ego9a z{r5Rb#e331(og!lkv1SakM1=Gh~elI>Wx`oIxRfU2cN!O5c|@;h()oG`63z}H7xu~ zc$Tw$w{RF<1>P|A21QJesc!Gi6(Dv3of^&{N(rr=18ERm&?$P=r(jSM!xX$TTj<^i zAG?*rJY?AWSkxnyv5LbK^bz0iJ%N>)OL>Net_cK|+_x&oY47*J(p;Z!X)tgfxCRAu zc$6JhAY}&j<@)Z&c9pm^LTY|+4-<1>l~31UW^V9TLde4GzG;5n$Y9`6-wf<t0G~KM zgMvH+R{(nuJ07y+^I=Vhy?@`kpiDRh4_Kp@n$@jwL)|T<Uj{UHnnfJr2OJAHIX5>I z%sx2P!fhlOvlt@ooHzx&q-)hf9H`I<4T+Ee8Ui^&9G2lg((cMhHk}+_C*pY63Hcv# zVi<SV`-a{En`Ak^jG8j(CTFF8p7Y!=m=-pIE2G^%^cMd&*fczGiSyO#PT(;ovNY(d zhZp<&$j^SM4c^F9eH-%gH_IVVT5#))cW!d#-{h?Dz2-be+*2nH3$30Qw2SCA>dTo* zTds@z2e<g&aArQ}EF5}Zs~^5RPFYcRnM5(OoS88Q)2!5a-FM@nM~ovalul_))UEQI zoeM&CQKqxOH*_*4Jy=kVy4U$YF^_!-B&Lsj$%nK5d(4W0&O#$Gk-<?{jM-|#S$)vU zOj-uPx^?uew?Gc6g~-FsB(Q>B%^}&d>7msVg7&1L2e%SfdeCArngVP=AYku14qFhr zF+b(BdH8`q@E7b!9bBf<fz#ksQ+&DDL<<HFaN7(sj<S-Uf?OI3HgpL5YzLc{E%QH* z?Fek*(hcc!SXPQpV;RX=12VKuHm09S2bRU)`r!68rGbi(zT7}?|N4gv05UO922RJ0 zZf-D8y8c0;^ZN?1$NT-ZKyZ!B=p~#gu$^J+L#|+l{E#b*_H~sz;Sf%y`IXtan($1a zyyP~7*}p-r3UzGSQTs);LT}%Q1IOUVa!X${pf~h|uHMGsT@Dhi+GTAZ++>6|`!YkY z!!x#%v~Fl{Aq(DxzInD&f4OfMt})B?{kYNptnHk-E-f4a`g@~Jq}*9p;yAxLYtt&q zuy80p=tph1+<BvZ`9X9kVY)`r#!gydIhN``m$2OD2kxc|eJdOX{*ngV$fKBX5cdhl z@-l4uK6LE6LLgulp)?tl=zHvPxRf-L>Efseh7J84*jIbrAi62+M9Q4W4Gh{B1NIvD zD^NG)JRmI)aGYO!HxaWl6C$qnO|qT38+^W(otJ&z$MQ(#FG|MeTje+h;nC>#N>uGf zNxb$X05w?d_q`OfSIdM4{_Qvom;3!IArpiF%LoLf72Q*zwO+y9`%b}KZvq=O3osd& z18*!{SROc_E`&5#fqS51R_)mR?L?+=|CC>`MhtuaJY3=Uo&fy*g=N75KL0z2ii&yV zKq9`2nKLHEzLiMc>fJKu@K0+<jN<MeBSr#y?!)bY`M~)aE5Y3yJJ76@7&-UG9<Xl7 z`KRuT1(H7mML=PqFfCYtTO~}#?s6}tk3>=ub!shDdo|9TYiNFD7UmlU@{v<K%H8xV z8zOXP-96)kSys=2S!NUlLg&g=t4Q4qF&mnEK`;Jl0#~C$Z_Vc;D?@J`1x9hENq7$` z84W()@?W_MO}iECKHvDs<PRHrLvI13JZ)1o!{@kA8~w=+zCgYpAF{_Ey#_jTj{0!7 zvmlQ-f9PbNuYh#|&#=cP89v)MXO(LIt$)9bqZL=RBsp0~+Ww~C<!uBTD#0SBx%0-{ zf<yuy0p^oR->rGjiHvbr!+;^hh!IkxAk}R$Lx|E+((WT#n=3uPf2ik{QJ6K1&*K2- z$<Nb4(>%iu2%Wew%`}u{+!TcHy?6V3qaPUO?$_aaDOX=`iQ69d$4H2-xBJrWy$jRZ z2X2CfMnCYtDEO`#tUSKK5A5y(rM{sv9+<AT9&dc$9@l4T2{FGQX>{WQcZ=RcXP^Yt zb7V$NRL|3NM}cuI>5@aa8AAB_Y)C4l0{4qeS|yAoKK4@OQCv;{8VE90>L2UOwAb7w z=j<0XrrNz<M<wdPxw4?r$*~YH^BYpDdR^7sAM$UUO)9dkH01P#G{H55K#%hgN>4_) zsp7@}r`Nofi$CF7_XXMR#%mm>N~eHBzkLMQ%|ifGjkpshL7t%pY{&YFy@W<ubRlW# zRwW~-+KN{+BkO2YB$W@$z{??w`W9>{U#X&D4hA5RfgtbiFhOz=qH$bn=4aF2Mb_dX z!tf&iAX#hL?sx8)j6?>;sD${0jtdca^g|SFlt3p|ruCkxAY*PZ#v=|c_h~VbcAwT@ zA2+4Q%~azc?hAl&sX-8eaAIl`KA=d+RQ>8p@?>%BkoVeM0&ZYXpRCi{K=L3l$8h&q zH3)9`)w&`Xh;VVmDQ<j2jRw(o?@-`$f;i<Z5_VymJQylwCuTLQ%3kgD3*M~c`~YeM zh)WX{hQC9|ki6XQBndUW_$sU-d>RK(*~Cd`bLIjX8_^)ohWT&2|KZ8npNx6NkD@Mh z%#_>9Dk*iqF+`-3Ckf)u76`ixF5Gk*4P?04Cko|!N-D{ZkqU~C+m*`k8?k`3Qng8q zDh)1xu@Z^}Jim-IX@rc)l7w=_fJ0YZ<VaH+0bDPp%UgJXFr?nAiwH%{GTjBVu=A-r zsIub0=i)<PX!OMCnnjL0RN-nE-;6Ss4YexGZ#3tUl}kyv?8$?m9BVbA84(I=5*Kwx zJLuy!l0?wSjTFB5skCGwOMEnfn+7#MKoXIZ$<(+9Ye3QD6lsm>!)okLg%ALERKKDF z-8;}bz7oME-qfx5L^!*WdA*~d8JOnebc1dBWiqSqh$=qE7=PNArq`P)I;Z9{q1B!% zB69O2k~Fvx!ux2TK&?nKuHwDu8}Lwk{Jt??ZrJ=L(n~yD;nB9V1>bJiynZhGt0^!R z8CI2HI=k5&)HOiNUoNj0pq@RN2sE%)eb7?%V6QyMNSum}$n}q+#V~r%O{(@CxysPY z$h;CCKK0pHMZyO(2*QpbCI>^BXgC-v{xZPuaX{gn9rWpo3eeP?NlNB1iE1dS7Bi%; zR|gFm$P1&ZqQs2){xJ2<SHA=;&hE%A4x&CNjtkb@XJV)fc5@`lk!Nycp7s(rq7(%B zI0`&Yc_Di9+azQ~ytvxB3^>F&X?7$KYNpy#4-7ON3Ek|c`OUpW2WUaa-4AqTnlwUa zEYtne>iVk|Om_Mh71@o`lX!_IT86N0SG#A!Ax9_1hdcZn_T(S^jG14Az_+{?$}5*k z<Kyl)Lr$SaHMKmt1p$obR=dB$-a36zne=@$V%4`s=;UBffA_=99rOjY2XG!M+7W-2 zUZg93{1F5~@~JVify7~6$8PC_MvmyDuRI)j*O@6v^9)OvjT>=YS3q~Ox5U?ZnJnW2 zFNM+ZTcce$a=px0k@<o7iqzRx<`;&iK(*M>6l?-T1y}5DbWkW6X+YIHV58RXnJKHX z4kqML7WF6e;h2U$&64yPRhT$L6thv+BxKRO&97;RzNkuz=y2@{=$B-KRx^Wj@w-z* zIHQgSoJkn^#^a3S<c68T<;s}Oyt4;}b*!hO0-1RV29<||hN_n7n?a$LpsEc;%?jrI zG%*#^Pds8MnR!&lq`Y`AxDl(KqxWy99Pv_`GgP$#0c8#uVcB*873xUmkgAP?n!o5= zfvP7%3C78U<^nM>keK($P*0auKPH=To*CCLoSI4BeK*NRtyrZ{y0p$IWfMw$KwVqi zikhd&<atyyBd6fXRlB?fKvDeiQyS)B1lUD{!W_)a0E$Gz!kxcxtdqWGvrCAh%A_5! zuG$C_C3kRjr%-%!n3lse`o-^?(Z=wEu=@^2%vF{sLt}(GHdAgEWw?NCP^4)3b^x)$ zj?7qW5RD5%oYk<-=s?M7;&mXe8j4+zOdtu6^Na9WL5i4lxT1rKdACHA&P7UH)r!EN zBW-C$J3+)>2cu`1{XtQnRFSA=Sbpp5i<V;~tCq-xj)W2+`jVUp7Hw0>G!yZKX?i&8 zn9=x>8Ux7Tn%G!QzbK#jDBtl=E@Ir|pc3UU;L;CB=nZD>tInYMboiKByo>bFAKs!P zGwYjGS=e33Qj4I?hPdw&x0!MZ1H!#Z;i^)lq$L<XY;&dLE(>weW{1qvs!wI)XO!Y{ ziDRiqs-H^SpD}0zm(dkF0J)j5QMHIrzJ8|D6_;nl>smt+kBUguGg`@Z^~WhAW(Q12 z!VYLwDM-#;IJ+}fDu*e63e}e<Ty>M8`zt1_<8>4yRlDq?zQiD*9^>~<ILV-cFip|z zbXiPfI)L!WLwtx6e=Mn^8o||H*gYa#(a$6`6P8bdyT%fI@iOY}$p}K?j_)W^c+qNg zKURO#=Sw)Lb*JWJLq~djd=%t$zleBsVdX}j2^W`f>P6#-+(!6XhDb(Uw4m9SQjxk& z>d_X@2TB*C6csHz(;^|={i{MFT8nSVqn<;$sur07=%{el8Q84e9Dmh@nY0>lompr+ z>&_8L;g@Vo+9D6a6XT3RifhsXbPN_o)z!^#Lynk*-K8q84I4(PDDYG3GF^kPGUl_3 z2{pizEft@vRSV?!_7#ArNpce3x24`#Nq=K+gPLqBi$rRM59UuoxJ*zwO+4m_V(LLR z-1N6a#7}(^D%DIC#zcU=uR*9eL!*Rwn{zhhl2paA@ztE9B&ie)8Gq7ck2|VU5OsGM z&FC%hxiNcjJQ9Ow2<w|^5UTpyb0Ay}Hr!E&>JmFBC3kMcW`-d(MOAP}QFWNeqgSe~ z+y#K4Mp!p9(DzgaoQJsDh`B%5qB<bk9Ex=PM7m}m7t+;U<Z(>{|IndJgN;^mw-zW1 z21nHeEmWnk_+rsC(yLvG7=g@R<eTy`=WFz;X(>@vPSClW2EN+V%#ac4=;(4o^>Nsd ztfU&$97&yuk4xk!w_Fh*EyXvJjSPPANiqdLp`s`{v?_=dn@nHW0JR}Gv7?k#5;G7< zJ5K66bWly(RWT*x%T3;n&tgeJXGCTng1ChMb#LAf)s+|ZMtehwYPnFZOuVY+yZe#g zKxRIYO~{uXnu>L<4~BK>A>4|}7(uR0To*PoJOF8qQ69mkiC{EfEEUl-`7vpj_X3SH z`V%(vBzMBCWd;*siq&EraXn^qx+`ilm6%tYMafDO-K1US@}xmLnk?~Uwws_VU4GNq zh?3f7iMiEGCl!sFjd_G1Iz`r@Q~g#v8D!{iYAB^hQ<2kZL8RRf7UD<*=RvL0BSc7E z(Bq9|GzsWEG>QTG?oAW28vrD^;`~nc!HuD4QAu;ug&SY4t#n<&=wx4&5A-;mYm($c zp;g>5@kTX`2@7Nc6~dvq2<TU1Q6)0X%sW*91VC3nvPD7NnHx|;I8ucO`tGG>1oFt| z?5H-^SfVmfno6&^#Jr`W+Wf6A8A*A^h{Eb0XT)3v#pg=_v5lxv;zzdW47}-yFU|3) zd^bkLO{*Ts0#YhfaK|^}q=vtDrg|aw?kGsfX-UeaZpd$SPR%Fo(_vH<ZQv?X#|wD} zs!A+%J{nj3yxN{QI>unYL;o8Hr`#%w;s}*{%F6AsSb0KOd0APc+>0+cmq+pKlsRY& zN^Pt>5pDROHYP1rnayr)2TQ7nlt-C1RiGHgQRxy$5)|lZmF)u-Z3ETvAZjAosSL#^ z8k4{h&{v@(WpIIN*4d_P12mb80kutD!Fx<l2zMlPP!Y2io=yN&N+zu_T!zZyTv2}V zMDh{phEl}^tpqTs8FiJq{bDSTd_)LnpAY~=LDZ{h4;fV&#+))QWFdnj5;EVU9WdIC zN(b_rC=wD@>&nZuOo>$G2k{*Qq^BI{Y^YAfpg2|CSmIHNLpxIBC`Ba?mF2Zm5{OfY zYu3et2hld#Vxk`+Rbh;3W9mqbzy`{N2klNYJd_$0uk0FQ)61ktHL*xr;IFcrfJ!5P z2Kq+;2c@I{tc$7*51`1ZGLo(Ginx*!)HB$R!V;6pq?#mSl=IN5Sa~yQ0`T%-2?g~= zSBccZZXCQ0mnX*|gfi`~DkXO$tVF~GrA<r~EH4RI!F_=QJRTDK6~)Z~+~f)##IYb? z2lwE+496B6p@0{Ugz)MBj=h0WoTE7Q;RxWc15R)|zFAKkWq}Ggv)79#MFXBd@Mjc$ z!NH~wj)*xbh&-?>5UX^8;YuLDw^Qj2RtD`#JD5<30;~6<I*9Lz%4F13qHLp{U6S<L zMq{{=XIpwlQHoS11}gy@liFHR=5+<G1C<Fx6C;RVOX3%)f&eH~qA5k1aIy)^O0NKs zLt>Z8kRaEpN|&2T=__cIr3Szvm*zzFLX{Cnz><w`p&zV_;euKa?xIQ}V)OwC%qN5n zDyOZK*bqf!vcXR^CJM7rAj4}NY=$XtC^jk&l_VBLyHi<LBorM`cJe@2gT??V2C^G5 ztqycfYsGjL?&}c|Y80Q1I!BaDVk)kxjAE0D+FBLJ8pW(;QIDvj7)5ySOxf^tu(E!f zib!1nIiUFOb_KuNjTTZPJ|4uQatBdMD-sDItV-IFs#92gA9E;PR}><l-%*K*P#i!d z2&=`^pDIOhL?|j&3CRhiQthe^*-{DGQRAu9x1&Zc7q;l_l%5R?25_s`#9VCQhwebG z_Tk(0fRLgg6ErZb>3TriyND`W8HI`9+9(sKQU#$E>`D(E(y6R1R3rk#m57x5QJKPS z5G+tBVi?FAs)Ws4?m$-*71c`g!pEqaW>KXu++)>(PaF><iC997#L5ht;ZQ<2bl1Cf zC}H{!;czJAgrgyEI24YA8sZ9tQ0T4V;<;->;jkS_4p+|osj~Q|Xvo5q6^_YKkAMP6 z1Tm=%pe2GMfhgFK5G*-i2i3OF;FY!!K~%0Rd=s(q0Nz63K*$pg+0vIih?+3rP?Wrf zgr3V01@LH941JopjFAmx5gjT8JL!cK15r|N2Tepw;*?F<jD`}~RcgZVTCx%gHI^1~ z!9SkRNtHvEqM;<z;!i8JH=Av!flc_>;Y8`EGTVljs+S~)#R&)FgyT4gtrATZP>9T~ z5~z4JjV0Qu(tik`#2g6K7hZ({mXx@vl^9c`MWg|n<c}ReB^;_XeGx9F|G=uSYZ@3L z3?#H}N;tIevxCcv57?nPlyCk|l?#4S4TL~inS?_ay-?R=i9)K%tgsb6K<$tRRz-|K z)OToCFFJ?OLDlMr237Or!W9fA5UK||M2(PmEL59}3TC0`012cD2?f<T9e|igjebjD z*GA;VwG*5&0wA*Ey0d@_({wE&fieVx!KWOnsKg(`L5`FPaM3rk59*9Bz|W~3%15`6 zU~trN)hmd#mWu;rUK`E@C7pz|5Y$yAki=ZaaZD{0ggiiw)ga<lBuX;mjd4PG>9Aq+ z5)W2r+jx42-l!oCIg}~a7h|Clr@agG@SW|`3&wvJ4n6kyw1W3OE|~ChX#1psIkC_w z<p)Jyl?%QJ?J3^5dqMHsE%2aiA$U+paq&vvi@U!DAQ_?nnr_sBa4FQ0X=;uFxDlc4 z8Ut$KIFoLySNS8mGQx~j=-<RB`nMRSq639DS%;#t!j+hvW1+ePHM$U-wsAx8L=tgR zj@#EV@ovIOY(iWCV@V6vix4k*3UV633D=SfR#XYis1j>aPZ~EGY>qKhL`|-$Qkhj3 z3<FxS0^b!vTotNe?)o|d%R#)xJzelIJZTcuQaK>pprU^e1HFy-s&cFGy(pe=ZxM~$ zJ>mJMp2}YzDp(l$Hh)*-?)-IM<Ug=?<{RPs<&l{m+EMS0xfQYKv5|#el)w90W${;` z4aKFA1wTh#|2bT|F>){#wIV#CIP9n$Nr<9oM*={e$YLanhSF#vi;+syIxOR3OGhUX zi6*lRf3}v;77=6?zH6B_wtCSL0|sIN^Ei`mIGR8hb_o~|a^yt3s8k~Ccre};HAv9~ zj4IlY5L5zswm`;?BoQ%bJCTsmiAL+PhJQR&pd&@EQUSW7qelf#*8XT#K`7f^!`nf0 zD^sMEf<fd6M`NNm(p9vvC{@U-01j16Tx8N!5duO=#a3=qKfx%whCwt+72sb>oFjM7 zF8OwK{`zeN2P2UgpGIbU7ula*9{J}RTM8b3K7RplCVc;D1-_auDlT5Se`j$;B(k6+ zDt3>&J$F?lH5(C~QaO&W;Y5N)wg{wfqMk_9ZKQ&$v2GiOU^SVIMU%*s+BaqzV+Oqi z-BSWJ49@|ghKecKJ{)9*?reMk%oCfrQv5^^i_|t|L#z5C`wFlfO`%2csj8`ROjpUY z1o1&IBQx=m3Bx}*sWhCDyC56LjB64)j2eufdI$pqU;t5-EC-Y?Hx%g6VIww`3hCKI z%}{bh1Sc~e(>oTet>no9C1zZbg7N06;DbJ6Q9I^D`^KU(mPVto=^M7@Bk*T@7@e^p zcCer#Hvi471uHjh*c*#Qqg&@9@MF=1%TfNdxH1}Dum-*nUGPgZy6&}k;aChF9Rr&< zaDi|90!_?{#^mtgI~g5;0qv#)I9pjrKsEk6Xh%nUh47U^XzhZUSTsR9M`I18flbmJ z1s2P+i#TM%3*bn!jsYMf1+{TqpJ<3y|7`FVjwP~AxdEec!IRMsi}j=%PV#YLV42lg z0AjcV`a7tCbn>y;$DrajxukfoIB4pDjHa~BbuAZOphadNBOkG7NbuJ&5UinoDHfZR zAu(x;s$)CPRVtuILQZ@t4fa~>$3H+?;Dp@3Qn<2lI8-9~ur?M=VMl&Qu&ERYD82P6 zgfe9_#-zy+4kQIQC9FbgITkz1j=><)m)Nn`^o^l{Ph(s1x5s8|gy#if^WKW&FOJ0m z0NGQ#KN|BaSYgMSgo{gJJBs(jUjGGu;oY&HiveI^&`SUgI~wx>Jd6r_*&ZNACEIz# zVu>VYm&Y7CB-fT5(SA@Pn)Rqavx73E#7YlcfT2>Z*)C*YYcvAAE%bzjK#)4r1~`_K zsD~wJ7ne5Zk!BK+DkL0FFIdSEG%w`YL%6ezJjBTE(4_VNm~cbJRmQ5GuFSTPnTDZ2 z)#SBf$;2Z^BELb0SCrD_o?Viqjl6-H4G4ZoM?z9pB&$7)b_Bw4B_hgDEJgc}0_e(z z(vVTLnrh2}&K=YeAMIFfq%B1`hS{+<cK0&dK5oWFdrLt<{+D*_?oD=CLC{|Kmc64O zzu+BMy`nT?dls&a*^Pe1+IpRBFWip5%Hp}jE55R4*_Ly_eg)^<w#Rn%qVNrlAdY=F z_SiddE|rqyd~7=?t;Mn3_CnGyN;~XbQhUJm1R`bNClF$1au$pRZBJ$ROZ$L82T=VC zwhI*dZhSAZr`a#!n=QNS4LHAzsifsp*dE6|^bW+Izw)jvDY4h4l&r-EfA(4jM?%S3 z7Cj|vV<ky!Sz8iYYoW#}sa)$tW4OdI*I^gfDM<z#|6+nAx;9BJ<2~)Qjai{E#Hp}~ zNGK|eSV@YoB8=H39&%!r)RsD7C5lU%Y~Y-15ZNUb=tkGp#kByD603+lD!e8Nb>ea; znN7(E8YxK>W^7>`j8JL^dWhkuBTd3KuGv@;F{FuCDhMZB3RaX9aBUO}*d<Uf&LqKa zB_9I_*a1TkP%=nVAd(e4F(E_T#Ndb^HgHCz%-+Q3tgRzr33^}`Xuv4;n4!)-!Xb_8 zl++W!g}xvmn+{l^{^c;l#DLU>0@x)9>`3!c?W9ZSh%iLHYr81vQtA(^G5u_?Wpocb zYfFOSNvyF-{=C2be+RkINw7;-E{+r@%q^Zfx3t)rYvVY8BZ?zZ>~&^67@OsJa8}Z+ zM_&ARkG<bPkIItocYfy74t`&<6Tbq5bE&hFwIw^Bbo77C-sE^9--L^kfE4*A22?>D z{3iN<l%2Vi#kHJSvmTUBbe8AC=mGr3RLa36_s^XD$|tc3Ct+P-;oBgDuf>kTvk+pz zCA8V`M&A>p`we0eB9Vg-$z|S|Wk2YhH9vaLIpA17+l5Y%x3H)J1U3~GE(HO8InJh{ zqNPG$BQ9M6KRO=!Yw99e>=*%@xnAfhR&0Zg7ZQ?MB^6jq$(-;kE9ebANVUChmpKQW z+V-r%!dpIgeQHqvB#C^NlMuMG@R6-fZC*Lf#=@edAtxbtN73vERau>ZEnuMZKymVd znDaTvg5<Z(@>p@wO6MyOjDm|uanjq)Pm7&xWE0E?2Z=#w_Cb4=XAf>a9&~WWsnFVw zUpoAmdNn+RiV7b=6Vz@rz<TfzE-Vy2l9jvIGsdc9<r_6-;@s~XXFvSoYv(H)vVZL? zr&XiHNsFCd@JF3Q<K~?e#NC2fiLmqs!cAgXVPVm(u#+5lqp+y(=?c6rzOkrqsm+R_ z!osHmF{gIylc|MMi=Gbem}wV!=DZbl5_dfO@R|~cu_Wds$3B=^R5<-3yGnzFOT&)m zR{$r?dCPI^4-y3+=rp!JRYVS~{OQkA3kxxXr5t?yE)Xg{Xgjrb%zk){RL7iJ<xdw* zomDdDiFcu?$eSSibj7z-!bjhV6raR6f#UI3fw|%0;$plRAAl|J6?B%{#ZBMBTG-iE zT#O$$i+)$E>ZpWO>{%A<f%^)<2P3mQ&*7f!LFn@i2=rCdNuWmT!n(Is&>QFz<wdc= zlp<aS??j7Jlv42nSS~8OE9_Y7!i7org&ik2B~n=L&Pvk-9p4Q*br2r_yxR#*EsPd= z?hJ<ES$7rzM?z7BvoTbdh~F+-R}?KwoEk$R3@WhY0d$HMCjG;4$_hc*b4$glxZp|A z*B~xk55h-_&wbz7wc6QI`~iMO%W=MX--&K;oaNBS+m5rX!dZ*2tzqXIksNy?NCJq% zSy4^}W_e~qZUo`ycA>Xua*6Gn`&?1s!sxq&g`c>BKUY}z&*-~FMV~s(%V28l{w+%* zQAEfczm|rbRQO5Z<gcG9ESk8B&G#MLcV}VY!YT#83+hBS6#hT#y;+bY*Lml6>sGG- zh=t&yg|sMXBx|&cLz1m=*s>!W*2|3j;2AsoFb>P%aD=ysnXm#SO1A(iNKr%P?FP_W zRe|ho2p~X^sA`A+(byVj0F8w}lW1(+=mHu*@B30q)^h7EnR)#Gecw6v7HB9uF)w~` z+?(53zWsdXWS%ecG`@9dHvFK`SZ4)BAMb`=O~ATp=z{ywcc~Xn@3~wq-Zk1dFZ5O8 zOG*|!A?#_4etYKXj?u<M2$7)1PX-bhDjsqF_(idOAzXMb^rjAncP5X9H{K2Ja*!cB z6E02e3+E4q>8S(Z{4=ZC1;&6p!uI+O1Tr6nj!NkDM>Ox-_|ig{Z#2f`kFbL!ak_|h zCc>h~{-`I{A*$NpdPLF=mDoR|TDRykeP<hu+gC6GuiFXhTGUfSMq_=-E`l20C~#== zw_gdT8lzi_@GHxm#~O_jrUOfCYz-}ylUPncj4-T)uF;8s5Y`k=$Si2--N~WHbl3MA zZygSAP96?#91d@BFq61A`6Mzpf+$=D@|C##Qf)yKPuqvSCkf1j^-FuP+x?40<9abF z{&5LmvC~*5)*GXDw8gqw$#@(8HTqH&e(^~ONGZ3s)dF>BdBdSvCv2psjCr(i`}&j* z@1u>ct@Oe_a*wYH5>NT!*M+z-dL~(*GRJ}VHC41CI8U{oq1D_E7q7_$On&~oaB1Ij z?}dezL-*Y>{7i?#I#g3%R5SQ!E`0EED5hKCh*;Mjw;{tZ4?VnM4!XW$pZK2%YiI9l zG&1zx+_H7c-D=#f|IyJ#bIUdomSp)+2+}`7kjMPRC&jLeWK@nqEZ>3ttw%8-sEQa= z`sn(W?0|d;!HyDw7ZsX`P<=;b9*}c9-50{B3*ioZ#nFTyD_Xm0E0hdOV5mH+K0scf zoV;#oDZD85x?$hRGSuIg)Lw6wPu89(!|?3n<a_eEC*=;$>W@35n>6*GRBX_-utCo4 z_A8@}zntlYwMH01pXqteb<T7@dXKT)K=%^X`|vfdk4H-P%b#FdT25?x{vC43)&-vL zg+FlJo01ntNAE7f{zk)eKk9-Tm+!R{c???JXk+G3-xt=am6vR^G&$9g<(HH7$A7H- z(BqGJH$3^IuGT*JcQ{PC%8ra({hk|pwSBG5pIWg_@Q>P$oYa>Hf81zn3HQpAT_`&j z-Z5FL{VL(E3uT)GY36GeLg#pi9=|qI-~^?}bKz&BVjsml5UK|ojR)Oe@NQ=Rqm93s zDXZ^{Hr725O65P$4gZA-|J8-iK2f4lajUWuaC>+Al63#Ru+!$0IjXj!!nYszuA0VH z(K9*<f#=^D=w7$1SNEZCaoIB`z%Xddl)8aSaNah<K-Hb?8+S0y+y29=delI-w@CLh z+Bh8Yo?3g;FbZ$3Mz&sDDPcw>HvZ*u=;?Cw4mH`@$DM`-7iha2{Y>KyjYQP|lBd(G zM`O($D>IGJb&cCa^6m5L^;A?|^)t&+FvitNyK&2z$h~ABHsv*iYgpfQ$-9kOGckBl zBjfJnmo6G-;%aK&6D<t^myDlc`|y*Ox;DDg+`PK7zd5Ea#<VAeZrvjxoNP1>$lO;Z zMSP>7&&Ukr_mz!}UsF@kNW<7!Bl{cMArpVG47V;w%A<{k)P&`15BR<vHZUr=eI+dH zRDb;aRyzzW2+FSu%1QY@EA_n)K2*&e$5rwKXh|Mz=sP$YF5cA`eR5hU!oD(DG-{6| z&Q634Rd?pt%a4nx9EHhLKb{<#lAhM@n7HrB>6vaNUoU5Q_1x)M4ZJ$DvrEOYjx)1M zdYnDn(pSoRp*}y`?S}Od;>%%vhEYaqW_IP0(r5H2Xn1*MMxkX^HV^B2Gir$Kt4oU- zSDja`n$~mjL~S6Z5!SYFB|PDS)5GDluvSk0!98Ec3%nMaUo3HKwDAljhGs^4joRBk z`DE_W+izbu9DWkkU3=@vNB-{M%B!og|6Omi7J}|){hpoMMs8ra!z=A}xMw${+^F}I zN)Gpp-1+u&79Tal#}T?mj5p%()>Yt?&=ydR;polWT>6i)I_t)JX1jsrX+>#;gWbSx zpoA4Kc{Jg-ua3H=n%sqp#*S)r5><xghE$FE22YiA)Lpbc7l`TpAOn8<NlE25;o_C+ zc$;o@x~g6DA6*n;MbBRhiV7NOP-662G7y(k2YE(Wa0jg`#|fW)M?URr^rmkF9Q4`& zb@=0jsGA`CE^ie;o}Y=lP(c-WOc5UgQLw9RfGRymA<ZAl7?wVd#*05RfCq=zJK9F~ z!dvm6C}QC`l09MqZ_=xq1th?5i(9g3?v?$1d7Ew_YMy%Z-zxQ}LHPNyo;t0;#KE72 zaPVh)K8YY!Ds<biU89*D>T1_j-)?FQ+5FU!(}nWy{MPh+joqEF_D*#JcW(Xkg1ze2 zyC$mT#zb}T?#AseROOvps&ey|B|XSHqwQGroc28KE9@~~Wmg|-zo3mre@CkOw7;gU zTRo-yo7MB$AER`o{3sgG+<p1s(P!oxe|7$8-7szznmf0=uA&#Jx3yo?_DZ#_0`Z61 zp00kV{m0cK+Fu+1nl8&PRmFDs<|lg}jUFhM8(WGyx0IqdKK<n}>xw;IO^<zx^kCVZ z=jsNvTI)}2{Yfp4sP*t$a|t}g)kT>e_4;Gy4J7i5&&`7#{{q^d7Kdt>Jb#ouz{oRV z9{l<vVSfalp4eA|C+1{>k>d6oSr=gH@qpR!#%J8=vA91-x2Nzmt3s)j@&;-}I(gJw zR?E({mxlnS*=hnTJ+5By2j`KDh^>`G(DDb?f^84<!2v921>KSfI!*v+W~I8xsCL>Z zpi&f!GSmh1fZj<6k|}8eQSsEC`3jz!*O9EwOm9H9hxbbA&s9ir)-vixHDO);Qt!^K z%-|dweX&^5t<jxZ3O1&7gv4fU;&F}5^Tg?+k~yHNxS3fWs<X4BrW<U|hlwiY-y{UC zOKm>u#gq_$d&NfTkq558)E=ikgT{OlbBC*Ex+GUCTQQ#%>k5I-B<h-}J!Y;T%x2UK ztL9n^i4vJSG*ptL&1D%zFRq#0SXtAgDyw;qIQ0dwOp@78={=`Z6USCvpd?XkAa$~< z^7AU}SdAxRQYlP50(`CKf&(EKXpT0Y2pne1LMlc9m&&bum|n~FphD8X1iz*a4LhPi z<U&SX#gwXR)Mi&9oB70=rsfi}&IFqBG~j?a&S5%OK?6;cYR9##1QJoMO*cXeKf`Et zpoHkxrkU*iTyL{1tyf%W{F`e(9sP0d&MiHqh(4QF7YQmuAOq9>9s&@<M3{|K4zurR zK0VIhr&tk9kppMN>M~Kz1h^(MZQ`8CbLtkWr`Z7)<0O;;U{9$LY`~;EP}qD{-UAYR zx_(JTJH>U(v-@9HHcL;?h9-}D7RABzJ2a&YII<)0X5b-E4FCwvYn!NqIH#}Jfb09f zl_-t++&*zOy;uQ&c@$QRYk=?msUvp6iM?^+`!NuGc_>&Sl8KN#(1Xy0m437ilG6Nk z<d!^AT;Sq%MJ&gTx7QomHeM=X;r*(yVY1WRKHlqYo4D4i6>M|buJo>G-_zFB_Hge$ z?U#Cj($>jNiKNx5boRQoLfd6+CwphKKdS9Suhnx;R-0bv4lOKS=qln!+f{8XZH2aO z_g(Gxck8`wuVml7tm|cM?`b>VeNubMU(r@}f2cjRs(9?`xYT`K`{}MATDQDrnz*zS zxwh!RT`{!E!^~2&qDOZT!$^2s5s!;Ri{0vBWhrP4h=hCgh+89&jeVg6k9JGZm4uMB z9U-Sgd9CvZHB|tE#j&YPD?_n}9CD>Y0dbhCgF2TCRE!T3#)1l!4yu%hfDoeIEKE{( zJaE|~kUc6-dl3naet@Lv<VrJWUdRcpbwCM8E*_64^x(84wo)iO&TwTA`e>|px}7>j zfFe+ka?lxL@PLYH2%?N3oL!HSjdJY~N5`+zol}gT$n+|Lb-ksM)9sk1>(lLyCT}~n zw!#f{RCIZ#-R^YS`gIgO&qceZGbJn4HZj<)>s&#s%H+z=s4d)9TiKF<P66u0)TOI{ zLigH301E9}4P+lKiS4#R{8UC!{03o-0fWGGWQqa}h}!E_#|nc{=A$dlWT0LG2yzUa z8@TjM2ZhOZ^k#u5lJ#f{!Uc63Roxj@;&oi;$6r!&l2wQ^5u=|JvI?hRSIQS-B>-_6 z0Xku#7kC{J1#7*|P+OD?lcX0$EK}t{B9uyUwqPw#%7I8|&`kb11C}IQwQq_T!D<^q zl)>p7p-U<t3eJE+*G<JFN{0gKdSB~wC}u{LgGuUoN+eDIu)(ji*Gmi$9O;sp)#i|h zkJ=E~0E7)UxTCympw}DhHHXSxDBzuo^lFCQI}nq4_rQ<#A_s4eaH&@l>{SI`KJxSU z$_Fn;*qcboj&E83Krj~#mc2NktCp_PJ4(XO8yLJ~!3z}r%7s!?FTP9U?^Ezz1x57M z1uuWFZz~}Z1_*zZg)=gERYRzN%gYkW_Krl4cQ-0~)kX3$guL=Xox%$6%1a_eI<XvR zw_H0K04g}E&|z<mI61IDeV`h4dt(U#sG<i=Mi-_0g&u!x<!r<~5Cf&t3r^0tzw`rd zE^@tAB4|L;X1(CXqi4^Z)nB{nTzNK}tIldh_UsLoa!z~x)!7Xcva~{_D8V*NN_DQT ztU^`S861iS1JylSSAn3bV8uDA%2^dq##w#Q+m59b8K!b+3Dvo^y3pT18(nLasXvf! zva>!t=gt=A)>!e5kQCa=vn3>H4_c=d)Z(dM6;QV%7=}v~&KcF^+4Y7@mz8i2oi*Ny zv%^Xi`kLTEtFpq`HCB={ICWI(44hX+BKj-Gr3C#E;2O&+&vuR0N^q-lT>}W{C;*U^ zXNLh&p1n?h99%*LQqzqkyLdnaedm^~f}z(AR?q~xf(jsu5=z^_MHN5{F!XDP5u*xl z-P5Tn6YGe?7zIwp&4VQHTTZkaU4vdiP-+ih#UWUk*A^;mE85O!ThcbKZ7#olA<xs_ ziYzLb;=Q<C({VXpyI`fR=GDTi5{mq)_CTXJ8^sH46zAB@Nm<Fm!a}}=$~p$6))rdY z5<Mx8vgCF0i`sLwtgXoFs`s&-)fQ%S^m?Q$Xrmllor&k3+sTK;kTJey8rEQz;sBru z#Xizj8Tg>HT%-Yrt)s06$)Xri+uC3mX31N~hZgc{lEWocno|NGDOA`sdk}PVyr3i1 z;LPO|tYi)d$A%aI@V2&2k}?Uilz}!bzzeGPwE?_mEJC&}l<8WYo)*qaN;&7*ot!#s z$Gw<I;%q*Y8x@J+%gO`^;(=PyK{9I^gutZJBm(q%UK`hC4wq#j$O|9JQC~Mok>WF6 z0Go5M1GAM&z>)S?0BUn>m%RKHap<aWwYUhdk#wDo6>LE|*nmLB1=DaU-pNTv8JHpz z=8ol<AE-fzIpub&W-@ZLbv8#(kd27lJmJfABttbuhNopWa0#Fj+8_t(0PS+pDFuK+ zp|-FAAMDUiLB!uxddN@d3=sPyDjEal7YF1*23TC&*w__q6vA`?2ho57#kIUlCI%m1 zTyj`#15U#7063Je35@YJG;L6xQBv-0I{#SbSV7n7gAcoKi=ZM9UDLElB~%Mi6ZAnR zxwH96?Nj@4%O};!Q(!*FVF4Ox!6Mb?qXscrL5-=jbZ5d#QKP4lgLJf281QI!$YwdO zzw*?zJg=X5@)er8lz&y8R288IMU_~pH6uqA-655G#yZv9L7B75*O<G6QZ_{7RAWaj zRakC$TQpu>1Q9T7qEkE@nkx-STP+eJm{tm==`G2c%7P?v!V1<b8!5~Un%B`HzwzOb z5Aw?+cjx*3uU`K8$fd4}xI&X3jf_EjA^ZGsIZ`|5+^|1t2&2EjmYhsvB>zOEC5Z`p zMpVl>2Q%_UHf{KW`Q&5JHRtdKBr0)4#j^&;WN|uXxu&9@aS^({Xd1PJ*FVYNfsv>3 z_eQ>YIp4M=-~8v-TKUF>eYbs(UmSTdm$){_eqMU<qo+n1s1Oe@4-2c!g{BC6*z)Fv zJ35<3n~>zaRRyzNc(@=nLs!78$>cKm2f6^X?l$YL&vj2qYUiYL4I!Mb<dAVlXIL*1 zh2CY^xQRye#d`#r)4zXwWJmtQZ6il#N1n|$|HWIQw>^>PkB^SraUef>+sMeiD<jV? zd~nyu$lvzzFYexaW&V4cujKb{eQo5nN7Wkh6SrkLe4Iy9Kx-!)3og^!wJUN-M7dfy zLaO}jf?6{aBZzCsu~az*aoNEj$P2nWpRc3&Yl~c<cWfIcM|C6&dUuHEz$NY0!8v#l zCPzwL%vVH#HR9jH=jQp`=vS|ekBmI~;mAk%og=qx8X37Xf9KP$jgFi@`Hhi@xAKo> z@^9Vt+zWe({HFPDfAv!Stv|ms|Lu{HyGL$&RSjwUwzrTopwUdr`U*%ostv>_Icd0M zeF0=r0%37ZJ&e1OK;4L7^QyHV;BqycPsa`|^-72t%!xVNj(aJvAsl3kB$KHktRALs zhM=I`{7d(b92(ho+uuI(7uWL5BL}n{&GW0L?;kmwKQ?kqPJjLzBYUq3#pmYl{EI93 z=C59ngx<;zjO@zuog;4-NqIPxuDLoW0zXti;XB$AmGBxn{1s!BRswSnOCkCI7+%OB zJ&lN{MrtztcXeLc7$XU=<yP~yGT;?emog`(;0+x)cd3iE=)lGOE4Tgi$eC~dIoxdi zDiSz4f4^P{kPsdlk>{%&tVV`@C^|m7S!%yi%p-uKBiX{mk#EpgQJ0N1)j!r2@KH(Z za7AwF(bP0!2`2+9#v@Y(&LJ5haRYOfLpgE~BEp0*ppwRsd}^CNO;+M=9<in&B!ZmH zy({vHpuj2;YOVqP3CWxoxotFmaAf4=Tzp^6H{W*j-H`{8O8(=K!y4tzzHr-ZlF(<r z{TDMcqhGx;f9IcH%U{3k`}vgv?_8E0<~gdwA|W&BB=!bAM1n62B{pm>d$<M&M$>FC z0>5cMcoE6aHIQ*!n>t_#5$;b|764z5?d_=b?$CjmATopu9=NYQ(GI>mH+tKB`75`L zoXF?DC3e1j+u?Udz9V<{%)*|LAAVTn>*n{o`SHleM@4??=8^lqF#^jY_r7!c$f5kB zu}7sK^RY{j90nOnvAH5<^ap7)aukDu4{6*9gRwqkt~e-C(b{D*t@m~2z~Ne+QF}}c zz#nOYJHP3n9=#xZmexsq>^@Ykj{X5%AQNifZy0sBH>@4)=3lx`8vk(Q>vQ@1X0`Y2 zw|#I$p6-Vue}4J>k&$mmmz%4R+9SREv#*Yf>_$+VN3z>S{w~ko9l0BbNz+w+gS29* z0e%jht}Be3E7S{(uzW%rwR^@Z93UVcr2JG@ZoOzZjyn4aw`$(TP%>2!l>@^xW=ta} zzA$rG><a_4hY<9`n3C&gpn!2I1S0xMip}M>UYyG>X}~vsVa~das~4~3s&(Vl%UI$3 z=C96NzM>39t{6UMnua9Mgz^~1k;k>;H`7U%9AO1t-I5e2x?;}G8MDG<#=aLBCVE}U z)F9;}E94^ya?tu&b$*VP6m)^`@ZQvd+<xa+J341W9|=akRjqU}uYcpuFHxQ?x$Z0G z(7`znv2MZ`-gptTfq4{Wl&GERG(|{B+8`Y=dNz2c{59Hx@^y;MBymy+Q39M|JTUNP z1)`Jvu|Ij;)J-M7vdZ|ZGZ<E{*S|+bu*Z+h^)yHshIPn9BZY3>U0(EQfM|PDMSTA3 zz*wOhIBpi7blFb$&zUunO!Zka_x_!gQ|dSR;6vZ&5s{#~Byo;h<4l$YUhJsr-0b7U zenU#$hf0X7v<9Es7z%`V+juiu;(etqsz4%aeV`4SF{tUzEA>;lg*BLw_g4SW4$Tb) zy`a?vKdPFuRtRP?=^z-%VU+G3C>L!FBZsHxwPUY6sEVGU(+Av0{X(DZ0Wg@R6r0-+ z14p9?n{y}Av0lgd11z+074KF}^w7wL#Gn$o>oQErqAn23nc0y-DFg`v3AM}LhvhI; zT4VGsn>r{O46w+C2-CUUM@A9Q1mw+(9eDW2o}?tYk}m@y*nyz0nQ5PLcxd&puFL$e z<vCWU^}BiW#MQjDRBk8|7jz&zSZLeh1==Yh1$Jx-^8<UFrV@n{`=DHoJpsm#pef_- z!G(I<QfbFBM7LS8;pK{DU5fUbj1(E+1}K5-K!!|?V9W!S5Isd*<<1ZSd(R#lq6{j+ z2qid2y@+n1&ryAv2N2xa>yD70l+QB)vo)!MKH1Dk=emnG?ka=f1KD_oUg_@Aa)E&& z?RE%3cn6MVsUQJVc`2yK2}(%Rd#Bn8b4<#l{a87?hI(8fb-HL7u~}9)A8?iVb$((+ zs9G~<_8`~l8lteUfzrmF58(RBhz-*qs)*g%xsvQIO_gASXEi|XCBz6HRhXv(wkyxM z@uuWvYL66v;*J+J`11>IBT!=l3!}|RB+Uhb+A5U~3v0pQSj_Ws;SkJ9p|Xr#BhlMY zRh+#Jk|zWgsEHI+R&B7j990CQR!pix>jvB!XZ<M9r7>Z^Iapr^5D}IdvwY7&l!w!7 z8jQLzgq78G*JMMIBv{I?Dkz#DChFI;17rld-T(<v^xZHD3BH;8gG;*`g9#%Ffx{cm zptwixn-*ANVQ&L2H%2G+)XHjw)GmY?ML?_p#*i^$)SfE3j#SR&Cn%!Tkx-PDXs}IG zbP!^QCIx8JSL%p>(KjHx?QrF1k!=*GVv(Ns=ppv%{s6&o(yCKcfUsR>QUE8<^Faw3 zlM3X;A$y|IF1<IvosjQ(iB9|HqEtQg?}<nK)Uux*{rc&tKMyyKVLuh_&zJpl${fPa zm;LnAPv`j4%YJ(5zXOEDQ0vZwH9wsRKb_h4$uQoCqZNjGf7^IwHmt20C-nb&ORXHb zcORv`eIk78?<utuhMw5h3!nYlgI{m#DZ<rnH}3dQVZkT#|2eRc6;*ijnIha;-F5q^ z(~Uz#<EipUV^;A0pEaD^X{#X=q9Q!-%*DpC;2-={nxe*xCQy7!FXw!3-`U1WsJ`_R zq4@i_Fcf>Kap#ZAym6%4cwO&PTngVh8U7wNglVnbozlxbWmtdbR=uhb!YRFi@<yoc zJQ42tdETSouZ7`npVq9q-m55o{Hdy$QPk<zPdr@l6$B!mk5mV>e<Oa_pr+`s5bjgM z_s=R2w7j?azFqZWou{u=L!IKB5?@mgVlDhs+lz{9<_igYAA!n%=UWQX)p6|)XuG7Z z4f|IcIFiT4`GtP;^L5i66ii%f{BVYSR)UykHe!xrY%}q-BoSLYr(}gbTFk9|i=tFy ztpxykMUTEEGFNad`j#kP|8B;D&U*dSjVj<I7%+;pwOI(XeM-YJEy$N|k`UMnAs&S6 zF~{k19PtAo{s9gl_L30PQ>3L6PK+`sN)T@;aG39L7}!}$BCZ)k3JT_6pAjMMnBt+j z-YF6UfM_3siEEX`IFrogv=Vp>PLGWaf@iVDkY9L2wt)~>z<aWXHVZ~XsnBRc<T2>* z(Z}d<;|R=Xg||>`q^gtWBBKhF3%oU_`ZNKr3Q^ThC;I9U0jbJXl&Z%u>)R)~QlfS# zC4RQY(miTcRrrz*f1+ZovOroaZ7Y6Z$1sqqk6T527S`*?!9iTE#|Wn{;8<+2DoAL` zQJ5$gszPDL{aP_>m#A8{6cy~zy+EzXRw7R4gO4b|r$svV6simq<Hzwk6MWJ~L7T#@ z&~@djfRhmeq)GQkUXR?hj~S^Pp8+CNI0pX$*FKJ9-zFj>#u$4oX!dUq8L?FJ&~T!l zgKhS8C&TYS+;G2&C;P^ekuOXXgJ>5W5z#Qy4=(orX=1lspGe)pslnxjAbPHk;;;iE z?SCXGezXXlEDoE{X#Wrsh%J`g*^5!s3KNe0an3?u`Jx<QuoiKf;%hk)4lJ4#s!ISd zak5>)h3!WWt$ompx(YSs({MeV#=zZW!fY+jw(70-8eCfVuLllW1hjv4ZY2f#`X~3Q zqTLVDT@+YCjALLlG%Qn^PoCK)>k9w!nl56Hwep-&#o{UiRvVZ8finW6Q(QJ_9#7qg zA8#YJnh@d?Moejobe8oX1u<}w@oua`1ApR=2X&J8fZ^x%=|FwVOB|4J(JBQ0=%BuI z=0ZZk@v~<LYlScNr9A&6Aa(UYFcQhqF|zOY31)VjhA;O0rDBZ<Q~sH@3%zgjzN=%m zx1c?d$j@tQDV0)>Yr8;Ha<q&?3LGX7c~;v+eE@e@;m5semPkA@vC7A_^|TR@Ow@6& zyP*AIOd<D7mm0(<pVs!aHcA}U_Hvh+L@v*3Bl`J-HiwcX3yI*3QNbP=n_DojJ}zm2 z!|6Mk3QSDl!)51Yi<KqcB4Tw?#*djQ&eLLN`6lJy>yv&Cc!GO9fS03(^>+DGs)gKE z`pRVt*99-1wQLi_O9U<fzSJj9ne+4!SPu|RA3rtlUe}oN@555darlQp)p7~!)t{(n zuPX`)15bj0Dz6_d%{ONK!=Riw4GIVqr^H3uw^$WU?A)XXZIcXy5>#ET3NiMO=^{mV zg9zq*$0tUeJF#7Muk&<+<zE{m!7gDE>WQybz^?YaBu9Ou)V>7@R755|leFT6tH*WQ z>u17wQUye4GYemL)T3J!9vQ=UJ)}2<$a<`;L`+nyMa$L{CoAc3tr$%06;P@m+7!yG zi?tRVtLRpXKURVT5_<q{Oaz_*taK<lx5hA8C8aZx2cgXl!7`=x6z5D#tr1eTH^hnx z>{LY}nQwF|fM}@of#pF&w@4(N0NjoT9V=)&hCzGOw8#Ehj4)^vLaGX|YEX<@;40D- z%tR9_!y~W_p8{Jw<hK;2K^(HGfZ7B|{5WV7^=q&{5!XyWwnvN`cp{#qZx=HliuR2< z7&v1OW>UbmG6+6Khfs`ey|$#}b(HE1Dvn)0N<@($UVS>*;;{(}CoY@ngjaKJ(a;`o z?Sat(rRZm)0ko9yKxyEB#AC&WJj!|KsKwpdr`A^#E6myj1P;d--S`1^57*`U_Z<tw zC488;Wxm`_FfVb@1mRjNFA2orR;+3Os1$bWVYvhl_bdpSTp$q2n?8U~t_T$#TX(_g zlQvjiVbQLPFrtRRRw)iyl5o;<C8Uf5HGSMZF32FM5EE=0U;p=L>j=_#NVzEn+SztO z!D(d&mma+AO#6BIB)xyI-sR=Q_6A}xR4Ff^bcQS@JS}oSMUOJ~MHBoZ`$hu<cKJX) zg61b_#u)V^1`lC3Sc0OM>&h085I*lyk8WG}#>&N&TC1z=iIwNHU(q(J?V@tFX*mw> zz=oz<)pA{{bm-O0*6^}Udds2JU9Kr1v`QU&%WIXoylfZM@;XkJTgtw{lkM7bsn%H@ zCcURqeHp41bZnEf+$xrDiDkW_0WFp{IzWJSme+70*jAyttb0tO!Y(TVSs6&qLoB_d z^OXcfP>fJ0PmICdg295Op_Vueku-`G%M~m_0APzmt#j&}m7Z8FU#C+1C|?*3@Khoo z*mb$wYYi>8mg1#O+bV@%ymYW@&~`<JvI`_?;6M($J<|umODRxGj*4?IHHi_f#0?U$ zyl!Hnqid6nAnQ8|f(Q;ctn7NN@t}*kP7nriaVlLPb{$7&zLF6O$He7wX5vypTHuE@ zk63bs^=o|HqtaKzS=6#Qtm(wMJ4IY1iPeB+wXw*MFIQuW)M%BRSYPY@_!2j^hLEr0 zv%KW14pCX3`tX&7g01EQ43<+`5hh!8C*}&OuV^$_4~NyF^idoY=B%a)JzpzFMT@14 zumB^AM)8cJDO3vZtgr(kB{l3v4yz`yq!26lKuB7(h!T-bTg=B$-RKBRRG=Cx_me8S ztbD1VDy@XHB)DnGA}HWmT*T#z^b|(dgSCeA@eo_$2b$U7)Wl*^R{i+gth=a(&x`ei z#f9FYp2BM5vm*;Sb{B^i78i9%lAbS9NQH&auDvMfR!pDRUexqUEKG%tww?<27S{;6 z1ESK3wyx3_WBP(&FO{;6VoLAmoa>=Q5p=6nRt}kIR~mf5Re5kNX)6{tSU#nyg^gaA zN>Y!KKua}>QUy|4i|hJTR9U#WESw{kN?XOs#i0cg6E(%{g0!j$GV$9oKrTJ@$WByK ziEYtJ+bJk}!0GA)(X>^x@Zwcp5_)v6tYvK%7maMlw3er!V4kM8^rYRV2NYyu&-j_` z^63j*`n-|P631Bz9{tDZgDxjb9aM^t@Tc~1z9c=w@7G~YhN*)XPpC5<(eupTr*WD0 z(1+GEbH$vS<l=M0ghMFBW)4X7i3*=A&`gZ|Ab`n~wh%CPW`AA54$~S;9ITqmSv{|3 z!RJ2b%T$O#bdDqh%^xu30WyyYhAGX-^e6Ug8YfO_Fze=Y`&?X_rzzvig-`8v`~2JN z9OQxBspkj<PBs&UfE-NlL|HQzxz5>C1)~ANfRW@wO`9N#NrH$X(<IGcW=+J!X*Xma zqr5o?TJ+BfOPJ5g`BEWRnx&tY7UzSmHO)1@o&=@LOL_B}!c)ee&@g4o`MOGwy@pFc z(RX^3Ds1y%er>8<&1=GvqS{kfb^UY$mF!>5Ya&{iBBnb(1j^d{O1{wuFv6r^9Ywo< z`&kb-&>+3c%hsJ<pp}+m)O-$9{39Ye3i4<B2?pKDINb)cf_Q#Hl^2n8c$^nh=!DP8 z(Ny{MePF@@<y9`u9M!y{uKINdadm3?H2|eXVFE;y&Kn?Z1%v}};yG79zY>u%1PWG> zuaB@S6<Lt0=`q73;uXu;mpzI4p@!Q020Le``L|f42RN4(;z$=NFU?SG7;KvBHl)DH zg=?V4!b=9%;Tj59$1$XEK^Y(u=~z9+=<UK=FB61j)3nCuMbuJa5SH7%{Ho1!#ugcD zMqUlYo0QFI(sm?!^ATkDgf;CpH9@9tOJ1&uend#1gy02QDip?vUTQ@Aq$WC<74@(_ z91W$JP~|MPv@*Z74;%LsHz~w$sxou;=4q&<rVcTJ-~kc@XV?rX!64SieIh@W6*L@e zbPSN3{1N3Nia1#seQcuK=kKA`!yTgk1F;27Kn28-fQKQ-z}+>@J(A*{GKQl-6TV4# z@*l<q#6g9ArYC%R^kG18=WlvcLDd6<`Un%E=Euz`@#SVd{On(8(gk0*;tNiEc-nq^ z?uZXF1-|*LbNdFfzFL*On#6aQ_$U@%NN#HjM_Yne@_{J*?7K)-pN~fQmyq<yr}(95 z`=pc#@o6jH?88x1>VG(j&olc+neD?`5te^sD}JKMJ}Tu@ZlEqC3k4qmHzGjnY)0^W zo2hs7%dxDNw@Ry0R09A8A_~KcK#nu4uRBK3*tf;wN4>ocA~S4Ux_s>fVaJbGJD4DF zB>8u>Z#Ep%5ev4r&r6Y@QYLeulmz`dWF}<GB*nhTWi|Q!7@y4MyIYaAuF04Wb@8n+ zRLqCK3=04R)xPPi;*^P>%I?}X%q+Ki)MZQIq!GSn6$}y5_bWb5W?v#tAL(joo^<fB zt1JKiRg}QbOQJSZ|Hb-O>YuCsLH)-1FV}yo{*QI`<@#^b|D*bE*MF)0U)R4~|5x?@ zrM|nqxBhhfmHM;w*XvvAzhD0omHS6SWqn=!kLv$$XtDmQ^?z9ZFKagry*Kns?QTI? zU;n-Oe_H>Yp%p>Dqy7iAtoGm4ZuDRMTj}iQj(=SH)7t-3`?K0NYj+QAs4WeBc4&xC z<J1;wz1mx~4{Co=`?cDy)c(CxtNzbxUx>f2)P7sP|GoB4>tC$@<<Q02zpVZ1p)2)2 z8#+?|TK#{lkJSIP{=e4$b^Tw~|Em5!*S}G3*8ffY|EQ1EN9*5I&cCYv4?6p^`hTqb ze_#Ix^<U^iP0)Y-_z!Bosox*O-yhcgsP^l%KdJqTq2>DjIdrP_pVYo7>HS~zdhNIC zUm1F5XsZ63!uGrM|1Ht||9&j8TC>VRGh~%*Lz!K!$(os;b+h4S){JFB)ADQ0o~Kf~ zRBaVkp-NXBgSSCfs;|FauTVTw(Yi8x-&Vn{6$UwARLQ_(%@rdC!q^OdAuMbW5+v6$ z>J^r+3Qo&VGb@D@Jl%+Gjlo?}4aXCN3w#FGi2+g1kX44Xy^7E>a{%3Jy?`2H6=Fy= z0SD-fiF_ACHAsLY&_~%hDrj&DK@9QBAkxpNH?+Ef(_SQ@5StOMi>j>zumg;9_~=>% z7hcPWfNUUD&ALuG8iP9aRJh}k=oo)0mzgL4>4vcus^B-M8l1Wk*O9EBlYSFL^j89@ znTkpk2_cdr-wF!|Ae0#*$KWy^Ridl(dBc6ZuDq72mYMJw5O^#z;WI>j(BA9-(xbUR zJtXq)h-?$SS)p51OmX?ugw*91n(LfYrKk#4S|J#SPl^RUGH{C<knXmQ1~#S&u0P~h zWhTd_YEc&@V2&t%$&jEy?1VH*baWML!#vyuV`G@fZg2!DCd!n(AtD5D<QhRhBOIDc zRuTm?JJQA9GHK448=rHAuHgn-l589la-#`aW0wxSIS75r^A{aWOT}DAULP(OBK_9L zO>aq-Mp@;yf?TO9X5tTN81)qINgOca!c`H}6Pm*mUa*SEL|RcjSQ(-$RnLmS7rKU~ zZZy7VIBpfLY4PMTQ&CTctRO~{>U$ZeB|s=n9wKShMJm;i*^P!vy90`g8ECOKr&xhQ zvPKiKB3`;EX{DwtYy>|@a%`4BU4cuZHA$d{L`&138=r*cil$Mzm}|{N0i$iWAsg=$ za!P_Zi^LO{&7j;n^)hG*+OBiBC?T22&71?sG3vx=NQm8*LE1C>cA}eR`^BKKK}JGv zVsX<3w)^U2vC!rUio_V=LFvkjpe16fs1(cv+x8Y~!lmnqBJK5kjkiSeDY0e2lmyhb z6IZHRR9`2#K+Dsr;kXbTO<}DkbsH`O)11h%W>93mAmE=6T$JFzlWwq-Bm-n9!>Fhj z#cc#4eoqls20L{s5@aF0nRTdUa#>Is8yZILvhwaSnUr~8qi&_&a=hnpZA6x>Z7mC& zps#pSHc}82ql%^k-*;%4_eas0C)Qwy_F%3?RcJ^dH6%euBE$fZd{5<}WMcw=xP;z} z$4YoJ!b+kp({KVC!|}r^!pv8VLMVfgKumNJTzdZ(k~4)g;fk#za%{2(9iGQc#7d>+ zUu2&_5{N^3)0vNAj0|K)RXRe*qm9ID+FU$MysapAeS~7TQezTbs+<HFEi4Y^09%<I zxX7R+vT99$9@84T4NwFYGwEdNkRjR#&T2vo^wfmXc%`Io@`6?t)ht>AwDFAqfZe-1 zgz1hCw^n9|mt49&Yhw<{T}>GWFSxqG)r;a0l+o&9MpZ_qk*OWY(xjMhTuFgG_S^sl zW6ASZH+?8G$o=jE`jV@r1I0q3{+*3(av`Oi2sE_gb=(J~J=N%#aKH!>rb};>&<ji- zf%g)?luYmC?izOj`K}NrtCBE)TTl(oyc;tr9EYVhvyQ;XYF!A_@Lb@zexZymQ{~EJ zDV{}HZxl|G8yV+5sJt!~1ASX<6KeY-h(e^8OkFPh_ULT|T_$IqItNh6TZvd2hD=>x zjjUh;9Z{<Sg(@P`s4hk(#s+N%19X>zioMTp3C1Rg4~o7Y<8=C=9_GEt(d?o`=`X!C zDL0N)4BNaiTxl*J5go@IZX3x<Mp+<m7lIEtA(&R-T@D0dUB-4L8v#aao7AMeY&5hc z4(Kekr5@33AoAy}Y?X)i(>QX12DKpg1@N3B_2FsM)Ih^<1|N`?nv+|>29p;|#L=Mh z0U@gx27{MpY?}x(H0ByjnXnnDp?p$}7_^b6$aEqA)Hg04UO`uXu)lh!Clr)GkICAd z4j<H2tF>;nl&Fi2-wAg`BwL-A0bp1iDm%^E4_v$}qo-1MA8E30pBvpesZ}-CQdcgm zKQa`7R!0WpJwUpVH8dt0cWVQYsVKcVM&el0?FDp~l3en7$S(SJm&Cx~xjd475G|5& zZ8IY9oF&m@ZGlEOFamLh+*6;0dA7YPHOZvj%KeS2ttCh_y@Gz*e%d7s_s3Vs$00HE znW`m;si-bP^M)u64t-056LifG3_EkT;^Y0Mb&GB`l!~^O+8amQy>;(UmHZSiQ*S6{ zDd(E?9?P>Od)2{8a1CzzAVH&xszIsPs+UY!sUPqb32F*4ZcnaI-MRf>HdS}|ujW@0 zbU{F{jQ~^$pk{TSH3$w!(CnW)qW3;Vcw{P3VUhu@4|wP?((oFRoIez8ILtRWPL%3) z=U}nL4Tcolsb|EaM{89+b=){2JcPGo9#1D}Bvod&=t_V887t}*T(EQxPVOhAiYlTf zG?tP_$1YH#4`8Al+~}Yad^3O9Lj;WiQlm?9DWop)aTw?}deXiDCpp=W1zfS8HzP8= zIWi<h6H<LlsDCfvEDdyOUIE(UlQ19HJ7ufDMKc5Hswa5xOHuBt2Ow$D*ctN7quC}m zlGya;5*WP^fF)QB)uFm2ilx4<cd3IO58|DsIYAe99DR5b@i7o|Q69<>W_r+Nh#ZiV z)HHYzjomCdA!t8w$K8vm!HT7x0nVdw0URSK-T5MKE5B+aiP(7(B%w$qPFWl0suYHP zp5{`bEDs~$211w2qZwV^B2d?yHoGMiQ1>4&jBwn=R&nr<p5;uu__!gmX0mET>+HY* zBBr)GhGe6NZ^eg_-nOAC_F}7tD@oi@D1Dz2`yn3@P^gtgK49|O9zpc#By7-?@hY^T zdA(g&QsUig!+R5Vg|1~}nnp}CA~6~toB<7*-8z!Yu~2?ytA+&!jLv}v8$RTqxgr*8 z(UGmD9uPsRnH{D~ar_N7KymjyGz>Rf(xmQ42<1s1sJrj?96KtE#^c05Ixt<oMvC9w z^q(al*jpcY`_Q2`-+b-ITR?QzTd%=)YJtwZKS1!ih13Vz1IcFgR6e)K=~hwEH=Nyf zcpr?>dLViIeTSblK_$QB{4e=<1(f$6eikA6BQfmAoPvmm{6mi#ZxTISlQnX~;SV7x z!r!V;t>2%Mj@06_N-wADFlco&3`B%D8Nmy<H-7+OZ$3Z(XzXAZVHgHbLS1^a=#q{g z(2C2?<PeLhD)4-0XC=L3!E&N+iciLkN^5zz3At4)oIg!J*$OnexV;mBUV2H!2Z z8I&rn7Oh(}X6PQv-H{vHU_7SQF=zq8ZNoUBa2ab#)uzH<SDT*5=aesDq|qNTOb?-v zQ$GU|Z#K!9&ax-+s|Gn)@%2yT9|OvAH*%r`1MJdd56yo2j!Kko11lj(kA-N~$jF<y zTvz(}Xi|47-Zl}wI|LKHJ15G*h&c_HFr_vq-H0+LW12~(N{3>-65@>AI8~COLh~lC z>nx*2dsu^1tavZ`f>CI@RmA!z+;uFB*htqNds<%sTJO%26WVArf<=TNDYrq_aWr4- z1HO|DdBJp3)yIWx^oQxBCR0JGt8cJZ;!}8GOLGKeHe=W^bt>w)-I4t4{ud9OQYg$% zn$7K3&kD9{l6~@;I3$yL-?t6#&1VF{hgBN<KAOMdh3Qv+H2)4}CX;(){;WTvgJ$vh zNPbSWhE-b3`U6f(0zfz#HWR0Fo4hIt8w^8iWRKdS(wq_Z9FZ^6dC_MDnR0_<e;x1# z%SplbE7SF0#Go4{=#PzD2b38N!z~kbtf{)!8xY6%!a1=g-A*H<>eqMwVu$l(RZatF z?9{06Lg>^8Sm}?xlEEi2^FT7v%`Lu8(W%>(OH_nY>6*6W@@x#71Sk0=Y?SNR$Ur9* zL+R{rK25=g6?nDHh<9BlKjKp7ZYXs_MhwZZsYxhz-JLxuJHfRe^O&JaCwG8-{g3il zlabd?ce6h-Bl9L<Ez)&2sF!*l@9LfT<Xs}yabV{3Ccvn}{WEpENqOxmP4bD_!L2Pu zYT}F%hXMw!QA;q`wc$el@lxC80kF||(@K9_ih%tVz=%+*aBAXQjdG1jWs=jM8w6!k zbDU#P30abNS$*N-J-ol$Ky}-=h66V?&V@mh!RvCsAy5KG=FdYTzYG`?Ie_C?Qcdkc z!sribBsd|6<2N0>A5u4m1A)E6`7u&|_o+O8qq+UksZGs^4`=fH%3fiAWai+**YtHZ zD82uDo?m+H(nmVqaa`X+IrX>DXdeEaV=8pz@v8X?+3s_Be&H=yMz-hL!AEE37T(HU zRXEv8Rd)R&GjCez5A|uc|7=>7AG!9XARL^X%jX`;UKP&sm&TQN@P&L~*TgZEy1F-O zzADfcE=@Ek+|0IrEMTYZtFq4+X}L&4N+QEsty`#%q!^>5*=J;f2_bC!g&Uk7jRiqT z;`TfnG7756iK-;WF%dY?o-E9C<#i##8@(5GkIC5Dy(m42!EtEV@|F+BmF9g37TxYo zg;+s!wYK^2=_yR9o<07MtXicQbo*qt-*EcqHuc;n6F->d`{FIqCrE>n(7e%^&hGoc zu4Z%V#}lc>2IohVt&Z&|nfgFR_S4S0PXM{3nGDK)@PYQRQ0gn8#_lv>Joer0410Q> zy+MhG^AEMJvRkj_A7<O<XErtW$=DP=xU<>Z+s)U%k!ANu@fQ?DII}6cPyOMA`Gx!u zpoxuV7Zxtb5$<YcyLGsz_-GA|_A0!xc3wfL4`<oqg4*0`pI*B~MsC;H>%uUT@6X;T z@-@3Opi&Ux@9s3T`NGcZ9ibD*Y;S(7ncXL_vi^lVf<m%lH4i0&ph>2o67msAuHU}8 z@jmfJn<rHL2Lyg&X%?1-0B$($Bk*1bci>N5lLi9IMyNOip;H>3#%$H6BFD=E+1BD% zmWfiSCHro<ThQ=gHdL^Y5aV5kZmMg(P#%yLnkswA`e^I5kg!Tm=<69nOHWX|@8Ec{ zPZ@#nG4LRC#z-2@Cc<v(R%oC&Dg>0huq+TmyOzqZcK5DuZxW>D2!N%(vfYFs7@uY{ z29{@|YznE2&CMLBHdSWGf~xe1uwR*Y{AD#pRG`av_Y=DV4)wze$9mZx9L_H^x93+k zW#4~Zu4OiVPWoNQ=k{bL^OIS2E}t3CCQj$FxN{3v$FsY%mnwh%q5blJvkT8<*{S^U zrsl453p27(eZ=~~>~fx;{q9|}`3u;XguhqcJ>HX@_&tGZDxsO3&R<exQS~%nv!=cW zed)V*XWth{@N;j-$n7hSFQ`GB%MB|-{Rjv+s%7kJwBQ$rRX<#y3;>f!U6^vr(U;j^ zXyNs3VoyDV8>{=q{@C5Rt8}wXr?YI+y*&9uvfkR=clK}!`I+oT<$QCj{2_+;`7xOq zG(psWL^m`yY3>+hF;A5TY!G?(D?dWxz^yWmK~Tks@XpRBT49e_xw{Kor1$37JKEhE zp6_NGwuSx8=8Ie08`Ao^nI4^9vLVu@s`z1Z*X!FRs(WBbtSFz6GJrZ3j^q;6UOB>M zPXwN+kewuPX&O742rnU8zXAODX16BW7M_<VaroRz9g#Ov&u~PFlXU^K%07Du?aI1# zVihyZd-8m*n0-{XGm+<y3Ar4c^0-x5e_58eU8z;}tB-2vCF8ofIg?AexJmRV&mEX- zXQx2k$lwg)YM#hv9*4^7_U2bq5<Ht+u)hgJU5gkq#LRHYvEemkx{)Z=b?KodL>+w? zqDlb|u6MM_5G&1G#d{uFnyV4#gsbpTnDs2;&GSeTWUNC5>mhsK1E|k9m)U>N%-$<D zy;~NWpD#AOR+Psx%<5%*Uu1WteS0b!UwNx2e{!K*p2%J+%a426mz!Ib%W`g4^W9SK zS{xYboSs`5U-=*-b$<8w+V06K<-#^~GQw;6+*F;(UJaqMr<uK4g+JasA=u9>ZJKCn zee<7O4y}popjPs3j&}})aJZRkDei4cA)MZ%v-ye6gxAd`+GO{#FExuF!qWcmh_N<N zy&1xhY%5io6So+UEc;mqEA!3lbpfujf6<)iycfc;CU8$Ro9Bb<$o88$&t|U|6WNu6 zMxc<qA6}+bw}aqhQy^<PA0l5F>YUyX@Z7BU)o>Gh!O^}Y2+n0!sfi)`BO3Kd$=83d z@V+`+?BcmIW&UesCGU$3Y-RiW!h}wrkhyN3&pEwoK7Ym=@({(pATw2lDr3^xF{(R~ zzpr7^rG@93xIB7HwV;~JR7m#H&+~Enxff(=szjIeL_V$V@wwAw{_BQbki4W|j|<>k zdH%F&zAwII*dp4-=gNrYn&w@Y$5jB98Irj$PO&SFeiuOj%ktX;OfEI)&w&-7F5Y<X zXOaL|^@xJ@&sJssSXK1@yYimdW5vT~&OBWH_`AiEJIY;?#mD25TOTgpXr3xJf4406 zTqw^>7C*84r;PG1jUB!Jo$|=Oa^;D+^1!%E^n>y8Og8r3eeafs$Mq4Ot25<KghKSm zSgY*6I#cWkhc=z5Hcy4)<5OGIwKmoH?FwPf<#2YY`pHyyY*+Q9uAiK)nvaEdc5Quq z)2rd0$HKe2#>4KZ@J3U0cZcxAbhSy|>G8tY{kX(y-k42Ps#i8u=aq1efZY7V`&Dx) z9NK!m&@#-A?Fvs-*&pwcO}!nS+<LJ2YWU7n*fX|EMfQyE%H}U*i(%ik@M1UwmR+HE zZ2Sk|;MPm+O-Qx*c!>}EMQe4Lpo)!65x4}cvzwb|!X{^_`KV}*y2U^E7-;Qb`cp3Q zTaU>cWlSgY{KRW?+L)C*EH=13m&s;L?rY^hcUIYN$z;{7D=o`TXibIJ=H!P}N`uAh z3GcXNqjK503A*_*ow^SevE1g~b(pmh)QdiJMx##M2!X|H_gI<z!pVHWAc}+q4O-o| zI^y**+vh}?;C^QB!Yuw6Noa=~yv`|NFPDdzrcqoihDs<0&VvOUrK+mVU^+czFjL0I z`c$+TWsE8E$qx%_fpzXeyxa1d1-}mp&Htu&qj;cmq`U9E^2(L+Cu7B~_sY#G|8B7< z8!w(5D;~(6FZ3k&rT5CK$~PX=ai5zj&zve>q6Z%@u4LJc;&j%0`rLeZW_(?7HG4`~ zRrcSyd&-(;R*qDhKRF$MEj4HRD|M+4WCvsyy_b)MYgfZ-6JbyGTqPsWAoTv@7s76= zWxU#TL>8*L%5JI_G8sB`QnyT}3UzKbHt$ij{pF_Y{*S5hPr0g^GVyF*)il5meUBQ; zrt;<HeS&-ML{+}i)PS~lyO|xV?yZ(i9q1gXblVG(A2zeMb^eSt3HFpr(;DCnha(fE zvP%Uu9j-Qg!71AfWg;9&+uyy;SDJE$a(L3QZZ;lPmwt7VdR(En(6`!ujy+Ax=X+J^ zi27@F%(`J|?w(&z8{l`pC0vkYPUH*USBgf6o3JaDQkxKT_3fCY5}vT@y}#^MOI|a( z=Y(b(R9+1RuPSrAQ6QZL60S<5pT$uN^Q4Nf<^<66+?)0x5NYHV?=bus1|tLUm1fp8 zW3_6s!QC!G==CifNPfGZM4OFBH%hW%8iks=k1FuBKJdt}Yhl4#>mGzs=)XVG<qqJV zH7}Rl=Gn5?_FlRF#TRzTgpXjt&G%&#<K@1wVt4ad`8rJaxffsD3E3J;m6v{o2|u5` zP`)%)YP3IAo@tU=oEhIxp30t;3DW}q8EVZoRj1TlO4-j2Ojx#SmMnAVy*wSBKX72@ zgzjecm(5+_rRH;C`asa_&4EnLS9Mi(AO3AW&bMAXDbQbN9>Cm0&O~J`Vt<%^N#^-a ztXT7H(Jx>IS@-8cevjyQ$qMbx#*c?<P2cYd7iXU@mX0`u`zES;v+P)}DH|3N-Rl^# zUlIW?30Exiwzv^+$y5oS5p0Od4ph*NpJ1TI5d|Dphu-{!9q;AbeK4TafN^uSOG5!V zWEskTzLz2B<$Uh(hvi~rXjk*o;_KML{ASTD9J;x-3QyCQpOCYhUr+^kZG$fFdb5pB zWrd!q`=ZZ98_u#xjqCR;%x&eCiQ$5w{2kp838Y2_&E``B*DK7Ygz<xXZgT|B;3Y94 zN_=$S!+{v@6hnwG3ssFlDyZIv!g09ZZqtXn>yaD9<1-aJuow5&I&kH&v83UL2cXj~ z?Djik{~-VlmY15Zm9x!<%Y)gLaaroa<<ac>TYgmTZ@yP<A205WmOEJ<Y;GC9`-E<n zzI3wO_fC24wQ}**vV3X0IFmKUiZdEzDE0jKpK1j0Y<WN>CH9GMXv+_l!o82`p7?0k zJ{6|3hqmqt&rgMpyx+Z;Vzc+sQ~<YM>vrm3^LV9U!|rX>PqExbH6Wc1+udbvg3E_- zyI*K-t%^O_*xM7H)BM;fO?;LHP&J<jA07;CjSYU9Z5gYwKb#0hni>`#uQm(v{f{<J zR-5j7G}FGh7!Ga=VfSMLG#WoYzpK@jFZkt$)wHa6ghOLH#~%|LBE?{LHi;5d`ixSx z?F##+LVJ@a#(%iCGOg*x?MOa%<?59x|NKXiH?}L2nLn#XI9Hx>Lt3kjyP5rv7f^rk z8aAiV>E#bD=G?*?ay?R-Q`i56t4}u%Y0U}U;bU$xLQy8~F58WFWZ3S4jT(Mka8%;M zESt?wso9(p0zDP|VB8B}wt)N%(V+D6qyz5Jg@~B}4S;038a`n{W@rqdQty4eQ)d*) zs4-Qh=lu3KJ&f@g^7z0_&qLhBG7z9VPk-cdZK_0<IMp}<Y>ZpvkDIyAmhm(ne2Iu6 zK2-R=jQ9J+!7Tf!KIQq6+%G4$-kTlKHyZcL1K*oH+uhXc9B3-}*AI-9=LP=RqMYv) z_s*2%CEci*`z=m3pVc6^TmImN;w0`Dv({jt3~OfZ&$6Rc7~Y>Xe^!NC?`_V8aJDTQ zme-V@>%H83qYA%tfa~XUeLl1v3t_ovb4Jgvy0`3iC#$iH(7%64dp+)WXr&4_75Ct_ zRq;_Ob?&*5;YqKV{jBJGRBQtDEib9ggg!o{+c^rAoqbiPzmYvth3oZn?Wi2{l5V@E ztMJQ)M!>HIec0Z#GkpmY_6KP7_9hj&@%d)<M%npLLoAh?4k6s6#~0%1T*rtv+C1hS zEe$o_Eb>2GIICOxEW1Z{_Ss8%26=Y>f@XaEj%#mzS#@?FKY!_^J^4q{(j$6yzA*Q6 zj0ibU<-d1!zg7~{y_qck@^kqm+$>Md-^t&TK+fs@N}zOurJa!My$OJpz~lD(^cLBm z*56vQlSEnBOI5z!AU2yy-ndIQdO-WTYf7IJETGF|_X?3aK%4S4zI5|#V)4CS#5Ri) z<tEi#DfYNQrMyVL5xAkI=LoW2H|F&4o0u|tj>U5bdmtKxAgCI1gW9&}xo2#kp+rI1 zvU5u>+pvWJLbhe6(bTiY@ptdsl4aKp(N8K}1+txEkk!uC-u>O|?wuC0!PGk4=0+7U z2)l%F4K;1_qJC6hROR#ITLhxHWh~2d7E982=~P4q&yh@8_dT?eehU!@<=x}LQf8lT zW<q}k%M!UTqfx<k<zjDEnJt=2@Wh>W(~(Iy#<b8GBCd>b5cQr1dcngG%Lnf1whL!V zZKpkI-nm8AH>MpOnn8m@kHzTOgF2p0W!d(JzAMZ8!QJU?M-2);vH@f>``!;8NS*Hb z?GJrN!_gnyE!p4mgC7XDJF^(o;v_bG;3rmx@4ok;?{L$7&kyc(?IR4q&}jZ4!PuyD z>gXqc-+Sl*9sE{5&PArFAM#_TiwLb}nAN-k-Z5U-V3u<DMK`4s;KT?@{#5DQG7&z( z7(l|X9X)@4g4&&LeBK>{zI{x~qd{4KMAf`%HR^Yt8@D?dtfTMV{kBf9eZs^?DNd9R zF|c6$^}}LQUzZwJWCyqk=8C^9$G7$4x{YMol?1X)&+}{hC>tL!>;{GRATR>($fDh= zf>OvOzbz-WiD++MdLIcu>-QONnWXAMu)2gc(-kpn_n3wopMLc_NAN8M3xPums5b1q z@a(<2-?xXNT=$1qJbq@L%InyPRRcrp!Q47f8{PxC4DONrDYi4?G{Eo%STQ2fyGM5E zQz;$SC^LpK8=sZs0jLWc8Od%%2rqw_=yd@#K1=I1jU3|xqx4E6c-=mE%_g#=6J+3F zTye~TIh5S)B!j%FOSnsx05`tTgroTZoOk=MU`Iq&qKb0>^u-ERl3*;hiN5(@;-bZ0 zERr=k<1mIMc_Jn-8g@?pNUp&}JG4`!22I9q4pkURkd2Y9YnPFyrMj9nAD?=3ivnz{ zFusP7h)E+(o24O#N_?QNhCJ(1!xd4-=Xsvu>mx(ci5sA&r_4%Ain2&habgDQ28fhu z*71lsfiy?wnsVq-mE^@nocbIWc2c=h4!AyIlPRsH?_toyLL7fZxtQossiRw^qog+U z1TG3Ob>Ri0y?_?s(^6uHrL=>WA|}$?2@-c=y^T9Iw_~5YgGjd+B)4h;$py)HQ-1;0 zo{(K+g$E_N#UY!?^u<n5I%Dr;fb3$5eME{<HRJ+0<NAgMQx<4c7svz-VyZqgNb}lW z3VQlFLGFe`17T-V&$k6Yg|gj;j~{>30<W<h<ayop7mpr4esqd#+#r-kZ{T&{jaH}w z`Is(AOV*iKqBR4R5Hv)FB0NY84A3A`@}}yMluiohN|Q~RJn6rD28-74y}2Vb!vR6O zM2!#-iM_Z2VuRR!)r`0AZGJ0rr_+Dj0(GXII1y+f@yae^k9<U1fG6ZO`XBcYb`kqf zB!va4MVXS4%XbG8u_RjtqBlMFCJ4oCbtC8<giFh7+5-mxc0T>f4d_n@U8J9Ubn1d9 zCn~_s{3T6n!>aZhwS_!Kv``|;(N8DdIGlM9xj2G#_w?N!ctaCIJmkWyTbWumVElC# zM@jeNZXntGpaGYPC&wA+zhd#JMkcLqzyU~n5F<kY6OEY$=dCN=$0f@U>Os}g28@Xe z^kmUMyfzI650eu#i;!0_9{@z}#4AE{MeYZYj!Lwww}eHk8)`6*G}NPh>_2*uJSh@& znLb@$F?bHQ5$6d9?#!Z{3^>)??xPW<Hi<sq&<DdNI#J~exdHIu5K1sWa}9ZUAGo;# z0ch5LI8Ht5-@Q}yy(c0xmxJ{Lg;_xyLL$RtbD$%H!=}L9)R0nqnLdU(!&EZfRJGq1 zKx+J$flJ+3U^>9NWduMoLk-Ej*v*YOQ%j6ec6NPM+g*@#Ip78q#+dq0e<?II8Dxvs ziJyRg^Mnb92d_Suveu7!Qjm~`Ok1!r#tffnv;kiW$)WdyIis1-p4^U!W29!Pu1gR7 z1!KQGc%T||x?)Tz-a=gEDT>*RBsqLj2r9xd0Omt?QYt3>!D`rT=gm3EdR2f+QaDHZ z&WcmaWeT0R(RhgPbnt%4+qf9wT@LG)R1<N|yF*l^_~to*ET+|Na!3~4Wl*W$ZV6}8 ze}{vM*iU!^rj(i0C&n7lL%7FUJ%Ti48vP>Bd3Ou)mM_rwOqZ1pA#NbaC1z@}alMrw z7>%pg<~c|^s%~@}m=uqebb}0~58mKJr+5&Gq#LcIwKyPM<rBzZM31VmqZGO4*s)0K zaRI7^f$jIZX!=|y8fV(gz6cGUv;r<uhb;;9d?bje6>@F<0-IN&pw1!=rzr+p_G6h1 z7zD=*r`bdxh`>>fTQDLZJAQdbmzLqTaj`5!xFNg$G2H!lD+*!Y*d^VQ9!-D*ZsG~G z5E*6@Z)$jtQ}T))D9H?xDV#himE4b_C2M_d+bXruL}rL2UuFNIog3@UqOScUl8-cj zZu3HY1%T7PFyr#&n)VJmJ`&)}O&#O%C~l*DU_iXtmXJ9>_u}!jiAX930CDqRO$c*9 z-t_VCj8dZW#0Ef2?7tZnRB`uacx)HPUOsxJmqknQ=EXw}Dp@&P;}-1ATI1RW=<ep> z%!cAZ7S-zXAp(5iB3-aqjMHv96hVVtLO#e@kF-IB+exr*G9~dD#|Q^b{Y^L;Du{w{ zX38=kE+oI-h|I%+eSw5JE;UM}2RV9ADtZD?(<;dGau9?(AcS0w?$~Je>Xr?0Ul4$e zG5kp=x|va8?1zzx^T<#n8LR9PDZn4Nl6bgI0}=N%bZr_Hq%n#|L1Mot;z<ezeA0_U z@W#4ow5`VMQb(n3Ienky-Ve|26w)ejm2}0V0n)W17v*sJ+IM4!puE3L&J;`S=o3a? zppsh>Ck{dTXw*QCuS6v6L~yv><gQ&r+@+a#;#+f!0ie)T<|EktXd*&MK+U)L13v%s z8{aY@2HiavGTG244o|`sztd$1y!G{c6mqePG%`(A<~I>;^7f{paV*fNGJSu|4Jy3@ z0T1a#EM$%2NO!BQT(G4+e-&N|x}vPPNRC1#sk_qR2=<CG6Fbs=N85jI#p%T@sE8X* z993X4Ku1OP3Y=hb4t(=yZrM@L{Xx^f7%7a+qc?lyP!(e_lJQ?Ab%@rV7AUxIOjC2I z#J2(a-bMvX0Mv2ojPLQ7fwQxsJ}^r<Nd}B}!<^Fylk+6tWNN9-&%gNJZ%s0cs39My zZJ<pEFrTIH%En{5QS$MRZf<Z2CN}r6&_wrcChTt0SV)f@VvpBX7}ZzVq%?!qpa~#L zxNw<9NhLGv#3yZ^jBBK@6+}fo-(W3Ui~!Y#Zz9JX8Kh!;6mjuUgh34`QyJV8ZPDOD z&*~P%TP^XeEV5w4J)?UNA74ZpCEGjhScxWz(41In2O`CXeX~Y^Q^BoP99<?tNr)2B zfwsCTg<3Ha6a%yG^W+vrIkK%RWSeid+f_*N;Wd3oyb(=Ok&KK=H#_%Fek&Knmu^FV zk-7$%lUb9Sx4%rK?4-}-bSq9NYYeGVGUfC~kxrCZsu@RL466((HNhwcUavG3y>9AZ z;MOexA$ia0#^!^N{u3i>2W}0~Gxo=H$kBj!2NoYE$+IN0a+F2($*<h9f(2_kbXX#S zH6v`Ti=M6fVEd&)D@L$FM5UD}>RPp+WbqAtN@Ya|AXHRi(GC@e3q_<wBNjbtS;?$> z(M|}~8VFl)VpdQ*kLs*{5!VG_i4K;hSj%D>tgGR)E*fT0p=8nqD^>(sKg3te0G6*b zQaA}LZn5B})ar?&uF)Ttv#2D5K2>lEO`z`~8(*>`GTK&M*5rudnoIS{xR8me_(B^j zve8jNtH&}OLI8QbE{9e3)je4K0|LE*AHm&<(zc~Pj9y>8gtDHtwB+Y$We=ES6_L1h zNhQ%a8?ZB|#u?k3HeV71mW#AfNLqaaa#@uGx=Pc(Nn6RK$p@g$OcZVDhU6=Uw3f79 zh*w4RzNH07lIcZdV`X-Vm^eij`fD|pK8}_$u#c8DxP$@HqK0#wlC%igfmN7(QP;3r z2K8VTNY0Z>62c(%lUL=^=MaL*+mADyxHTprB898kxE`z#6RAS~fMr=4N9;(<1TD{0 zwX!tbs;$hnhF4mxl}kE3(JHlH(DrDnTDhj<qPA1oI<2~vTjDC$Hq)BZzR)(St))%t z_pDsdk#t}zYONmj)Otu~MQf<Fa!x1bwUO1)){EOR#adTdT0qPe=;9b`J+Dd&Lk+Wf z6iZmmD|to7Wm}|6D@rMoWxBe)!j`XS)ouHFRa#ui*6-@IeRVHiy~@_^VofRm5#ecF zFcmRqYdNqE)jC_Zip9oQcT9g0ZC$H&o7KixS4>NtX}vH@WLYm3ydtTcsA>C}We$-1 z8x4*xhy_HJ>C)0}s>d1i4gX5J)J0s(i)FJ6g|AgsvHDp2byUHZ-O{3Zq&dv6k`@(1 zjBAWoRw1($wm`(@&=8(2yG0`FcwO&6e2>J~Ake@VRS5#*vfLNBS~JeH<x6=%{SAN+ zO%6$m-l+^iMvTs`iww5Gg0_+XNpZ-o7F1vQN@5PKEt=s?hlTcM`dCZ?teU1J+FEZd zF2A)Dfx1EX+HcPIifW@qpn$g4MsvQLn`@$KfButz6E9GM;UNdkqXjq%-PH!g`f`A; zxs07fpt~U4AQ2)t7*r8W)kSJrUsCO&za||Sv<6Y@&`e)ZC}P_sJF8<dfsPvwM4(}C zCI#ABahMmNv{IvVB-_?Gh1$-Duje*|MTYi9$TVbv6wL<u5N7c5C^Z_D3Up9fqE3j6 zqrww04v93W##*ToXzyu-I#;qRPo@N5lQhT{Bbi+-sJS$DveQ`_&sh<ZH9=XSv)8%F z*2nC2mZv5s|L%;ffVr-_IJLMixyYK9EIaD!Ufw`KR^7BEHA_ovDVN1Yhgp%+7Q?jV zHhtYuDuaV7&!Z}fh5{7ezRG6L*Hdk=a%mMy2d&BJWwc_b=R-xJ2nKAGPGD5s&n3bj z!$}mXwqXZfCt;{*%~%pxHq@6N1*(%-_)@IKmoIagh%Y<00Mu9$T>W$o4~dV0Raimn ziC&xRN(-ryrC(+1o(@(PP3y420js3KT<ET>A}7KGT3cCKEYf*SLO}4Ynwm*#Ab-|4 zg_Kt3Gf8QXkdOnQYY^8PX~vDOBWo2US*^;tH2!fHa{*X4=|+phvO23T5W6(>;q0?} ze67~ysl}zKMVA1}*E*4DRor9<&LnwkwQio4ujR7WUo%!~Tnb5LOTj{@i#7Plv39j& zMESC_2*}llL_l74HbSTA%EYS0Hj!N?+M}0u$Z@S(E1Yx$HE9J{TTT}RAyT&pab-U@ zEy%OwW8ErzwOh9gH#V*ODKmf~DA3M{^*Xw=<#UzeV!^U78*2=~4cDy#L>m$eopWuZ zm`dD8NHz6Asg_S=QQT-aAqp4)#U+fLN;4~vf(F`Xdhlxt^{SRxa58SU$__wLlkx6E zC0ndIUtStJC5B`>AB~UQd!@U4-@9XDA3i<yz*6Ufv9VXn&acj`Ac@Y><hjnVspXSX zlaI}Gm!_6vMV;3sC(jAssy5}#1FJ*9Y!Ge=QW{hvIygv8!t=cmxHFQpoyyeMU6rXS z(u-ojzDYI()Z)^{ZktiM$VMx{3SMHF%4O$zSFdT=NYpC5DrA2bU-CJrZY?(W*sN>` zW?;2UxwQFGJP9s9Ok#o?x*HsY5(Z3TYo>1G#2U&p3oJB5O+`2BqH+<sENBO)a#_b^ zL+(;Z&D;d1#){L;2c~ZD98E7uX-OqgtHMBlfVlzB{T%{J>t}2I^j|4jV-N0q?9s8s zYh%;B17qE#@v&>q?s(za_(wB4E-#H=)N<^HAJ-D%UtF0wacye<+~mi-pYG|cOfBm_ zJ2|`3N-LwY+Bs{l5BnPAEdgI+Yn8Kn`dnN}oh91?=lZeyy4JhbvgKM5-bxNuYG+k* z@_WUG{&MHGFuc_ON>K#uLEarKP~Wme>7Am`t7}PgN5WF|3;nzz0u^*y9)7TpJ!ifS zJTThIUCXlS&>FN7yVjS7POZUi<l2q}*3&}oE&^7Bw>8*de4W=9RA)p8dNTqBZ41g@ zbf7FbU;1fRYr-Qq@cP>AWdS6vTH0JRMhd48>XK<$6$eeKBxJcO1y#GcDr~j-qWCqP zt&F{J?AVd9#djupy_K<xt+Bj!YP{Fmed5irC-(06NHD+r@;+!-(Xiz8&h#FwK0kHU z^}aIoqhlu7p2-y91S2D8g?cBTCoV!U)GJbEM+H`qUPXf-+4Z$nxJ>*|EejDht_oC0 zv2Ii#N@@Xm2nA><dTo?}-)IX}5~YdB;RB%TZ3Ks_&ux*qR;nu2lcnDvWnh>|$Y=t1 zVl46uT!@JDLrFVQ3Uw=FfHA2AgK>pX)VDsFG$2Gt;g-{tngUIw8`(yv;+`xd1LqD% zMizguc3Et6^pF6@v`a8VYaTQ{$+Ik~G8BJOu8f~4itgCb8{>t}&##OxmuDx6a`(x% z#?G8Nr8mTj;>{oF?eelcc}C|)_LN0?>e9;Oa(hZ|61+Y6Qc;$&=u%{A>#BSZ++JBz zI$K@aI#m<|<;OFXtDJ;kCF?(=d{xw;qr-YidljXqt$5|4yvZ`ivg|@oYBAr~fsDEe z_loOc0ZPJXrR&cC2C)9GL|?aDLz+_~LhXWGln<vjST*hJ7fO*#vY!aBOhWa8lEj_; zD(XZ~9HA2Sq;cW&O&-m0$LkHLyp=Yd1q?dMqGRx{izP@wzOY5M6J#na5gqyL2O_{C z#ixGl2z>+f_^V`1lt7I%rK?I?K!~bCYFVtOB0mt`YNr&m+J4p1IlM(>qH;9{P^p|F zcBcKjEPtyitFk?IQoHfxYh!22x5v6VE6+`o<*rk+J3cIX9ToX#O7>LmOrEdGTV^LO zmPe<$ovD`o%X8(MkI25%=?z!lF6%1ZRe}!Hkbo;uC~YgtHK42XT@|e)UsGPK>Ulkh z(Jo0^R(8-)T<TU&RRp1J*OW0d(zP-LzA}7<!%Bc%VpBQJKrEByOw!e5C4Asq3s5g9 z!}ALgIg{iKJvEHFD)IwFs!NhyL&c05h;|+aH51QO<Qc`l&?<hbavgANTf<R!xPs<H zJyq6O9<&Ktr4k&hA|;U(XuU?1j+F?BBS3b_^<D=I!fQXcfl$|)ORFZC2c-fJJuXFV z=X73b2)MC5cDAZI<E`rLYV4M?c6M%ORqZ}i9UI#*c3N7WQ6FCKPF*Uio8O<DoVr+b zr`p}Al`E4|lP7*wZLextlJsHiuU11<n9<3b+E%p9YP(il)_%^;YT=bC=<KMr3sqgL zc6D~Kx?-sd)ljjrP}Sw_sobfCdMmAJsNMUiR$rxXOR4wkd4U7Js^jz3H>!tpB<D)? zk@nAMC|L{3)ljHDIS27?f2G9-wWwczy+amEtd0(|I-so{SlTjxTKJDu6j}VQeN@Xn z9_?!JKfms#!eM%y76|0ex{V>NBsi#99leEoFXIakQq}<(M#oW3ucwrLf@3Qla@c5T zmR#tvf(-4~k)l6q5SGHpdW}{HOeFati_n^utz_ZCA!^uKh0{lSw)`Q$AY6n@TQwGr z4Aa*+cmrBmrq)+<)GXdeX)C978RKe;wnC#pDQsOtU)|AGSTwpp&)S<T(s)$JLjvMZ zL2K0cI+xG@1lG@li9$#@_az>IWlKLg%gVRXD&x>?#ZF=EFFfgsb>3j?7=8&WE#KG^ zW)`N@7LmoJAWP#zc04^yMWlq-kvpY(Mi6vwOd!#m+XE@F9%Mw>3(nE$6|*E#YSaJr z_WJ)_$&bTuHTU+@y~*LJ$*HNi$=Xz<E!S3P>rK|f_8sN+p&i@TZolWDSFULZW!0FS zet+?`uyN-7X?=o5`^C9%nbhgUd&4$c4)S;y>b=>WTq~e*H>E(WXyXX@mYs*G_T+}J zeftjk72Ahi(rT{rVcn%inp-9wd3z}gKh<a)6CMsBus1xMBs?cVy?DW3&PTZ50mp(k zO0<XV)sFi19~G<~TzjKxgwdhK-w6KxM&r2Pa|mJo=;#T9|6HSSBEdfyhN?qIqL>Vk z{4iCQq{_)kXzJn*WNpMZ316YRy|z+c*@4hrWQq2$p?!O!vGtXQ4I{9xgyFNJjs2&? zMqPopF?zfchR=<TKG#EzkdyGA68^b-a@~uedR$nA@j`g2oLqY$JSlvIi0DnOeIvZ3 zKU9hqBVf&n#JZ!}K6FjfSt8+7qj5(SLUCS9uOeYFXpEF60YD9OG#W<7ItqqR-XB#8 zDQ~(a*Gyds;bR%cx$tBq*3X8gP-&4!K_o?Ax7$}V6|jAc)O^6GS#!M6_-3yg*5wa0 zMjMZ-ryPE6v~i*eYx4(28;!?{Fx2{S)!6ur$MptyqcOVsP&aINdt&RA7j^M=8P+X7 z()dPW(~)X5;oWeZ7uM&DT92$5{kjUQgj-sVtBwFk$c?ja>HL^pJiGYtUyn9MpDHTA zZo6`*(YXD?GHf`vX|(a+;d>?ocxe8?sxkC<_0E9z;>q6RmuVxC`{d-0B+agl7lLl@ zo|?L#QN2EPGkNPzHP0R1o1A>V2<_J<T`_GbrP^MTIy9-UvZJ?s=mE{xE(A>jHim9L zUdS9oSk<U~N3^*uo*OM2>qm7RE{-Z^<LKXn$0eH4#*e$9_FT8IW>jBwy4Y>p@Nfuj zMC>I4*p&#w#YUrO)E@4H+Qmu$hX1At&vhDWX4H&EmGPk7;}e+mqe?iTDn(=M(|SF+ zA+)u7228Il9uc?E&Wp+4kypDA4o<!wmQV7<pwQCcDM>-!vJxBn-w3@kAw1(;TjN&) z++Hvi*giBNp4Ivut{T5Tx>e>=-7(sDyK`@&aXPY4-O*^g)xLLh^mM4c*=YRrx!LJg zLg$Uf=mS@my5TD_k;c}yzS$VPy+`(gofAqpGT{D%xL4`M16P*FUuOkIkMzQ?arw=& zGlHfzuG80aeI$f~FXrLm?W4DMlw38w^v&006h}Zk`e5sn&Yun?6m{+$ZJd60l^s0d zj`54)dnLSgCd{ib?3=tCo{9%q!6BKzyW!nS;l-)<tZhmp-X^dF1QNE_cOa4ZF!Y>+ z{%fxXHPNqC;aH>blo{*saJn&iM+hG_M98Vp#_fx}Fs$SLcKC`M#)EpJT)bRVt=oGc zywYfFj-tSTI$`7KMq|IeA*SqgF~1kqoNA1Y3Jwl$Q!l(o8wkI(*xvMiv-f5}mK|q) z->vEeJ3s;;IUEf~(u}CkjO9hNr3Xv4!wx?v{NhD=@D}om9o{6%l3&~nN?~dol4j@- z2UXSGXn^Q@8-uNZ2Ehf5g&;rzAc4k0f&|c2O%6eT=mr6T=tkFetL}D=|G)n~^HhOD z$qGmK&2{VEdrmIjo?m{Md2Z%`gF`DpiQj^N^OEwk&2^>g;3GRi*gJhlb^%A@6TPP= z?We{2!zc7EUp9$XWftE<CO<#~FG~dSlDPYs+JRP_7Uqsi03WoMy(c3$c;NLnrw6VQ zOJZNDe!YEjgiVU#o5x~Y>D#!jgFjUp`Mg+E%IEc~c)nm<j*41hoT4ofQ}!P5|M|#m zVcdQi(U?!!`sPWw07)l|+Y6iV0}Jv)0w~mKk!m_~yBXgzefGqCn<qZ@ZoBf0$IrJv zU2fOTxFz_jx$hG%washe_UV;&cxFa}z%ff2@`iEDd$#PC=NBIn?-$yAuZxBg!qk4@ zlZU_XPq9#F{OQ4i2fpxy!(aIQXV72~z#|dB>rMN~o5iZkLya1<(ME=qu_6HRr*vf_ zxSJ(_K>2iBg-SotZr*g@z~_!j@H+xHC;?Eu3gD;Bfqh^2L#Wu%{M_uE+`io4?8KE1 zw$uAhoH*4^?!Pc==O4aLpFMR4m%pf?ar?%J`_4&K-`nK_=^3r}H}p8r`|aiOXrCAV zpVbt0dO~@k&uZFdufA{EMr{WUV(y|^K4K(&U83g@)5|Dd$!J}yqxFLa9+wkR_GLAH z+S1Y7G@7)ZiG1|=aQphfgAcUr&4urS)gFGT7B;lsd8GZx!Gr&xd8uph^Uc;%4v$XU zH<HEAPRyTrK%aA`9#Gf&Qv1?<UsX%k|G+8Ktn{8r?P=B7#mt+9eY$>l%RS#;{>20D zjN0{^<)J5^m8-hc4uABc@X(U*M@bk-H;47Sl-LsoM>N}w474YpZ1(pWa=+OQ<;0#T zikDYI29o8GQM)a_s&HYG{7L&CQ2NMvyDm>H7}z<UP3)d%mnG2;luT<==D~;CsS5x8 zGyg~p<6+Tr@E`>K@JBn^*C6#5kBLpSdc_@X{R(~d-gn}A?JID;ZPTE?8!cS1NMyHg z&o4B&pw4dYC+cL{gY)mTuTRv@)gud|@V>4lc9{rK!m>(SE+2S7x3v16daO^ZSlb6b zrxu|GojOva`0c$vJFs^_ws3I2!hwSa{y=uLN0uRg*Z#w%YZGGYoza2oW#{2vpYjjS zxzpQ2$2C6C`)XzJ4MoG_pFj1Ec@tj`JpRB?f!~HXnl9`)_3qd)UGJUgf%$`nf1w>c zesNg-d%yO4RCJ;k=Cbz=i~IuzPAiBw|NC^OO}qDdO8UPP#E9^FJ}1n}3S!RxQ*n9V zVFfYYvLW-i-S%E?4($EBcJ-j@!&`#!2eSjeeGAYJ${gh9zok!AycbS~MoPkgZz-60 z^`--#dr@S(Dcrv}tZx2v<?AQy<<0oQ51;<3TJ9<eld1mr#GE$uS-5QRaR1cug>gf0 zyl;Bx-Sg+w-R{}Acu9|j?b*0+X~^A$Rn0x_nO$6+j@!#5!t?E=3%cC1dg0<!A?xhI zB~9`8&Xrb2tL<gO3yOu-FANoBUb-MD%w&>8JL?x#hcB1rb#wb(`;cSO*I#L$rNw^k zo_pkUKRbE$!zCU*c;JVWn8Qlu4xazchqK>%`Q=NmwBKp>oqz5tC%^LQGrMyC-;S-; zWK9|jGEDF3&6t%z-Atp^o<_KgUm2TElu8amMFzVJ95n{#Rc0V`S;pQTPq%<m!nT0& z-Jbb~OS=wbbvHJsGG=CiV&=lGx_mh$TxE7fgV~H&gSw}hWt2Wrtx=`QXs)i+sBd_x zq;CzJnOATs=^2y5PbNb=$)N11@5{*Cb;c?^?Pe>cs;McLz-dC-vZQ5toeabc)j^&` z77Us@obZ`J_;T2oEME(_LL0E_6iLwyGcu94$|28d3NKVqMYLCDekeHBJM4j~&Yh5! znHVE$c4i-RpLqg!2*k;mZFDcZ4Rb>U%UB>hs|4Pv*O)~$pdlguGQ;Bxk#BB?x_9cC zf2q_nzp`vnmoK*ar;q=zoj(4f`#+4K)S9;Yx8;@&-pjyiD0jPc@T<SF<g!cN@yZ_@ z_@+vZ<UU6SANl8$Y;N2>_;~Z<1CKXnK6l_Bz1nOYe3<u!rtjX;`-jcr`ec$%laHGG zYkc=(eXi-vgx{-8U!U*mJ#HS>=XaYY^!Y<dH_9*4nKn0W9X$E7KRo!OA0IgK-WL!2 zXd65?J^Y-?{!DY8Jv}eUyyVRdn17`ABh5Yf{Bd(qpYQBITAs~*qZ!^LIlMS~{NNk2 zw+@^d-gIiVb?{V~^ksH+%d@I=ws*?ZZkgzvHABtA?#o1NCTN+N)||JN5SYDXR=Cda zX14iqS5{t=>GD>yzJSgoaog+xSZ1(yFfujFd~argB{)-L3`*@L%E<;J#XWtj8!%0n zR}S7XwOwb!Gk@;M_nxazYHM~iwP4aOEh}ig-(06W1cYYS1X!J=-pYJ=A){a$RuK#{ zPc7J<#|H<npcQl*W~;EH1(oJHQw<R*pi&epGSm(9WHKHSTFEpE231r{)*~#Y%je-n zS7wC5p0ig{w?v^@ZXEMxv`#(y_05B)Sh#uY;7_JMJ@~NfVmj3Lh}9e+@q$hH-s|O^ zvTCH&90>aei#=55!{1tE@KO)!Q!Kkl2;6J&MGHqP2(c0b;K}p~>X8SomK8lNvv9^T z6HA7>7q}!>mu*<aDs_b*3y8XBMUMq52=hXkv1*CMNR-H$p;1YiUcxfQ6xV`osjSse zmDO@bS@D8c*2er&`XrQUz1Y<SN)pu@q#?VReN2Ue)jXL=r8Ig2d|z_Gfe;LuZ!aSP zhefis7NbC<azh6*wfqSxBn?dPYt_)$5e*_2GV&T$Qln8XszNr)h&`>yRc6Bkno1gQ zz+9Ft16I&LQ=~eImX$yv%JnKE#PBjk+kp~_V_Rm8`^L?K4{1Gd`s#tf`hy3*FDsnr zE&9BiE)rCRCjnUP&&q#!I)p_?<*?{pm(k0@J&$QnTr1<i+42qR<E(pY4b$u8teI1H zx_fmUaOLp`WdJxSJ)SXOEgmSmvltH&Qh9Hv=xBN+%j@~qofqeMRzqvX6F<Dcsyj5* zH*jP}f@2_g6v0mcgx75zMkq`9dL-bg4!9DfQPtB$o)Sp~0In8cmB$(2ySohH5Y8hv zA-;R`p_7N6ktk#$<UHTO6AN42Lpn%G%i4uo@<@rm#qE|@u6^%he)HgC(}}jgJ8=0E zlZ~4moopO@?EOh^%KHPo-<!Or&xzh+z3-j$^|>(-lx<zyDhn7+8eKi7x4=w)uJ;?0 zxAb{N@1IPDlX$Y;^7?pQk5~U}tS621{)OH{y{CGQ$3M{LH^%dm@npv5_~*Lc)cZBP z-yWaRC*|MMdp5pDpVVr~_gLQ><0tgFJQhTE%zKyh*q5H6$`fnrc|fo{QkBQc>SKy| zs%xTWuy`zvN5S}B=P9up@;Div<2+WTFCL%M^J=8=IaNZQa-$lLaq;Nbb`Wwo6U6;_ zGEEi8_Va6M)XMPFxjZk%1A9<XA4=n?#ol;BZyt2>b78_br9z`G)vZK82v58D`AFf( z6U!q#5?7zi)MIoa5**!=k*c$*G()S8_(4x^1WK+V9(eL&Yvwj3_1uJ0c`C1a=FzMq z-It*VP?BRqIp{3U-T}2fd)P)CJb6ut$aTW=bGiFKjQCMastDFqE<?HT$eNyC-X3Yu zcGTO}Q*-*(W96gm?a^pkuhDFKFE`s0T`5_qev85Fd0k6F%H%Fr)D~{nR<>lIOMs@B z`g9f0BYWF(0BW~yFvt!riQC(Hv`=O9_`V_RH82R=Po^kPM6`XG>bNi%Wj?y&N(Pz| zK#*q`UCnLY`qH!QBmJa66v=w@ZiNf#u2A(bti&t1(TjfxIwY$QS0Y9)DP$K;V^_*2 zN+kesSpbGG(F?qhh=R4rXl`4S>>)`%6>+A@gG4Bm6t-YZ&+!9|1PKkA$=`2aRl?2o zbp<0>{YHptr@BVyk_w30Fra7Ftzr_TLjjH6_k|8UE2GM-C3O`gDklKAJa_ukuNMk9 z(j_(5=BpB4v>~zq2pciDGyKXxziaUC8~AYuziueMdm)+Mz3>B*eESz1`5l6PvEtt- z@UtWRXhYZj2}6Flp`Qpjsr<wO0Q$|tx?%Yj6S^DfuKqen`1$EYDnkRmwNQ%cmEVx$ zhZOvvf?tW~=NA0tgwJh*DL<d!hY+QzGx&{$PyrX-Hk~=y772}i<05(aXBPa{CBOYh z?Y1LDI&luP`{yA3HUKL4*HEGa9Hs$s_~8a9%kOZ?k4YeaDnsGQZ%67+dBE9hpX(^E zVxV;R0V15|=ROE1BG>Op3I{6TZt#jT=gyzgzdoAtvvckF=3GzjtDSOQpZquHE~k*w zrYc1V-g`)C&d)1rs;c`9hvKb4jnB=iK&!jf#ram1b1I;WbHnmIbCEq%o;jmAzfU*% zH)zwfPnr4$@^!xI=sACGdVa5qkA!5Z_w3vZlJp7MPz!4D)Kvx4M=K2DQib!TdUozI zBhzgo+;iv5+w|NXr3!sdaG_OM?YX@!$rYRi)qaCZWhA11<wQ!*UjXiP*6iHav^Ij< zoF5w?po;)NHaoWmAhUB<3Q)jRR3No(oE-6h3i{4(x`NT`16I%kx`GNIixNuvE23&a z3^4R-#E4M^xS!}U%EUSfF{U7Nd}JpH{LU$MqkGUx2uhtGEF0hDXY|X)&Ear!b2i+k zEB()gdwnt6oLA0lvp1Y>YDPxyxy@m-IXB#FhCRKfn|mnV=(1Iz#)bHHiMAG;QB6rh zfofH83Lb7Jt{@!3NaZ~w>&KP`KOSBcx>V9gX2bpD>u#)?pxmD<RcSZ(IY+R2x}8DT zQ1nfev)84@2HTj-k_jynXoEY!2D<0~+GRka9^6C-0W%wp%|kPsSFUS^ZMcA@wlX)} zydn^xcw+dVm~D<!O7kwzB^(o^)DABvuMlv3Sn;PB))i8LnbxY=Q4yqHqnf2M-!tSG zV$4Qvko8pTSTvQ*qEN{WJR#rA0}w5@7NjnEn_Ctjy3vN+<r<23lRtto0Rl}UsV2Z* z?vx$DR#S?)hTEbF^MPVrw3aH+CcX;nVo27$2#cAje6b>1sZuLh*TJy=Ax9St(oI64 z9El~9PZa<)0(L>?g-zN)HOV52%Sj<wmALke;L46L??$9|QbS)Y_9N+(w$%)8sC7zJ ze<1{P=?1o?O3*{AD0Us)I2TUaG!AP?(8(>j9*PTU7NIq139(VcDQlY{TeA#xo${mF zt`%CFf=u(r=3}&o>MC;$-$tDVGBukMv#E3_!U|M8^!7Gmz)dk=3S5aOfuolNnC96V zj*O3XH&sR?XF|e96Hj35G($wEVc=%ZHaE8{q!9uv*{L*cB$jk=#({w^P6$y;H0Z91 z$BH(6`dPOCL55Hk|27j&`;nreDtFr0)SLwoRspiHn>YXv{WbnZfcz^Hm3CS&_b~w4 zQmg#x`nanEq7%_fk|}``a}kNhK~*CKQ*q2Ob~v^dlLX@18p{HG$7<3Db%QXQ;ngNS z9K_bGK_!F@tn2E+P>Mns#$Q?l#_$o?tu_3;%k@)kQryT)Ok*+lW&Wo_+I1&3uCWaW zOOr!h&G0f8(T6>*5nvh8B{eLA_(#?HWCzXVT%apuV?de3ek2xK*ZyT&k?3*8ES}o{ zs!hR0=NY7awM<^f3_-`=XuANDj>@c1?wpp+OAJr|<LUfd^r}XMRWycczPPdLn09GO ziC5KEwH>4dZN0S17#N<{a->_rbTK7WiU&gT)8cEwg#gnoZS^pN&l5%N#;64kaUD>L zDe;XJRKFBOrL&l%+mLMBA6ho471OM#fki7%X9s5g<LY*tc0nbg+#uqQYbPk)Xfbqw z@Y#t62?%}2Dqd?!!x~p-MnKUHx4P;j?kH#k=}N2D1nDj|Sj3t@A)=2h*Z#zkFAj5a z6U1PtK1_U>2x`(quC=B`sbt0Hj#?{*spFyKNh26QRm99nKs8tu;80BG(yEge&*^ca zoT_6b3f@d#Hu>74tA2%ttC`{;LLc8276yUE*?CmTl^OF&$K7;so(ot8A`#=a-B?wC zf#CEqag^1j!ar@G$f*z^nglVB+yr!={v)b3PZnz`fL<t?%}?mw|K_9PNii%^kdQF5 z+3<?6OJ$_ic6zrS?V88BR3`@=#t~(rjnXgEyd4i1OFj&?bkr7jx=e^iYp@+hk$`8~ zX}JW%g3_s|^s1$&fXpqpNE8O}ogOnz1Wmf%o(M?wy+PNh*Rnwd2?Wd<IIDT@bn$8l z;U32ASg2;xwM1;z23J3##2VO-#INMNZQ~1R_@fdK)Hd7oz_1Xb7T)xnrBSI8(uz~7 zLjj~>Od>MvqKG>VSD+@2jzns;8?2L%R}Dm|+>w)JR(nXZqWn1U*f6C^<G~C05}Bk| zvjmH%it%8g&{?}N+$UyF?Q|TW99y7+PSh^cP*s|gD75r<$G^xU76eH^{7AuGN~^|h z_T<?LKQQ!Bl`TL)#s9WYLqb}k1?no(($^)lz=PP-t}NXr)jiByfA)FodgRbybNKo< z{}_a#p*n&R<6L?1z4t3AMVj$(*Q<1;D&NBz6}hQ0vPzK>k4Au{!zvn27_4G;bxj@2 z*ks~CR4@wP-P@oEHK*zD*Nd1c0hLmciyt#ATGALtk%9#qN-4xqAP9F{7O0h<42*cE z|4C7KkU$Khfn7ULH@k^3AZR-<>_rOe%o;<)7ABi^Y5?n^#YrhyyKgI0H7(o(6g5OI zMAFJEF7!l;+|_3TnjS$^fj*&;DY-6WgIZbojHxF!>P80$$~vnC65oVxnCwK@Dpbc{ z7Q0k#>-*RlgFm)(Y4i1^Z)|Qpc*ljMqiI5E6e#!mOV0>e0y_jtgRn8)(=6@3<-C(J zL$cExF$8ERu_a=G`8xR!SKt8z_5d_9(J8$K_2i%k*u>8es*q-JGfE&i@jvEJfJDw# zG+iX}jkbz?q603Aa*-}@5{v@Xx^(ZRG_g_Gu?lJkMvXeTvAN-_>fX(3NUm0w-q66} zTC2g;&J50~-%Lm{Hs=m{LM{d{E0MJHpli_yV=#$K;&TYMY%+;gbV+qgJYZCb4y2eq zv0S>kUEvJ`q;G)B&M1+*L;1j0z4SbiFhuk=nV~|Oylh}MoYCFp@M}vy9zL^lY`Avl z=}U)hpKbmc<h$&HOKZcQEaBr^NqB*js8n&}6KBqUb?HmaEVcoUb?gX;(z!a=Fx07~ z-}Qkp68a|umf99vgwc8g2B1*DcO7AvkTM;R7!d(LpG4T~?kHTDG;BVAvBBt*s>rSM z_g!aNXS}-5N8v*eo-PmqZ}97dT%tn!tKdNj!?6q@Q>aK@g;l6(UrsFU$Ngv80V=mh z3bBZV7MdtHx`d5HC!TjS6+%E#H-Mud&1#sfD-Gid54vE$kXX)%Q80=YTLLnI$g$wn z4j6*sf&uI3s)&OsbhQQ=V8Fp0m=C2R5*!6I6L;z5)uF$6MkR-vFE4#-c<<t&58hgO zV|D57SC*Du+gyKeaq0HghtDl8ExrDer8kDJ99vp?)`eH^_|oPjy;tw}%JWN0FGIw4 z7as#m024$PkG*>YD<MYikz59P=q+vO&!w^o`M*E|YLb#(Ev$M<OrY2tvZ)FR>o9Ch zw~V+<9>9<VIz)_iNnk8<9i+!dYjanqf%@?wae&xsHxs3r0U_Rji!p`9+3?p2E5@vX z5f2p9hNf6*S1Lu|$6m{HdvZf%b{Y%Py3uffLydeuU<?G$wQCkH&4MI>&A=3iIa)Bj zBB0%Vi$;)P7)8T<Ra2U$EvrOYu$-}t$-(9_-EIp;7>WD~t+-^ss$UX4^hoxEdOlW3 zf8iZ%Cv<3O>8CFox^(H#(&Am}ZZF>Y()0Q{duZt^Z*RW2xw^FU%D0{ul22`3S~|9Q zk+*8xwY2y%{a*jj($B$T&f>V;Ls^366iM{dz$7e*9%tAL6%tY-|E?WH*iSHy6?-nO zV%-E`@l)xoFq<${dR1cVxV73rGd}m!M<lW{F<*y#p&@+@szgvw*VOn;;&Qr#U%Z~C zH%zYSheS}ie<PWy#i`bT3#RwcQbi?<MR?Oc)ef*mtXOm%?}R-X6exPupCT|`Ms84P z(hL^e0T8;z8fiH8YaRlY8i2~AiYk<m8)zV=1f0^;C|nBwh(8pOTx;ae5Z%>S!tDp; z&o*z^;W1?pGS=zlfTa8{ldw0OTNbw8+_?47kCsj^p1%L?&DBFoZ)_YobYXM&{yWF? z^+$)+RdxTxrKKMTQlln*>ChdrL%n5r!>=wquRi?H&jq%dE{a)bZO3xbS0a))nPNm^ z+ClYSUGs$nYS*w=01}oEn&3nkOW}=()=QJNGG|JuzRG~f=I!_o-zfWm96T@R5{3%q zsNBZ>Ku_zBgRVANNUh5%rex+RErg3eYq(S9f$F-JCAQ;WF{ZFM8%mYbb!~l#BveF? zL2I>#r37Xni*(`LEaTVUBU5+EPQQb-(*SH=AkG*G#o5M<kHH)0q7X{aPP1y~8LUl7 zWw*n`6L#TKaS^jWxu}-TsElkNE|Too+kKj0tr+?0;unwp;?ONJ8|+ACb@8IQ*~KMU z+R{Zc|3tGi_oDdt^Q$tlRTbhr{Pxmg!#`en3}IUseB@%f)BdA2V*5H3-j$6FCgu`p z#Tn_!4cCs6nRovSM=lZ@#bWT^SY~k0U7*go#9?)0^$;6^d*0n7_l_b398GV_ngNx* zCSh{$D!XXTQ~;><-uCROW^%Lo0;#a0qy&GRVNzRV<3O_lAYRLKi870&U<ouIHB4%N zD%}-OcLqKsI6y<TN23+II{GXjmhQ1|6Nn(nN>~J1Y_!zrCb`rtQnYx+;;xGhioT(x zU=RV6?v{Yj6ol&)IF>~n`XI^pBT3OJN%&rR;K}B{_x+{CuWa7Bv~+$bJCji^U3^N$ z`A171_-z|||B1z=i(tSa&#C*>kY#iD$l}YxcV2iaT^4wX5<^a6{E(5w4$={yS6Xbm zHQ<s!ipEudHct;+9g;;!D2}zLZHLX;c5MsY(t`AX)!C#qr9ff+fr=U7KxpdKugN8p z5@>w4JqbdLz-Hx%2bBbpKe7CH5nBMnV?r4SL!f%0U@jFP!3-4T#GnPdnndl7Vbb%# zRM0C9(W7cG$7#)Wtq@ZvWv%IGyUMOne~jtS)OeFlZ%EW?Awjtdt5{G`kVp_YHg+Qg zLpTY1lo8bqJF^5Tos&B_^lZ_@_B>t+fK7M1|Jt&t9=@}*_~P)Zi-$Ic^r(2lr<T6) z?9$T8@YvF`?}*k*55M`Nr9*4Y=EpJ3#}1|6eOlv{pATQT`{m;IMPi(IJasrhfu+BX z%ON4nCK4+INe3|vCZTGYzIPUFB6()UGubJ+^gm5p<?Ey<l|?&r$UE|=y5QcuF`}!D za+f(|xi6Zk3P|rJsub3N2dIuKf;0<B)_&Y=mVl~3ARN!y868fy3%(qli34|w0j3TR zs!E(`$Jaf)(oO8UXlcT_#-_0^={KSyEe2Ny%dw-dg>NiYQG({3?wKZ)MxDl$Fq8&j zvo&0;9UG}W^j|RuqMqT_ZE5(K>@IwCPFA@gLVcQ@-`p9C^UvHW&-e1uSBADgMSqvx zKD2bpSC($wd}+zu?doi4?q$jG`mZl7eIw>~bdfReGfUs}L~VGVnS>87^MxOGEIVRJ zb0gXap*8_LH*zZjhG=tFt51_H(G`q$-l=q31caGrhf6^1TA7Hp1Jupl0Ufw1B0`3E zLkT*m_ytRS_xe+KReJa-Yr(Y-#A|dx=WO_K>q#)IH9m6<b+iz4mbO<$TNGhczYH@e z15th{1M~Dl91@e+$T&&aqPPs4RmEO4Q-#4qh~daV7~^=sXKJt_0LSOWZxquM7~CAa zF8?*$NeEJwGCMGI^St=CgWI?4TA6FZ%T6~x{{C?D{f*7dRedADi|@OLu(TIVkOIQt z`>Q2pRgrX$DoisjZWX0D5D);Q7?LXkWwqc#Bf?CYp_nv9{161yv0v2&X&93b;}<Y7 z`<&WAxZ#o-;Ze>O=h3bzDA|<-qWBSjl`#WpX$@)dc-MHrU4se=(1}(LC(hHUq-~%h zh(s$kU??Xci71k|9%Bcc2N;5=8xvNg*|BdEvX*yZt1|XfHC!#AU?G&pp=Su}4A_Mc z!>Ii2m|UHRgNI^F1zUB?G*}dfGf>u~MwUXkGXivbfXPhi*GF2)y<OSfGiU?MrD5Cp zMVSb<OQEn^5_GHJl^5mTe2v5lRXm`FY!N3dSx-wT@U{(XQzqfHqa^rN*%FQ6Mi^~+ zeb++4(U&Ma9zoS<W{$}^GqIg1ZZf{w{WZf+K-q`?lafdiAAsq=Tb-6mX>eko<YMcd zvICS$<_Stuu6!O838M@|MxxH<urod9YAPLh#9aqz8B1@Lp^M$5S=hF$+dR4j$=C;` zSVuS9iLPJ{_Jms)Sdmw35vpey*D1@;O&^MM^H+f`gv*nV)d1;&5Ff}<BwnHz25L$; zlI~-7rpxvuxA+OQESuIoObY_KUMwCbO{2sUl_lUsEkgQMvHCJmZQetb35&^qt}qsP z*rbql?R_vTmnc&LnZb*qse+ZJ7Xw!OR>ITHI!kn73Wgc}sAw)!gBa2B!UP$66y#QY zRy~WUr^BwD5|tvX>T>*Clet5oX+?nRNXPC--qafvh%x+3>2dJLYNat7fzDG1u?<*- zIyIyyG<uBpG_nW*FGvA|Vgm}aX7kU6eW5n5N%oB|VJ0dm#8eI-*Ga^rH<r4)VTIAk ztU2nU?mWosu8YQ6OguA~hEa_a40^Z?<B^+j4|>@dXwrWP>k=u%*OaMiQ;q<`E%cX; zp+f<daE5VGqRbhQ5i2SqZ}`A-*n3zlHaiKNT4nJCk^~PeQm%+*R-Sw$Q!i!ZkshcA zY#!9$n`x%<P@w_AKV@=Lbk`B@EJ5qK^(Y-p#0X+Vo+K?0Bntb5JgW!g$kZaFn$<Ij z<F1TOWoYJ7qlZvjzUYh9+SNn2Z+EV|b<DE(1FS8LAk8l!U|6;-t5*CM6j!g2n1rr` z?3hMsmM6#@1QfAI+O8*RY=|}5w1=<`cL(`tCNhKAB@sd$14R;DM6#=y+tq0*7!OeT z!`fK^$Yf5GlaM){HdC;H>E%B-K@{mH<0f}HT?AD|k7gU=LAbjHP*EZFCVq8;WtY)G z)PVP|?LNXN6m|IHp%_OHDDRqvO*aMr<PrOU1hgWfs1FgbLg^l#9^7VONtW5-I+>PG zJbo9xFtgZ$jlHfGivp$}csM+7JODwxtgQ@mkQF06_)ViiVOT1iBwcy+?s06@q);xR zhmsg6Jwf%uETv-IQBEel2o7=&`!(uxvD&IafNYFVY{%4eV^08G=~;S)q?vQujn=V5 zsU1&zZ-$;Ko6wjsKpa%W9b=w#PeP{+_@Q}B$kry}-6Z1|Z72y9ce=Yo$<&Y(+^(x| zFsd5e3rg)3JL^#jYNw^7wUj~;sLAtl3n5JO?3BlR^0wLRS|=-ka2NOaM<+JpfRPkq z&-PgcgE%a<GFK%0Duc>FSPZI$X`YL!@XU2_L?Ye_$^dOwvoM7+53yQ85d#HAHOjis zjvx|NB`=0bP0R~nb<qO0gKgD5&Np2b9((mXg{>N7TeWiKAGpP(ht(a$MIQ*FED-s@ z^a84Tm{Qs9BKIr{eqB5(ff7jKKH{bvqGe%GM&h5~Sj@1DVECp1#7;_AZG$4mk&6_l zONgS1pp3KjW4A~=hL~!0AjS{6DeXMLDFEgKCTSEHQW@;0W#k7${FtFeOtOSB;4lqw z`O%5>PRQMLBceiyC?{4GVx7pSiB=i_(O@J1u+qwQPljQEn0i8Y#3RzjnuQDt{t7?N z!WvwN&NSAr+lWJP2F?_-(#pJ+$StO>0|%8Ax5c1w$N9x_#MzE1K^#)UJl)F_3K)h- z3VsZ_W`<f(ri}P*nKR{W=K_<?YA#b3^UJGi)75ruvU>U2DzDWwUAJqStMj^Mr?cK# zQ?B<aZ&i2A+DNI?nyv0joo4k4U2v@zd2?$j*0`7eDWP$NIqJ^@mBb1~8>%a1y0!=O zGZkppT&`W)UcFl7APTxxMcHU|57!Nd!8KdGG8ZmF)t;eURcfdRh}yNwxo{$dX2CHt zcRLU%y{$CTr>pw|*=)cykS7)KR7J)vS}5TL$-xcvxrf7Mb#Ks`KNSHy>`(j&HI3N} zi<Bh|@gn?*!L@7qpnug+w<`^Su#HI8RB5(0EFi&(mYT@4L7osiMNI+&BojL=pi~m1 zE+*9lv50h^H-84`x)X+ZRa{3h05PBNXsxUjd4y(bu;|7J8`m`)p)MptDCKt*6p;{9 zq}rt9*wVPnfP{CeT0vBWxMxX%OJBl-ksxq*llAIlQE<C$EW7HVhLoJ4F}*0()^;J( z(W`V^v7<%QTq{OLDi`?`y_+J64t<qW7}{DDLvA#tWhTNSB&-t<Q>&A^TotylGU=hv z)1<A@cm#l!8-lo|<PH#0uB2FAq6d_qu~Z;$8rCcUk>=aAwGHLaEXa>uN-XqCo3SPJ zm$zv97nS|ho4oz%)L(|{Uhz+C6ZbEo;a5ZWmrMQCT!e=I&me5D>-a_OHTkWP{vZ4B zc69~!u-$Xv_YeF?rG^KF`v2#a`o+sPy{=N*Hw{NO{c}nQ-~ajgw7p^U`4`wTwf&Ly z3cb*(hW>vEZjnc=F+BJO7ruAko%avC(mwpzX8Yi;s8RG)Ym5$VYG>=$U(`0H+Xvr) zs)N58$C+AV`{1Z;ZhHNhf6%JN`F{Z)%bVKk{`a&!-woRbU(!as7v4MYX8YVt)6q>^ zf0FfLFvE7A_6gQ*x(&6yaNvM8JZ0<CpPK#8{xWGr_!ru}qnmWR=&aRg9$)^I`nk}| zZynsYx8alzHu-zCIjzqZ%gG%*?Ss^|eR;eb8^ZQ{Uu*94UAL{@vbOyjo>SVh+HI@X zKCkyTwS^xifN=f?b%D-VA<NC{`uvvO@9I4597@7BdAzy)nIe=-yIi^K9ptp-mNwlg zThOtwUwyN=UfINt&E!aC1Gx{BtUbQG!JN-pnQ03-?{t@n*^!Se=mfXy$=9khTjQ;% z?xah-LMb7^z}WR}TW|06=c8hr>D}x&b4R<Cxm<SJ%jSCZxS4VQP7at6;*^A-iTDfQ zY{o~5614A4-64<jW(@YClb{kr+Wn3%ACtp&ffR3>t3nYXqgEjjz~0P{WZt2b9rnn| zCV;Krc~d>epJwYpgAiE2Cpmlg2}VJwJphd;n=Qge*{6@q451Z)nO1mfn=7aq@**;- zK)Jx%*5{Ym*-d+~>7@&u>c!4$%GP#l*|1M%`{+)I`lu=8SSqJydpK3$q$>Wk@mDGf zq&JNlmJ_6mfm|KlR`7ZMx*!J!8_;Dlyn4cuH_=lC2~9aZLrd&TwVz&BtL#t5_Hn%H z_IKIF4ycVD$1KF@dgqWZ`1F>36Ya?d6!R1OVS*#8v^$w_YmY|dt3b#oI{}iOE$gyH zoe%3$IqjP$Oi<%p?tm-b&F+2vBGa4cr4}^jj4cyOwd{dNh1PGMUZyJn5)M-`-Nlp7 zFf;ioKt4oAblQ$hY29{v+#(@1DU3dmy7vtPR}4WVt}5d27Ztigz{;Uqkm3yo*#j^K zje*#kHio^jU7+^EEB^5V@AcMbuQ&F4^VV{8BRRg=_f9lxZ#s6$V?($x`{Mb<ZgD=a zkGk4ZkE0JKx-2`?ZL*)7ca&=;m!$@`-sdhm<auX5?S!YgTXk2v91_?}x4Yfw)&-Wm z^vVu^(6E_Z_QW-*)0`}*o3fjr(1ucNI>%;yAv_28u@hk3fDpLZIB--BCu9>r_R6dK z<x$#O`pJ5bf{<Mo?qOXo|FhBFPMs<~VC33IW9qOv(MrNQdP}c4R8uGU!2$oHdaNIS zw>Xiq=5cyqfa$<H63NncVL$lUwJ$i0uXO)2ZK}t9d@tzzv&rWsNA*3Ptm%_2_ny#u zs8mXQRqvm%{a&$*m$X418}41y`yHL|yhq#YP2P7R`|hzP-|Ko$^k(NhcGsJX*Yvqw zQpkO4Obzzp`>Eb9>rIJQ^nQ9wO?K$Jq&K_#{Y39T2?_IO*r~4UewQ8KR<+Yy%kjM4 zAg`Vis|~ocRh$dXMj!E>aOBtB;b!HuUhQY*J>s(MUOiovE%>s*T=vkbo6Tj{zj2TW zRHIW|%eHjj<=ED3HkhM48`(hw`|)vIchbx0tlrK}^prj9sB2o;!B0DdRfa?_fYox@ zz)t_{{+GJS%9*ny2&nS9Z2^IigKsM|AcC3w|9sf6Xb(4aCqhdGLOIbkCrw9K*&1+K zcQOQ#GRjAG7A$-8&Bj+I-4%11E(yMc52$A!L2XQ@&q<Y|4&n6?%|JzD;<HMt+(bRm z?WD_ubL(9Qpj>ZT`2I85#ZB9QmF?=XbzR*GE_=$!X4w7ByTbLfADpDez4jW@r#4R0 zW^r}PI^FE^E^yk#&HL;r!5ijfqq&j@JOga>H5=Vfwu4hry&`#M3%@{crqo{d^JDKg z6EfSryj0W%W~#`Jeb<HxAR4u{Gu+v^P$ZJhMsuTVuBWr}%65O*9WZ;`c`rQBXuC62 zfK@{=x4_lDX<%m8JY{63LF3Z~ZrR#yCQLi~?Wqc=EkO231dVpLGwcuT-^a#-*%{H` z+1Zbc@(N=1)4Nuc49@JqOx>7J8EmqL4xt#`rnaP%I!X<L+OILV(Hhr?S7(EJ-$AxN zWdA{`vyC9v-t{j#3uXgAfzmF2rUA5+$%cTy0ZH~moXc*0b7#sPcG`$;OIyWVRyN2h zd(m}U<gqQ?yh@C`;T#**u|J=-l5;`!|6{W`17RmR_MB_B_p!&_cDKD=wx5$AmBMC! z<N|>$>$FoPn04K1`@mLsE_dac<~{S+xKA4bvi+V3V|TpldpFg$u#vy2#F|l|?spCw z=DD7vqRYHD#YT1&EFjH8&8>U=h3yauPM6)e%_e<eI@dEegm@#0yh7|`M=VBF^D4?P z<h>8IiKZZsfw0+C(Hk$8od8V(1dg|_3@+nCg4({2S`mX_XsblS5)@}mEW>!5-kF=X zKDYJGmKM?UerW4)eQxP}QSWz@bMw}4D;=0OHp*mfc}9wPWR~BUCT3E;dnz!CwmXlq zYt16F-2Nh$YNM=!vFemXpq@75^0dC6el1lpnXDOQ?`X!vGOtnAA%xl$c)T=Jlx2aP z1!E?<%c{k2L)TmN5imh9)gd;F@wsML0Pw<BRu8!Kwk=GOLjYj?gd&86Q|7-ZS4b#7 z>SKXJMRt}N*~o=^9_rSd`9`_b<+f50OiH)DkFd(JW?jw9<UNmJLNLOsDRtIf(2z%2 zIP{&k$*PR*#+8k1b(K{^mQDSbm^sWd&)v!^s|PF!L=aFJf%v;bXVdlBM$hlb#-8<! zjr9u~`}o?}Xx8`Zi|dI>G#m4}oUKnOwZ1-5HWjxwrW<=Hv%apoi+Yb-xVJtIxb2O$ z)W4j1Kwj5TC_0Zv@YXjs_8J3~b+FC)+=igGg34`A$a*T=klf`OJ(=T;{RWpRIsi&( zRPL$5BzeLx-MGT!f!7pY2%4!%0e<XS)D$$o$eCARh}hB_T-zI>-jsHfOf3*lT^j_+ zRz<{xYyh9ik=4j7Hyd;78)R?jO;J(q;@oo$AAD1_DZ<rJ3`Jr9<qfA6i<KsLW$J9a zuIZEY`L*@6$-3rZ_2!73HGPlQ_pGh2>y{)<YEwvsh0ymYO1g{b2>Ep_!j!^P80kGx z;mP`5K@T7*ZRtH$`g%!UGxnKM_ESvhBVBVpw=RNiaAoC?SwCimFSsfXt_{7X>z6y9 zQq9^GDNH4)M@gWi8bzrBDZ};sT@_UpZf>XHC{o#0vDy0En#Dv-al0nH_f%4gBL)=d z@rmq2HI;a;yR<JsIRVaC7l>wCMW-p=bdt~nzOpv;erMfeL#A8a+_LA?hnjECdPn0G z6IL%q%=u^jJ*!8pRuGu&_gV!D0A&$j%mqc8Rc7%sn_mj$wyVR+3`-_nuhQgxmff<1 z#ClEEF<2R6<xO(QB>xr*2Q0Vgi^MEUWXVA5F@8Y+ODe3Eu!81)-R)ig+O?zu?z*}s zxT{*?U~z~A5km||O3^Ap*7LG1la&jV@0Rz(DZt7yVpdcNhb9Th&dU15wwFo99sgdV zqdwR}J>O6OQ*ef$+g-~%Mb@lk?Jq^Tr4R(UBOhvdnXDuU7>cZ`EIaFKBF+n%AcESm z^29o5tVHMPtj=9pon4x(?!UCkYgK2)>RtwM=`s?Oa!Ja&Bnc{Gr_dhC&MwWX1lfDJ z6%-wjs8nIQ)Lz<GYd4p)Y)MglQdo6!c{!E*-(1p~kupWh_|hCGdzZFWuP^~7Od8g= zSP<}BO@IRpvZqU0KMK7-n>okS+z2ZE3nG6D^7UPUp}S1zHqZv*c?s3(w2%&umjo3$ z;j;;vX7#ELn6N;3vntMl>e58y)H>7E>i}WUB_B{~6c!+&3~zwAp(|Iw^EGw><P3p= zHC?@|W=Hxx^Q}cPV-oSR)k!CN67@n2y-Sz-nh&kQl_C?sMP7)b-l)7ZL$y6%(~7r| z0&7(y?C5ctl5KRjmjdoM=FZ6Y#H(9zj4|zk#Xr(nW0p<R^lKYqG1qM{wlBY0mX_Tj z+bmeqnrKp9+00tEo+2PoFIG$IGG>+!adfj)t<1X&g@jIyS8rM>l$7OOkQV%;RyuKJ z<6W(`I@h+gwAtzn9c<CTHE$`zI8~Vy{O<7rHFeVp6|8>poPgI+w^Jr-@R40{3j$Ca z10?4OfmI1M3-p3lmQ0I}t(0dKpG9EA<W*EqgV>KwAPk5l0T08Y265Locl(>_DZSiJ z)${_&lm9Rq^aANUlv{keb!gq$F&90mpy~laELyQzC3n{~Tb`ZaU~`|A#?j`D-qYpw z3<s<G#o1ns653^*X|C(pGG}~kpQ%TLalG10xsBf2dbekWf;c;))6n$tAz-f0iD~4v z%R1j|dWN&ulv1J8^VEDw8kL$tlJGTxH&H#GB3EGfS~)&*jq}F}m6ubO8=>Hkd#+WC z%CK3$a}e3&%%@7(ly{|FDXIYggDApC5y%O{)8%0iO>@R)xcjKI)Ins%#%<*53#hON zDwx)UwMbRKK4Kiy5exoomUWgIFIBX(RLW=0BTNg~nJ6K`2oDnq3&K>~o3^p=G^#t5 zL|dzvQ}2w$@Ei228Yxqbf*&t)V4wb*<?)%wmO@n{oL1Kw5jK*$R^O^bt>z5IG1M~Y z&dF}?{r`7G0>3PY-rW3uH~(MH|C9O8&;RZD|7HHaoj)*tWd85Z{~e|MgZckz{(qal zeg4?|SLc5^|HAy4`Df?fn16cy(fR*l{txDt=Kry3{N4HgSvCHyQvTWeKkQvQ_uAZ} zy?-|U7v?XU|5xY#+WfyVH=O_E{AcI?QtzMi{zmWGyypLLz51o^zt;O(z5k~7_j<qA z`)6}|d!xA<=Jxa^y{7jIeZJH?+xz>yKim7$dQ~|8S?}ZJ^=Ep&)BD}t|Iqu7=07q2 zzt6qX``f+0Gxy&7-<x|?JnWzUx90!d`Ok=w{qw&*f8G3V&;R@Le{TLS&;RxLzpC`# zng8AStLFdp`K#wf^B<pERnD(<P%HFb{{F4rr+a_C_iyU;8NL5<@2~WJtM?!F{>!<| z`TuF|&ECJ=`@Q*3&;PIU^S$4l|INAY&)qlw=jZ>&`M)^--&eZ-pTC>_-a&sb=r;qc z*$;aC*<iju(B~&e)PMJ-R8mTzrr!=`daLkY+P^G$)a&&pgSq~o>G$*w=&3-@kw@XC zKd-{G{*{2%i;tP|W&*5wQ`hO693Zp;*qEedaG5I<S_Kf2lRxWktL**)a$9xU{vM#i z(PXffio&2e<4Ox)_XS`R41;n1x)1TI8&Ig$WUvS3ry{R6fUJfDxP%#F2Ac}BdYg@j zFweN06)DVAt{q$r9Nv7Y?3KRYmb*5@>c;ZZ{T0a~A8}vaRiE~+B`cr|Y&Mt(L<7B% z7#QJq8UYA4OuN9iT(-)VpuksH8tcMJ5abWBCuG)8BRIT)RrER)3d_<45J8s|$nFh5 z!+Tg%0e4fUG|ERwzzWP6S};TAjq6$XcH&kMnUW>N3AA!y0GL}4PL)$kpmGmeh1Gqo z>nh-_4It);MXe96HBjrxXlDaim#aZ7QpM&?VN=1{&{TS=5?jT%gaox?Eg}gFHp88k zCb5G6`J*W$Lvv{QqckJL7K_845R_p}OJl0ClhQ%kAYhS&t#qxBmSDhGZzCuu!?~>r zsv+|7$EHAldmr}$LF)-BCW?fCJ5fzBVHgxd%C<MDA1Je8YA^#@bJa@nDkKrQ5Q(ts zI~SROkov`V>%HYMvm_0>LFg2uWQ0LWPi50o_%cbYQ?8;kFa9yqh!aTzp;(9H0Lf!~ z45dLZ>UfEWf;s}9^*?I32JP~?MHo$5cmWbYT~qP9v}K5<(1OJllbu8p1z6m0^?6DJ zID&K?09EgbEy{vL_pFM%XU=UB#Z9$?D~#M9M!losv>&X(Vym~71kylcZuv93oj}V8 zmDd!okrxED;tdP4ajFRz`PCK_rMRGw6mOlFUR=J71Cu~3!e7c2+TE&^Q7soa&;+Xt zt10YQmk9)l(G`_qb~FpBq4(PEr{)KS!m4GdGHM_r6)$ZC%W=cIzA$3&W*)%3h!g1m zI|@J)WOa>%1|IVp;b1HTe-=thhbqfcH<6dIp&NHAGkH)76;;8Cdjtb%1|O@n{9TBP z%qdF4#qLWl)Zy<`AKLZ>^(>AFXH;a+^rK4v^KNX)Fk&i|!V52MPZx~B7l69x91$wR z7b+)!=-RnbAw*<@fMk0qn`QMD=_C+v<IXYlR1_n{vUoLvj{waO`QnA#uq_#d%3faT zL2tqUK`a*|<#*023Pf}y*A}ANXc{hxN59Iz^PyY`&A!}K!k_X0M^9u9sf>w08n}HM zzebk(tJtvQFebjSjEh+4R^3<)!woUWX(}H}*&>4?f)EV}TPhN@2)*sP0Hu9kzlfQj zEUm$P5xxiF$q+s1nCRUDN~q%34X)Ufj0l=*=tqBp^yA&efB~wly(*+q7L9=rfT}bp zjw8(!T6Vy8ZM=kBR-dCbOe!{GWJoufi>1-qx>G^?5k1zvV{NMCUWta|CM2VWg?*yQ z`Z6lm1ymelti{ojU|IqlP)UR8<4AqxpcY7$dfMp3?FuPHy;blc#inMEgc$&xCG0KK z?{sHS5_;nwCj;!$1{AtmF%%)%tjB*cpeQB*Z-v_!Y%x2D744_j(br76q*b;hP#3PL z8VwqR(AZUYj~Rtqw-lF1kA@oJ)F2mdwCsr2P7pm<E4w@eK(NfI>EIi#ud`swN1$P? zK#X_{CR*2JTPjd8EyjpvrSBw7wcQV(M6?_ebFuWnZrNiaDY}9f_!lt<eg`(RMgfq7 zl_J05V@RT{z^v^beu{sJ53yMRIxIz`l|A^c*9;*rFk2o()4of0l7>hJ1*Bri;1f1b z)00w_dkf2c(>z3i-3Wz3c$HldT9i?nQXI#P5rIMS5qUVy@vUWoxWcQ|$*nziA2+HO z(szD%v0%ukIzf0l&Acs^UvO1sMZW|ds?;<JpZbnWh%nM)xeOKv$MGEz*N#7~F=!!I z&K)d_N!4Q-G~l5&>PnO|=<f=xJ1p)QikZ>iw+rv|8niYj*$20PE2fcgxWne4Np$K` z^`kl`48^vChR0n~LwYqN8rPU#B!k7VW8h#E=|%BM?r)Wm6ijYnDV10Wc7f{1-{Ox| zBFGpaUR|05_H1xX6_svP0^^tMx}H)pj+RGIvaHZ`Xpgk!GQgsT&TY(vi2zzuB1rsG z5nQ6E1gprDN+Ae%GW0rVPtUPqj{?_qRwjY+w5i$^F|H-v4-5V*-U`&_8vwp^f*hoo zK(M9tC|{S=J7VbiuaTbeq&2riM;2I$xGhzXcOkGK@i?4HMJGtywQKt|6gN_pqCs@S zi1>=MIbpzBFrG3<;}-65OkL<H5a7~(uDTEgGuY)CsP>Vak|{3|p}%$mXb)=A?BXkF zt}WIX9D)$#0p6_+xz(aw&;=x5Gk=4s&9a52(iVn=EzHW16RQY{;GNtJL$Q-TIm!cp zTeAg#x=7(IDH<)`B~mO1EGmk|YU|8ce49!m*&;P$%Ct)wdRh_Q)|{k~mA=s-y2TGA zac_m=!l}GGijJEL@)ABFO+yULbO%ZS2JQ@<l^&uXwlj|=AaEByg)ZE%FsSlucld#M zml#XcBC0~dK>iN9D=tIXb*6)Miuav)=wt&3>Omc`g~Srgh4--M4y|?$mV#yl3bp#e zG}4MwJWeByq~=UAGY~xp#IE6Vntq+QOyq$HcB4>{Y=;Z<(3+5=IKDDxBRQBf+<{fJ zqispEj<hXi3?nW#A}J0X1F_&SyS5)5tr(;TCu!y}IhCvdCiXOAJ`tg)LPS%5)oD^U z_t+DZA*5XsMKrDiyml{)oa2KD6307{OX9dfFl{{|N98n^bj~*v3OY09!u<op<yG~Y z;5hQ=>=&!!T@*i2WecXXfYwtj0%UH%86O<QySET!Wp;*kh*#frD_C?4#J1@mz~z|L zglEVMbJ);Mlt3xmwWz3}U7W)1`6c?W5Kr;0Z;ZX67&RwQhlj8*P{}I6GOwnB$QFN2 zCrvqf9TP}G1|a4w1EguOj>I^z&`=!V&<_=;X`oRhmQx1P#z9`CThMJ~4p^u>wKOoX z_{LuHp)}o`YN-E3*+Eyv4>6Ob&dP>sLBT%~bKvu1Oz8?|g1@)_#oG{q75`Bch5)mW z544I)!vJdv}3TYHgeU^J?x|7!(82h1=@Ous`r;H^%07e<5v>^gsv+E5&i)-k_U zoF9S*AyKFstr4KjG&0C+`!@)0_ir5w=g#N}DM$Hq9x*FG24}u&<gJROxugzYnF5v9 zFsd?vXlzO-VLW_PyrN_*RqU%pm@1|vRAV7#<AtQc2-0WD&>AY8r^Oaky0J#X$O%qB zMx8R|<gzsJoi1)x;x9w06*}XMEf<_3Eq;LuwSuE_x89Ci=f8O5i!;ssMcHA{lotl* z6%lCZ4UK!M4q|EHDEf#^rSIF<KYEMER^+7Qd0odm5Xx8>NX-(DD82O-YNB$~-!X^T zSwvKdrT5fJqCa;rFe+kPqy{y(nanVDBpYPnX{4gtGWt*n?y3{CxhW0%FDlTNho;=K zvVuA^!DhsOQhfuQmSHtr4Q7LGRJfSLWbpCSfZke(3sY8oNZ+h&tA4sl47Tfn5Jl}l z(`LjcVnG{QD!EZ{*0EY`*~m?4w!DyuWm#rWi!eQd7Qz6R_!!H`IH6N^LWSxsyLmxC zL_>u#0TCDktEx9I&K9m%Tv$9N8jda;?fhE;Ph?$$Rl6BM1EMt`GRK9ye*e(oQEccF zmbt|@7%VQ_jvP(=^;{^yiiyAl2ZM;~Nc`jsS3^UV0|tiyx~)W{`#>@%q`=&^Enh@2 zgVl}5EUOqcojwpp1JRM%A<Um+Ffpx|=!i55BPUvdGTV#-!;5kY?pPEky6B&}p_VJe z3>e;Y;Gik3L%GNjo$jpRVZyNp>|mm%XkMYl{lCOzg*YJISqXyHo~mLN8HR$2>rx)i z<~bl5up!9`kQ``2f4V5#V-;3rK;b76E0G}Th!uDY2A(pf1ZmC!ORq!;!dqIb>pP%^ zI*Dds@6lUtJ+jm+$lc$%aH|zVk2&@H1ci9hU&MhVs)0mdB6-iD#ao4H$2;viymZWp zrcojGy@wW+fROhM4lmpm`$4H?Dnf~01jXUS+Xco9!EVz<(xPFbG&N+*;1aW~?V*U# zJu4OU;sg1hd&Ik~Ir2#sK}v4E%w4+iG`BeDG;pe?*=Bw;pv5v3YLqWH)j*UJ<-<7S zaW`@c$olRsk_oJk4LEw~Erzu_cU>~Nz6>^oN~UZ$cjL#R;jWU2-geDbVF&ISO%4K& z)r~|bMeWrrD`i15jW440D1%$@*|k$0)M-JCgpoibtz<VJ-Br6~#BlS%F+_G`Vd3!c zE{d!EOf+O{0dJ$Qt~xL+6oORR&>?J+rV~v>KPFGoH1|C05K7d`-a1gxwDm69Sz5f6 z=0!LP7ckW|VMJ&bSHb|~(hb&4MVeUz6n&K?BAY`o(%>(mLM8i1fgL)YM)rrz2(Xhe z&u%0q?5HCqS4t?Kx*j)}JB$Us5-9<svn4LWmg9bEmg?wkw_~%-#O%-l5RK2R1u8Vl zmX`t4@QY_2$_T~+0a=w}3=*Z+_7+p%-lLg1+eir#MO{|abUT$;s^_aA21KPzjIE|# ze^X`3#G3{zh7nvfe$4E7VBfr`-mV$^sY8nkgTZZbOoQ8Wxp0`=Tb2g5EG#Z6jQd#s zw#CJTTaGN=CYrvuq{Lf}>nbhcwnMr<ted(1t<A!39kopzS){J~+M$JoC73w8bo*d% zWT_9te@EV{e+10RUR*eI$Ka5_A38kfA6YtfSjHb3M1s?g93LE(LmUjgs7`<J=y6%X zEdtam?sZR%y~SJ+GnP*W6?czYj&q5*WFomvP?U9JOG3zOBFL^d>i8zdDz%B!c%^s~ zVn<zekuyy$K~`Fhd*~RVt+w{3nn*nPR50QkX~T}$+ynvubARMJcdHlqqc7h{+=RmO zC{Aru`NlHo0?Y;WTOAYRGid1g(_K>xSh`lYMS@X2bn3)l@W_wRX<AmDp}}x=8dWUK zg92lN16|l@8dSH0v$y~J_hNLlm%ve49LT6lx$Fe}yC=fS5a2fw;Pv~r%PlI-lW9u* zON)z3BJ<FALE}d`%B7`+g~g)-nbpFgY-#B@BuSv3)HzDZqU=$9$-MA%nD%0`&{OZ- zE+V!iJnkVS%`Gnc#|xrtiKtSgmKGO|4{nxm0s<@4H|Y6R04h6Fx@r$(<~3ROz*kEW zAkh)mYtISGyDY1i50;@znOk~$JUlYCBiNR{EwZ>?CB`1{L#-@fA6VkNf&Jmau~&jN z7ZTKN=#VU-op?+(=s&b_qW|TUQ~f)aAFw_jIeSMbt;)<y+gs@hG*Y1^6`wtOA5r%s zE03qq^vc?d+3pWc&)RD)d<okKegYWU<~R!PMoZ35e6+9sLMvU_$@2v+P31iMoS{6e zeS)qV-SJ{8_12d<)Sil2cy-`X;<VC_8$WF;!AGHn$l{&%GH7`AIZ0;E>Gn$kgy>zL zYEWC}!62p#<OB)xoeX|WelwE2S@9Xh*}qk`aNB~S!v9=WcBFr7fpNsm3%58`7W#*a zw+#BXFW_RM6jkWowy=1-f9z(A`&MVkgl;)5i(fc;{MMW0l4YR+BPV)zaBSgfjYMp8 z0uGJ8L5@JHJ*a}dj|$|i<dNPCKGk28IUoB&5usKDW;Kz+{r-aEj2+>9C@{hO)CF#= zSnu>N_}NM607=KDca3j6L}hSQhHRMJ#64tyATF70;`S0{2}141(pY+`gj*xM%os#k zcP>BH|K{0e`d?c)PV>I<p)<#U$N$cQpP-;VZ!qvL3we6wepT7uzvt`na=L2!pH#uT zRN{2|)R({8%<eWz&c@}-Y-H<cEZCU2QA>ELy&vNCb1}I8nOLu9s6yyq`Ky{;eWd;1 zzQIG^J$`yDa#a<+dJ1jft%g>P@E`*dwQH>1L-m>Q<m$rvZ@r7YH4DA`RcJZgKBQW) zR+AQ(=@8J?-u~0=Nr7cx_E%Mce`!4=%Fy~YS(0UI`Z~0DM1*2Y@|JW1j8TrtI7Q?U zT%I6(#$YI~+Fc=;lq^psrO-fztV?{VK&jX6AG(H2yUCl?CIn<&LvG@<L)fHw{~bd# zLXjhL2l^e#I&9Y~ICy9#gQ#xB#0Ay`VYq;_GQcNlMQ~cXpbm=MM+wwWx*2`PmpUU_ zW{gA!i>C0ySP`HiQ#`eOfJwGJ$b*tw$GEYS1jQ=cMXs*!mtKBh@ZFV{2hYAZ_|A%) z=0j)h7(BId_LbxPXI56ee|P^YFMoSw`P8c`FCOnJ|LaiO41VLmm9r}^93MQtvi$1V z`@eSPnU&LDIrGrq!IhP>FCPEe{^h4$JNx``mHQjm!-M_76YWd=H`{jY{z3osw%t1Z zosHvzH_i>7TKj1`{r0H+`CxFaZC}>Ca-X`lY1=m+pSJBQCv^43Q)|alxBt{C*#fJl z5gu4Z5B;~=JGi~(^!O)axz^yRkFNQyf3BU4-x#P+`@N?BR|ZdSoNwC~2Pt%Nvuz(7 z`1A4UgZ;NZIDY5W!=|zS)W*+b#Ba6J_GeO)1ZHFdwMI<)dJ5gw7sb=jn<#kjX8Td4 z48FY~LeD|HaGJ{Echo2sdJ0v4TV-#S*Rz2iyG8vtE>`x2H83_hx^PHVeM2sZ59EYx z&9tz&qf4`ecJN6G39H9ahiEryJ+h!<H!rH$C1_YUCIdNi1+L!)ez;leEy?s0{%Za! zmHPc#G*=}n!@OsMj}l$nvTz87gcN!(A6ig(;@&*bfU_cur-|EWW!|w?S)HAQpA}Sj z!NSUwpHO#J9_3R~OdfCAh5V(k;N!VUY*OY(^f*3PfQUv)^q?DB1hWW#C0T<fm;dOs z@2uSU+G9_y+;eK>p0B-j{K=KC-*s~Ejk907`v>1Y{?N+z?|*gW$wyZ1SN=mQ_gGE8 z@!%8pJiqeQr&nHj<jl(br_P>z=^LlcK00{t8+Si{_A95_mA$85J9|=?{zgooKiGcv zwf3o#+iS;H+Luo}I*=zFoPSrAzIJNVzV=f4wUze1)9wAI+u_4&?+wnh-#+okbAz|H zkDqD3b3$cbYrl1JYwh^+?eNsvF9cRD{plBNDqHU|om=WX`rP3BXmI-acI%X&th7&l zW%O?UERat&{m-0kFFgECd%p_3JrWsrfB7yIx%(@3-PwHq&ZfQR+xkt_Q^F#mK6q3Z zpLl5Wwj$uCUqWJ^Jl%dx;(`a25acg!%ZK*|O8B_A8l0Y(pVve<;zqLaDEJ-sTsJRx z_WUn?kuU;VmTz4=dW#*bY)i$9EmO7HvW)1qn-_?Yn!#setEzx$AH|X4L~o_2LI}D7 z;_5|NzioGkXl8I|e=%mYgIg67U!xJ5KttOh4c6pup+VkRIBn0@(-I7wutUvE&^7K? zUYV5=R*_=IX_M;WtNK*B8OGkRb5E~W6rO+H^=t*vSsk?1;RxM9akq{Dz-37$P@biN zeY9i5GAV9~2xQ8-1=9?PL7Kt8@xa-~&)mQKjg@=8d-l8EKYRZ}uO0v14^YncUK|W$ z=yKcr=Uy1xxpMz^SICFCPxS|nz4+?NV?S6qF?i<e{ijyG)mM=6Xn*ka7hgU5*s1+1 zPY<3}N$CGi@ok#@Iww<;&D_5x2QA+{Io^L;hCREZ|IWLEd)tRDwI8gv51nrBh`m2J z=zsJ4rO|PGybQb4E!lvbd-V~2ZM~~->-kjcKY4CdRsOo}1bgkh<BA~qAG8<O+ph`b z^RwfFN7{!5PXhO;cI)&&(aiAlpnu`L?~I#g-#gzS5rH3w*tg!z-2bbOP6yY^uq6@| zQ6sval5f4Mj#(Giz*MnoQJZlrgB5kQQkMMlF~unhe@TXdMIXTtCS-`Wj2X**@wN^> z?hvuq*JSY9a+@ON=0(PH9_4A0iblZPJOf0c==f%g_Lv3-hi**pAuASsH6(@N3M6KO z-%TU1BL;uklFG<E_m3_vs?!_XvZ%&kbG}OEjAik%8kvD%Iv4+#SB4)M9cyk<sWJ@N zy3Nsbl!gd;e&$?Z97SB$xtL=KHxX4?)y6L8EI1*fhymN^sk)_X+6~h_^b?;M-0|AV zi-T8JUOxWvE2kbg^+#Cm_pvYqAN^BjWxdA-&%Q9Yd-?wFk$;CMQjqb|+3$S&tgQFm z{<AXpvyb)r56LaRwDRn?R~|dH@9blPZ?D`BnvY7kGQ~&Q(;M#+GoRG{-h;n(dU_nI zCCq*Mox#cGp|#<2FFbqK>51)*8gI4V|Kl;nOQ8+9Kx`zwyy^eu;Ka&3h+^>eOu80V zK$4rM*5r=U*T+d-l98Q%X8`Qy?rH{ql|o-{zjm(ufk5{kdA~iY*$aL4U!1L<dHaLr z$z6E*o5HE^86@`!S=0Y@IMHniofL4jKeCl@4V;~xg{k(zZqU5X%93X0Z(fkp{^l`_ z(_~keu_IYRR_qRI#APa`J$y_qQTe*m48APaQ)WV=3TgoOX~h7yX(G%6KillbnE|G< zbfbwk3{&@mLpNfA_SCmap-Tkoj-zj+fbI7PK{@{17XB$ljYdq9p|s$DSzts<j8h48 zILr|8j}PgFZt99~jP8+SgPBY&j~7yj@do1(D)L}*Oc6WrbXhkKlr{o_GU%s@{xMjC zCkE*$)0n6)H_gig^@PdT+y37K)AK7&3{I~+HF#p>!NJ{kJoMTfPpmxBKRNiO{OilF z96uHNzKgJf{QFOTNpN0W{?hYjpM3u83s0R@*s=0hfAG-CqXVaY^VHvxy?^`c{VFNw zr`sn_Jll-!_>ns9wJr7cr~3*!+ONIRzAf9eH$K@Y?D%^B<Xzm$u|Cm$eX#Yx;H~lT zC)>yI<f<z(W!Oiy$lvqC_xSp_ie9>J@a1L4G0I9U8TcJI{~x!ny)G;(0&?=srvG1@ zZoi{|_wKC^j-MMJfBb>L*1LnpAL#4zWYa$Qopvld4-G^k4M8#V!{2P)w%9<1=wRi6 z6DDSB@H)T=vinN7R;<C)4}|VXu@Xff=uf*QBRS1&5jM+eZQ!!)L)^>6Fw*|7;}Eq3 z#UvPWZ!)WeBQj!)mN^s3&lZ382w?^jXNwfac;(hv*NV$06qd0%?)XzcA(ps(Vd;pV zeG%{rM~-TSZBd?l?@>(-Ys&7oG=e<5xNtayS^ffV3GWSvNe`P0llI+@Q7|iqei^Z4 z@?8ZJX^HLp#D*V#bx-nS-khc)%OsXaaLrsT^=Sis%3mDUhGQd7S3u&<DvNcZX|qgm z{3nl|ePHnD$^(PJvu9UUPRL95pF6wq>hb>bD`(H#Kadso@zN{z4U~NL#6xEv7rv)f zR=#`o%!xBA%ilkHA70v4oYaS}mQ~A3W7nR0`>peG62EBMu>#Py+jeyP<fI*~za8Hy zFD=`7yJ<iDAXX~3dgoSq?lld!+H+iyn7T1y#@sJI;rRtk>s@#0IPr>Vsm7{GUu%EO zKyCG+4E|?L`%w)=<wa*2DpE*b-)P$TuMggA+TVG+-~V8E{NCpE0XQaKgQP+K%OlY$ z16IA4pAZY-;>NdAW}p$~nqVte2_F|%gOk&Cd;Mo7+{INT4*~-ME1NC+=8_&2QKp^` zklD%%j~-c+3Ccq&@zBC;8e-mdXz5U~z$2P))5Mrn`RjtgMD9_Uw5$~izV%3;$QCbS zR+=d_EgagWalnFj9nHlFv<vy!rhiQ)i*daId8k>q%phgyTDkD#u_A_BW(&PT7^mv0 zw{g>wjm4kRIQI#<UIZ8QmtggAH5lwGy^A#n9k?ZkNMZCguTt1{H{UeVM66;E3*6A% zWUA#d()6l(_dDb)rVxFoB>)Y&@Y8|8uV(I4FAkBH-FY|3cimHGSmeGnd+O}vFEOUP z>#o7wcl8JNb}nDd=gvL-yYK3r-7a&wZm}mGKo;}&J|KDSKN*zFYW=n#oHTyRV4#V; zdr!!B_PK(B6AwTRi<8&&?^S3Hd3<Q4gGBnJdr$OF-Z>!3k}g$Z`<z%iAtY+zGI9o^ z?TKsT?E7~ru|ME5%Zk4#=m0d#uLvoi!QwOnP|Ar1^q{WN1ec<N6TOpCj}p~&Dw#TB z&Q6E|-LIIgbvNBVCQI!fld<Iyn<~(cF!QXs$8N{tflyKZF<rZ?f`?<WQaab_=G?Q& zih_^+)=N6N7x>%#i><-!#K?(XFIOVqkBR+{+|EF=zHYyrH0H>xR2i8aBXKUU6$S99 z;7(k?0!HkGRL{=gNC}@azt441wrBQ=_2zj6o&hsv2vb}F5*(=5>EaZ7B`X<*VXdr9 z<H$3a3Rw*Ah-N}e)^jDD2fuAPJe~x;@8Bv+*GQ2$L|#gwIt0u9b(ckb+<a{ZR%WT- zA`Xvy1zCO;C&2pmKO<)H;GR1dFEpqmmeG5%Y4?vGgq#3>Q4zL_*C!6>tF3?tQurZW zW$60$oP6eZA=G>e+CD>5Zl%41brF~#r5}s-<!^4e{n+BdZHy|C#OOk79=_%FzSdtC zj_*9KCK`DOxu&*!orIFu{Td}sNfKA#GGedRT+ClJFbZ{<E)<|}<aw*YUy%t)@QSCI zHnWiE$2clI@J=8qwZnJeUEemO*e$k)PsQA-E$@C56Il5#k1XUSzvnTTO0Yfd3%wOn z#8xm_Yc_2E(8MMvnlm}AdbETrdKK%BCD*A9<@qO9#sEdCtLF}joLmK~af=|iawxtm zZ?m2?3Z|8)2Shpulg`uJ-P0M$r-e~q4-8_rWqfe*(MN5aE-?3i<XUeThNdC2w$77` zMK(oxcv}N`;L%6XhYU`d38tR&5T6p#r1C7L+QA>r7O)$1lxhEr#ndy;7C!2ypD;ZC zV;B%!90ul?868Us=x~d^!*@jNX*N~mryo0ykLmYDreAeZEi<PbDijd;#X%W3M8c)r z1u13Nl7KHxL=ZgVRQu&PnmThJc~h%v+raCbo~cuP`m>^ZsO#1~G4M!g$Izj&dp1VE ztE)`+4ad!gcB|MmMQq0Pk;lVy0c}PPKc37}N;+3fLL(-B@QHKv(@3JO7XvDW7#W3Y znx-;$KO`p0h-alaU{4V2a#SqhDGzHEe5yhRQ^&6{wC<O0l_rwo8&XZ+?J}+ASXk`A z?V%g=#v0?M0D<Lbw*0muhi@s9<{9IPh^q#-A3bvT@KKeB9iqJG!+p9dl8K4HR#~V* z1(6lWWeKtHX6>gAB7>}$Se%RdEDIfYYEmTImIM<cLY97}MBlua?kDDnRO0$O`wDmY z<e}6OJE#(h&?<aj7)*Wu+9|#J!8as~RUS?CA$g<(haLr*xMtD}GUFPR07ZTYm6^yw z19B49?gjT%N6=Kj+9=Yu6dB|p`+Xrep0_Sz2$(oSG`oCd-Is|>iw2yah1ROW*g$;r zAi)Fc<>duWiGY;iK-?e%q55CtCMj(lg<)LigytIGiE>pzMe7<c?VvpQK@o|E9<l}` zrVcqZ7BtndINW)+TZ6%&JL32HH0n_0yfaH!#u(#RbzdK`Oe2jGP0*9kFp#=Orp!W! zif@h1oGhHh@~aScsZ6An#smrV2jN_sOlcKCszU4+nGoY59X4*D$(L3mRw6;*b?zUS zSee}iP;hza0%4sxG3=z<U?DTfCbamS9aTgkVTNm}T4DM|fHq$G#5|T`R#Jx2HBtG< zJ2I~#P3IOdm#6^#Nw9%qAu*+RP}Dr$85P>P5DiMkI-y;)d%_wgqFeYaiz~`iM2x^N zV&(B)S}F*TgJrPKIjV}l#UGhvh*FiY^AlTPE{y;sVy|gwrL!pXh%~YZ%_A_E1tU!P z@dirp!hj<5Orw-UrNd_sFb+(`>cFZc7tRH&ia?=BieeWvHsaxkw4vIdg&IQQY#}U< zds<AY*3-M_Lv-c|m59k?N1i6Xwr!AFdltdA^`>Gx#%V>d%b44}aK%!~ILQ*XoZ8x= zBNuCIB(PP8r8UG6LNiYXTZMKrBH1R6tm<!ecl9pSOUB362&wuk$)W~d0He8oYKIJq zWrt~QEl(!Pu$uUAREOHD!S6y2wYa8Yn*cz)YB~CB1;J(#efzThl$_miYH%m$D7A(G zu>mEHcHyid<^dc;?v^#in}!=K0Sk#ID-T9OcrCzXbed=ByPivrW$tLuA$FnXLw!MP zk2X=q5{At%rOZ-dc(h8-dXyU{RD0|c4wV&A#K#@~7^m&V+K>N<@Cu`q2SitRivx}O zaa=3iS=8_as#q_COK8wneymg>2yce6P;cX<OQe;6Iz4h1@Bk2xLIw=gIZ{<M3o+8d zoiqg?TM-3}iI~x}=N7_2JXFE1Zw%+)N<R?3?0w1)1h959rZSL<tD)~iPvHaN6EHzp zN|`R*LOCh>pqVzY(@_8n#5lk%ey!QiQ{7j{4qPg^3BX$xUU1;G3lKg<Ocm4hlySj) zlkO%yKyT1e9QFw3m6GP5gnI~e#`GT*Qy~6V5BL~~lJj4N8x@T-rmFTO{5mX^s&#;q zW?MtG;+(o)ZVE_NEYWDS%xaaER~0HyB12FKEHbk3(bdv-f*XZlTh$};9l573NVIDX z1%ie_<HJHA#6X~eu^$;+PY2BWR+;!Rg-KMII6`Eg=2i6*X~R_YKg@dBwL_jqd}YW6 z7_1-L_gp~6-k=We^sm+QX>XBnzKyc8xg9yjv1KIaR#n=rzp(zi`F&ZH{C2E~SPHzJ z2sWeoAb<&tv;qvEhFW$h(g<ZB6r1&JY<&X%7A}+*#|`cn1Wc9ySKnsF&xuMVrpyjv zcTwv;u}8dS@j4;YR$YGXVzgBCjwjBCjw<5pn<I>)czd)k%};JYt~>wx0zZb7ilnTo z2)IZ><<nwgen_gYUDBx=$)!Xw1Ze|Nr|n|_yMEe>yxeC&O&3cR{>wZUltLO+X#qtK zxPrn#uEdNs!Aeq4;yf#h#7kCVnowF+?bdtBv~RU+Ri*fQET@|2h#=3<L<s?A9om)V ziSwasg6z14Jo2sbwY!$MYe>Pb&AYkW+NR@-?V-$^@ug9-f|l+OkI-$ck~I=B+6^M{ zA7x;HFe1F@1##20Az(KT6mw&kDy-)QGXaVV=7%oDQ~;srP9X0Hmza*?jvbN=;(CQ> zN|)newC!DMJEh+)ZoY^<jn`Slof+WN9xE<#XGkA6VVR5Y?s31$7^Fdg;}+A+-n7LU zxHM|ar+Sn$gWcl>NxZ9q6_)<Zt_IsGl-AaRCm|WR7sD&PPNaeW(57eH%$em2oVW|R zFVnBgSbiDfQ9n^)jR$Mf_*2v%+ZD@=ll0L=AyDLJY-;cu=a}Z1iR@x}5g*wQP-Ilp z({`b-?Z!wexu8@PiDoA_MCH+sr44aqkes;VdRHnY71C8hmR`gWg`|Vewt4;$U=dpU zjTKB?{TI`vF*0*tAH?t(^OfRJkNt>eNT65$5rj3096}M_yCLqZo9DMnG{#9L)l4>h zW2R3MLBe>*%b+xonlZ)`)$LUZ5$TdeMA;_>pcX{2j8uveOY6*fPo7`hk+Xla>8iV) zTtNWcnoZ=gsjqz|T|ygoQ>+Co6=-erc~p#068;c&lqpe32*MJEAjk52VImJ2MZ#oT zw?Jlawj-gP`9Gwc-=PYXYQa!O*SamUJLFhn6u>eN2UpuwsYo165NrSe{JhhtmS{zI zXreL8xD<fdFO+_oF3eRU_HL+#_pDmw`4*GIhl=MD8b=|Ar!66+bX~=bbQ8>_a@qL` zgn0phtMY?=qY#uh({9CIB|>2^?CkO+-s&h!KswJHxkZ5d3JO{1<yMkw<X>gRH)>6I zT(|>7dJ^~Wv?a;R5jJKU$0iH@@KFXi-ive6bPgB?gZV(SiO&Y}=f+gWf^iI3qvOXo zByGkaV7!#dv0p%Fa=Kb7<TS8)GT3^uHdTtl&9*B79qYzHWgIJZQBab{p>7;<Rt|sT z95&7#+n1x-c0htT=e&`&b1YfwL*k$=2gKz#IUf=iRBNGzS`%?JHvQ$yvPMGasDe{y z0{sNp<Pf#O=(g%|1Y8l<2esa;oK~kQIZcg|)kZ4ldYr|U)9jQMQ5rRnIN}Xiq(Z*I zJuK4p`EI5+N7PX^X*wFu*Y)_e-ujyEIn>U_*EK#04^XhPQ;jR$ALyNP-=Jt(kAtg6 z%%LNWo`bGgIWf-q*Wr5r<Q-;;XlF5`9H=+kFb$~=7~b`ixoUbv*;tt`5fhi_LjO9l zufs7^2KF)38!lmhw4&ivU6Qm8+8wLtguEw~K|PoSQh16aAq+l0d^g*;5h19&Uok}` z#PUJ|Quu}5Am2F%uuz5m0n6EgK^!DVB1U9YZEY+Mds`QWd$xwdt#@_#li^ICYkEI8 zY_{Il_qyJ1>OC6H>r74VR`tFx{6L>my)WuL)VmqBTR+n`>A+am5s!RQ>n>eQhjYWN z^SXFjZ?Z;uPs)3fV#D`_9N5Z%q<pvK9MNWL4@ZQOd`Zb$`rh<OtenM~(_F_nMm5Kl zj<<6tDW{Nf*y)5rT2(ejl=^^H-)|~!SPy^Y99N+2<BM}ha}esbYH_%%{=0Knx3@V` zmcwIPL-&cM99qh$rX+1wYPNGQZ2*#gt>O5DRewO94$D<NuBdPPTRQnP=coFt)oBiH zofLV9gYp`wLe5sz$;qUV!AYw1<XFVG*TizvtdCIzQKW)=ILNjfyE;{VyM0xF<P(YU zhCqWcRTTo{PD-v01~zp$uNCUA281vKl1?@j@En#)Jzzv+unm@+85;qT639_YEW*dd z2Hdu2hBtk!ZC}%2u>?38SLg6vcxCJTS0Dg%F^C-S8!>Jv6*U5d61{CShwM_8?~i>L zaODMRFco;<dJ^@7h4F5K;t=5gw2Z?d3`Y<#NQ6iZ1~o0FO0_m%H%wMNc$f@YgQyKO z>#GPwY)7&e^<7P16fkgwhQV1C=mUYbbPFgQ$1NSnwslRR?J$BGn(a9(vfaJ{GL1}- zirGLP!Zf*@w2V-!85J0D#&4xgh}=}BNklgiX;qC|sS+9!xzqY=c`_vcThbs~FJz8K zSB~F(Vtq7v_h}z{&cW{-!#>IJ<~pVPTytXY!xw$b`Tp^n_l@2>p;NOt#+(z>d0*{= z+<joWu4YahDu)y0_b53hp8HJo94=2~aB%0-&<%i-;Q<Qp9Hl<V`SL@Kr*BH>RtK-A z4Ckl&{CTLT6mgurk75T#Grkd?fX=I2>DY8*2VXhC9*{8JDvJ}}a}IqabLvy*bE<vL zvaiI?MjtJZD-w$-!hxjeXkQS+SffJ8(oy3&+ny}F8Xs=Ib9_8U-Xj}0Xe~?#+j3P9 zcQAprtt_1g9-gZZ5PVeAv$P^(i$O(!JRDtPnVSHvB5(kV4e>JPm>ZF)8&{NMC!;Ig zeR6FqbKy92l`guGCdMXMr=^e2op|S+`}Ol5+16-$?!l4%!_i0xLgoH~zghz6s37^h z@hakh2$Cj6Bdw$s#m);Glt!+tML71|hN+SeT_S>LMu-IDI-4Cr4cQoVq&mVI6@yIq zKn9!0bm6KbsEMp}0R32C(GW6?Nw~O)#<n2uGFKPMn0__!Sewpw7Y-;27Qw<mQb%b` zEKi1xSb%}uSmJGLKV|{c%PS0Bb6+SoNUVfZ>o3MFAhT*YZ4od6Y62IzPK8Z1KnfaY zqoKg>UMN;An{ZUy6jL8zj;P6egs5ta&FE9_KCw9-y(i=O;ge6iusMGJ#j{U*>%C{5 z_`&w*?2}KPSHTM^B$=H%u{QeVW22W(ocPA3P3X&`^+!&ekmZRk(CQzS0vZnDaMEtX zqw=5{(ZNA&6Uk32h)N`FUVuyUiYjYW+E@__22QdS&_g#CLdqAv1MehMmZ>}&T}9D? zMtFc1JG3d1P@PV#+bb=;v@1J0U=52Zds5#7xCjE^5y$1e%3Wm|TeG_HCuulvfq6$$ z#m`1m(8e1=Xa}frQ{S6L9;pDRv<;P_WwmOsov9lh?Gu$mN*gLsTNMTZ1k4S1ad-%< z7~gc-PX6@ty(eCH@uly4d-B$k?{7W(!bG?0-+AJv?>@Ql(<ipxdvd#(&OP?hboz<6 zPrU!eiRC{&@!saCC#L7WJURd6>Dd$88>88@H{m_iyO}nVJyTsalc8Ym<#IAs#s|~A zTu!!?+H$Q|<BIKMGTl#}{+nDWZ(?9QeP3Sk$emZtOb~z~+Vu(I@pKPms4^@?ps1b9 zD=|o@xYp%O3s6-Np#eKG!XU_JPiUISJ^+Keos5EKI=zY%{`uHcMOfbvfvT(GTo~V< z`pOO?@OGilwx(+90lIAn=3_jaS#aPD*x3{jayQgFqUl%$Z&(-_RoD(Sk<ZqYs$(IY zA_D#WMSZ^a#OrUrz4G+rr5{Wt((=#0HJO}w_5Wt?&7&==?mNGG@2im+N|xNREDy3B zTW%+@+UoS`IK5W7ovhfMtd*XUtoFI}N>hY27=dJ)dkYO!NHVf8n39Bq1=cKhB|xY^ z5+L4FK`|9j3<XtC15`mx)cnRfo^y7-pWkoqb6?Te(dw0~{F8Uzx#yg{fBQG@-=5Ch zXV{yX-!}Q=W0UiO7~HO`JU>)Uta^5M-^2Ov;6(S(9r>Xj43AFy_>gIKXgWnX!Pp4H zZj@~(DMDT!<|z{eFJirn4nZ=^7Wq=qiuNsHW)acXq<bV7nWqD4sTj#l>A=i*bM%GM zwHognKM0E9%4jyxa$lsZDYML%V^IuLrHmXiDH%(EPl836!3z_Se>mwyPT{Ug2BIaC z;4p45K>aWV0H6Y)O0GN3SE>ql^dO3jQYAfEXa>n0k(?}kV(B7Z>EvMniK&-Rh~7M^ ze9~u;mqp0`ppZZ0`N;?Jt<M(4@u}YNEqU?$b9rxS;faTjA3HuQiah_}!+DVxhbHE9 zeb3e+KV-gf_>MfEerRG>UKH}^LTu_72wp!ek_Ku@=V<6yrh>wt{CFieg&J5GQ?mZ+ z%2z?1`Z_HK+KVWq$j7{JUYu_kWLb7DEVY<#;=o2jz{C8k2mmC4mbyO|G@$kWQv3~y zC8RkwV$^Q<iu&R594n?T`vh1f*)N1xE}`;4Ns`V!C1oNi&Txr%vbbpap@`<R<Nb;R zZ_p;Qkikch_YMD95rP!-i&$hkLuS$f)sfHlNCkML<kY7Zv9F*U|AMTE6S$G3bXV#K zC{bldE%N0Q<O9J~b_t-B_Pf5Wku4e%ldC#FN^nlth4$;B_%F($ERIbsl*RD}iv5$F z;)#cg<68=OUfG}OygWH0mlDY4&3Vx{JTX@m7d}5RU)=ZO;_w~(pY9ev+$#4{lQ&jE zx@ZV`pah-Dx^OE|6zwRAB~UBpi%|BJM!BJvlNRlkqy=RMoh77(qbec{J-Y|S$jH>n z6#CNW84ZJgy0j)Zt{^Or=1R)dZ7F)tTnbW$l;8OciCjtXMxGMJT^Z#8BgLgiFCj4F z2BuxcQOP888D+*U2((DvvRDQlJC<-39q!;caZizDmIrU5RtkcX6$BDpLDow|?HEKz z5`nT`EcY@{5MBEq4UD?gTw68iJSY`>*l|8eds^3pI>&E4KG`eF6I+UM`{d*U-SYUB zvV6gurF?#JQXQAF_Uf>duXKy@f`=z2?wBu++`<3$iH#G}k7+a5n%+8pi@uMS^)j5) z#Wo#X9jA1hD39v<v|ZK0mNMvShmON#Ly``3b)-CIsk3E$IN+<_QEI=e4>VU$&wG!S zGX_iQ*ELz-xR2{RS*|O;qcb_j%02qNTYcwRSSahEJaYl!XTRg6-R0<w*1QtC<R#p^ zrCINXF6>3mdRsH^$>#OWJ>K2CW1!bN`~4sR2YVkiZ-wT~+`->%%}b$E$#TbqpylA- z&%ARQL`Kmei=E4X(nsm`PHRr~3T;o$b?dK?E_W=8h<M9%A)36A+sZ<TB!7)IB+@Iz zc{R1Y`P$w_y>rLVUT}@PFwXnOtr)Kc4?E9_e1f#FOuZnSw^yT!__lK3^ycmOK5csk zw_(Zc&DZ|^ZhMEe@eO(2uFh+?cZhg!tm(z&kTvc+0o-8VrQQgUizwIr5^r$X%e}#6 zOc}Ib9J{@fT~w=Ai~H-?&oLbteaV$x&^;7o-e9gH5{obUE=&%&@y;;{q9xRh0fFWf z?7Y6c*s(I9#B%Nrq{MQt5p^#-J9c)>lSrxU{Mr5W|2xRNVXQp;)Q^V~V;d(nZah6v z+gR$D(UI#IPBa3)Skm^AOE-M^J6lea(?KN;?b@9`99ACMy(<ra@6+KZsk`!<!gcn- z?-xUTxNR`8R7fW#HWotF)xjC`9lH)2dlM^yez|O)d_(>Id?rkXWqWSA_SzeNuzx;` zUEONUiVmj`_%=FRBswpJMm}XYrz2kIKx0-CCEmk^@(Ya(x979^&9`z}p<Qp?CHyxy zeoi6W&~DEee%;O`{QE+^d;(466Ctu6Ha4WGVxkn8hU9}-5A{tTR~T%lbsOC;ptPTs zbNc=GidWjL);G4?WE8(5+{eP$gRR#7m%~ckLAceP>xZ$2TJ3#9^awkN{(jLvJu|WF zg)onOL~)@n+Dr8<dbyYwPAokT?s+BL3zy=>7+BI}-vVt5dP1v4vtewq)%tE3>I)}b zXjr(v-P%7F>I3O~r7Hk##K!}zmhrJnsSE1hd_9^JR<^k%mu&2Y@SvPSY?KmRCrp}8 zEIk<RJrwRmC3$7r4PC7iY*->QZys^e4@>v`O{?8{tdPL%)|`Imx$inD>ajf3kAJId ztz5S)+_%2fy6XDFgRtW68*iNcwr&m=VcDxUwbr$6)GzfT+b}-}XGP!;Uj4fzZ2-FA z!V}+Wwc0`?6}M*ZY_+aEp<kyy_jl{st<P;M!ipc?cw@&>b^Y}Eb*+2vzv+54WA%O4 zm95%iPmScxe>j}@Mf5M7PfR?be&5lJ6F->I^m%`yP92>zGTfifh2fToiNhgG|7gNB z(UU>6VJn-qcI(|Q3^&xjsrA*_P<x?l)xUHsH&<wjoPO!L+|BS%yJ*$hx^HZ2DQ9K- zuJCCorrmme5NaC+ttD*{*fwaLvo(a|K&FAu0MvRRY-_dhR&A?HDFni>>`nvxRMA?x zPWAQbwsN<XhHE(q_p4mqTDn&zZHabm^65(QrTMKA8Ml-4`NVIZ2wQsL&WRJ@=&{h- zsMGP#|DIHGDD+<r#q9^f+^f=sJm6rs$7;W7;D)@Lcjb!Lo8a}q=gZdbw!hm6;Y7RL zI&kVrybM9+l+bD&IC*8ey%0|6^6Mv$KOw)rz16<|)xjWK_!XsXe5BoKe?6Sm<wM1T zW$Ww{W?QrHoV-BLt^1GkDZcEX{2>9K7>2iU`;8OFgiW=))w*%BzD|U2`;+rwTf6-w z>Eed6^%f<!l{}+DQ~f7&y*C^epjd3T7M`heQqOPo(D<f}6L*zi>ulJwu{+#2G3e{` zJx=lksbJzrxVM*oZ{snm5>>6hAJ9nH(D(u>nF)>JTT=V4?hC4=-wWaHmIx!&T$pOL zH^zj?cI#S=hsSi@*9)qf?T13xQ?{1$RO+i`IPYt%);)`K(GM$?u`dV**<)l6!;;BX z8#GiMkrI}@MR-#_CpoVv%?hHYyuCruNP0QXu7$|hXzv|qVM%_MJcEipn5gZ^!*3w{ z#))2UV^2!x_1r5a<rydeU6@zgt4K-6*R~Og3WE*xZ%75F!}6E@3g?}j%v)zm<;btQ zFxkf~#q&J_i(z|v;k>W3+Px6w*Q!Q~uY1I!{MRI(lK?8^k_&}YrR*`XU2*pg!YT<g zZ-NTo)th8$MFp2rUTD$+uW0lY*qBt!R1K;xmV7LKcw*zi#2dO{>(o!?!eb}Gp#yUI z6XBpv#l|-s3iCVVTdExU!jQV4e-G9ko5#8qnj2rZN1~q$HF<IU84>!0>#x23+N)$S zaWNaF<bPlC1X=J*`6cMWTE$GchaB)c)Zm3I9*pE~wUkZlH~9_AuS+azawHt>(ls~g zaLZd0*xExln3Vh*kbkOdExrD4#Mb_i<?F=(MSjJDV&bevv@6iW#8ctKT|H6iZv3H6 z^)40Qpn_!BHgVfb2))S(HBb5{7}7kN;rHo*pc7&F)$P_@GSqkaVTH@BmTC}|+>O^_ zH8qN6^p=diPc1;HoQ)FtE(zyRqY_#*!zzoi$H-Q3(74g1Gqdj9?e;SvtVQTI%au~{ zl(bDmGNZTK-+jEQ?v1j0zx9qLHumN1#YE$WwEndpD!v^IKl;J#lD7VXAC|Fy(3gL! zrE~u-H!RilkGj_E{l;@sn(aI!$9?`)(V6NL^G_)VeFcMfLO%EO35}^*XW!Ke$B)Q? zWiri~|FS^t$UABszaI{%<O^oG1IXhxGna3-?iF@<jrs~$_LX7yox?guTmnW`g4zS^ z*0w^;|5Zb;FleT|2f{19aUV5eZ+NwAFP-Y-VsK=4jZcr?qdKqpu1<&5d-Z#kY@}|} zE$Eq3VB<cow^88VaPx7^E2y=r-=hXbt#U6+4pqTlFpA=RQgv&&C@SGjL9Dn_o3QG( zJ*k%NEB)4+PKO{vwy%;@cc7`ZyRPJ|Z7W(!CY9S>+WMSW{=Ql}K+D#7cbTOHxk1q_ zJk)PpbWKY6LQDP~)R7Rev7@3tXw_aw67Ew^cyRRoBPN=<b3eFyK{lN?dGZZoKYVpy z-MQM<ywzxL?5ll#VZGw^GVMyM;JTpp`}y@2PY$RKJWWHoxeQCxzaV<y+_%aa>yD}i z^E5KH)C8}jpcn6j+MSB#_k>_Yw{?YMZP9w${bZ{_gogI0{k96;uNo?mV%c`<l`^c5 z-LBf}Y}8*^uLk}=66>X~q8yyu^}r_8*cr^F_I&R|eWR?jTzdxnaOcTENxyh$|KzJL zAL%R5&YYUo!){|UC#UW1<h<tQ8r_pxPFW^T>=jB6jhT}(uaY{ayy=rObHLB%GhzAs zNo|L8@?>9q%U3&60Iof+evW|psY`WTI2P{mj_&sGFtz=fTW?aR{l-JF+C=~bhgksX z-<QGa*DSmy`=zIz%E?~Ve`)g%ZvEl@EsIM3=Z>h<S!M{x;Jl`Tkt##ELSxjL#<h%E z8Id!>O#?&*&I}hd^5zrg9dsE-+%}31pi@FmNI8cc7Z|ja0akYd8-vG@GDGpgfUW4x z6+l>#VuyyXK2CMgHI<BG^S(;;#fy!zjm$Zz808HgQyt|_4VRfsuvF50Bu+`60<ozD zW#@Ju$KzIJAn3fBqsUcqx$}?g#@bG4%lI|1z&Nim=rihqp>jnNIeqB8)5RF>JP)=a zZ{SW7Bhfa@!??Z$hd$4ZvQR_?v0j{g0dSzh#e-CuF(J+8UyN8ensd;-&ki7iV;t`2 zVSCXnnGuRqm@u-rB<Lo)x?3a%>d@KW$)MN=#@A`IP}^y#JAS6r9j^=PsXI@FWvA{v z5p;a-ObW479%}p4y;wJ;y1T#qeAwT9;dKFb=3&{s*1eCeZM`z!YH!%z+WYrFmT%bC z-dEn$+Ec0<eeL1$rS_ikrPiK#&Dp)8V^{eTeKWI{+l-&49(A`@-?KWH<$JdLn!Zoy z7?eNK_qK9U-@AY=l^>Opmv4Bfy=~{(_UZdtcOAU4b$XvDiq<27JzPGe?>QY?%Iiuf z@7D3-@@9SSEpOHLkrAeyMe&yMMYR!E?JI6*cZ$ue=U;5^E?#Wyj`O@ssCI24HBIp5 zX$sk9ZabQKUFvhQJ}1j$w5GYWXprW7)1<CXFt1=zmrtA_XJQ@HJ}(@~G4g!UdPI@g zV5WF|^4BNZ)7*SHnj0ruhy~X78Drf*X~<Nv(~Yy)X#(7*%x%8CW<`MN7UxhZ@>yt7 zxzH59iR<t%;5=JNkfn*~u1}FiHX^l7QbEV3riI(4?x6uLX15_XZ;Fmn{aQjP&o{1} zcK`$hVAP>*;K%3RVIfGTzDAH##r!-g6U>k|(5$XZ5P)r(UP;xegi2Z6Xzb9+bn)iB zt(`2@Y-lg!o7=nP7dZ#(HzHz7H1WK|7Ifk|k=Acu>;jf|D9)FiwXmR)xvfaC&?Y5t zuk{u!6|n@w+7F0_`AW)>2d%&w9+$pU76i>A;o>DN>D6FM7OrAh5%48L-Lr<r5*3Wu z(wR}!s)`X&BCCW(O4_tVE2HS(TEdNmwH_*1ma=?}3uajjvyak;&Z$<2t+-H0qdFk! zY?sB)3D~KcOeUmKSYrhFQqP43N-)%%ZQ&3+EQ^H%27qg2RfW?_**B!nG&rHJbwZ<# zYEZd|kyo;I>K3(SRM=+Wu%<P*B&-X8r92HhP>ze0j#k(p6Sdkm+DUedYwL<I!^bF^ zA1EOPww<hMzhQ4{msSw-O|74vx~_e6Z+rJ}Z)>;s)3P=z-mFXW!~(1QzSbX~2VvP! zIY6a_^SD%>9tzP~IC#2NmKE`y;I(RLE99(_Q#N0`o({VBK!h?t>?t*#Dq!^;EF8Z4 z?oS^0y1Y7e$~lV#b^q6$Eywe8hE|D(_P7S??C_Kh@W_uOo1uq6RRA!!tUVq-h>Q1n z2;l4rxe{ejU&QBunqe#e!kMV7_y7ZPSC>xM8RsDzXTEy0q0)z*iim8YWPhTAXB4{C zV>xI_3)xXx@<?%oOWLkPPEGHyAtM*VdjD1ptac9fwqKBqcbyp4a*oqFjt!6Ld#Gce z<Cfvq^gTZmnw~EHRyyenOI<ypBiC_M$G+h!`re`ArD132p{%xZZcv|}Jv7j>MLLe_ z=;+9G3<l5W`@TVAI2aau502`7LC14C4h?>&Z{UyVC<Zs{n^I*w4|JX%OzL~*Kp3rI zUb2%1(0E*nC&T8_lY928m_JXJo=fz{xOiHT=iqqui}M_hg{|`E$M_!jb7VU4=$IZ* zBaLsK1oX$+D8_SJJS*07f?V=A*D`+;O$Ep{CRC}Fp=Ss=%_toXc;a&L<D2t_Dn1A% zin%{@sOKH}_H3jvCPsK#&mM>r9e+mIA2#;K@ANGup;0{wsWLN4vqu;m$QiBmAqh*a z9%QoT)J$53EKEXjy7si8lmLC<LR`c!w4eYLPXq!7ukm3!%6cZci#FkTSbg{slIqFB z)BOT`UPQRgHW=UreY139XRoi7+J3F4$K-U@gXI059>DGC(=U2UxakdbrDUbrApv_0 zUF&gGWpd|Nloo9(t!(K)mmqa8wdn%TGkU!`h(d3bp{($d*z4(8KEddLeZ#QCkip<G zGR1*<M7`xIW57_9`{<4<J>=&QU{GY}pTn&mI_YWlzJ5d?j^sT$f@s0rN)>m3m3S66 z`tUEUIm-g#O3dgZgDj$H)Rpq4SO`R1Mug6o_yu2IOd;B^U+;;NF_QG-5X%%iL_|_a zE*7Hc$$hYqAf>@G`O6Gh(s0>3KT?FM9Vk)tRM#k7T7gh-0rZr*nV3Y`P)ObGOPvor z9izg*G<7x*NfHpO@H>6$_X-gm>C&2&=9HL^))3nuL=1Ph9sI69zhtmqH1Kl}e$Nnp z=|VEUbm2!QezxCi_%9FaH!Ak41b%3wpK0jYezd?(BJ4*&mK1+f0RsKXVa{;bZzOcr z(OvpIlIZhe3oi^0{JKIZDi?n>;y<0>Cluh<4=nhV3Ew?K6MrzlPak4Y%ivcTA_ZP# zTd>R_Khr4fS1r<)utC^=5aK`a;MXmQ71_jCgLlidvmt<E7ZpD2M<ULSV|1)W-F}?} z0~F~9yZ>4w{dfnC%ie*C^F$ly^kXKM+<)MMf?VbL1xb`ZG_4t2x#PgW1Nzrjd9XMT z4weUMI?l0_gZk#bJg@>FOUnfX1jiUD<-vxsaur=>cmNNEYH*+-fS|iz;G9+DfB=+n zpcBu9fs9eOu#EEHQr+m^P#a%Mm8pL)pKn(cKL-!w2bUOlUqo^p#eo8r^bJ|(7SfWb zDhjF#6Aq)L0tb!j;=pnvrrT1q>jzA>{J@w}MZPAy@T#nEV2MF;g``eunW6K-Xhi?Y zaV^1rM7YGViUR}VwG`g+;J^@qIw}BS#ep%96bH@{B1e}<LDXzx$*vwq!Qa6JD`4dH zg(z48TfqgG#R<@Ma#aNggADr`Vbmx9?uWW`W8xi=8RNkDxL}k7eane{qkG6p2}&KJ ztk?%DOM8S%{cy(b`X6efsPSyUKvAPi4RAFO(7=UpqEgFZpy8(F>P90|4GHYaGZ|;b zadg3mQr8_Da_V`eGf>-&9+FaaO(@TfSSlJd{nU<!$TYeT%80hGTSl-8$`tNg33?Js z`DL-vIElPauxD5;!Bh31r%577f$f*ep{kG4?a?(c1@d9aP@W+VA{0e+Ou+Y}M*KSA zMpLd)@ywOs11r1^4IQ$<v(w@m`HJ#fUD=I)X=>Olf&5H}82fGv6+*YYhy&_itRw^J zOeE&WYj!{H%%LwZ6z&B(bMU*g;P)vP<|L$4nBilO{h8uW%E%PlCB1n%l6KR4&`L)v z3^FrP!lxc))se2tas@y}hP1wO!({?NVR&W{RjS9|gu*A6Koz<6e3K33c)BSMbE6ck zzR5yoMS6aMBb)ueJ<vMd;}t@vAnOxS#<W!!(}$_dYl5>tp~_@D$|#{wqHAYhcW!le zE8zVhNjNri5aYSVSckyi`c1XZIZob+lb^vooF}Q>`LKR;A3bYGadQ)sK$mXpQH@4N z*eNOvhs{;S>Kaa$CWpp$if8JsyELw=JP!L9S4i)EPr6XJ1!36KL{W|bd=Y3+kts-L z?%m2Bm~@M|`A0>NqGXI(NhUEH>i|M5s)`XWDvwIQ&*I#d;gUP)4Bi;RsuQf>h%PD` zilM_rja3J(+;MPIw=3A9n;^B~jTbR(^dmt>yUI0a0_rl|sb*Lq*P}_ty-dj$Cg%16 zLmL6DK&m|WhesQ|#8KCIidyE(1tBsKz_@x0Hj0V3?m@lenn-Sv8Bbgz6r4pF&oN}_ zE1Db&=>tAeV#M)!P?a2snW~0X4~5t{C~OMUl@c{Wjl(^lkC(X;y>NVhxRl^%2cbQ7 z+9WmHcsnq%{)oH<7%NuQfwFQFYswJT(R$t2qr95L@`s!89elv!fis`G!+A_4Dny<w z*HoeeT*ggi&t`ia1Ph$@%w_`B6*d4o)djCiRIF}HC1QC?0;K&{YIc0iN~#>i;?@p5 zc{R6?NAW1GnUQ<^$)bk1iHS}py1Zx-^b&(8B+BISn6D6JJs=}>^e~J2)OrI!i`c-s z$#tz!xFWGMmgl_SppG~`U>>6!D$(+a*~-w!{Zk+|ky1lv!4?bygZ47qBdQi;MAxg( zDAb$EqIM0CX2YD{G~wz%a3=QQR<_nPwxkY%kSF^gfSYqh8n>mzNvH0-^l2VV4wV!* zQI|8QQZ*Wdn<TMT2i*EPRh1k(*i8Q^7N-^!iBU=Lz8IwVr@fRZRR91Y34t{>ZZ1rU zY642J#v6U835N^lnPyq6$L+N6M>m7=LTt}HWLlh1D+6tg${oajs}r?xSV%KwQLy_R z>P(@IEVSY_HQR&EHE#?NM9>$MsCo$LI+iiefSs%)%D3tSTTY*IY`&dP`i>0^^1FTD z0k6cbMrQB06T5R-PsBSNG$+IbuR-n$u1%LF;)N0E&iO@p=d7<YT5!#=gk-|mw*i6N zyH)ZCQV`TuodAWzNNpgpR@!m9<St3_8;fi(Yo!E_gFypeZ;UHz&sRNjs0b%9&PBCo z%8&zBiv82*1(>X{@WPR5sm~f1kvs6hT-O-Jq%xHpUNZ;CWdCLxzm{KCiK(NY0$#HV zt7nm;#X)iCNX=DJqliSkMfLiONCc-e3f`|Z<ys#%(ndHBPwqeicK{R>8w(sVRZMT? zsv0F_2@b3J;dNU#lFZcR?wG2G9MAKr&W9NtKeS)dSfNpmpO9*OFL8i<F(H)fw?o3@ z9)(fOx#tCdB+}uG%6ZdgdZOQ96;*{z>*y6fwOYjGOpHXjjJ0QRg+(*?;BZlY1rGt( zv=+y&`mxT!)FVZ)XX<d7|8&>U$>*SB?GoHBeR}eQ%D`h1h$_<mX*s!UtCmIeakCp@ zg;r=fg^_hVI=fz>O;k4_=@|oT2J}kH?NF)oP~ENY6bEvXc?1EEse)`A0+3Y4L6IT` zY<o=eMo&W*!TOgeLWmF<##6I68yypCd9L%BM5r2pjsqG3Zx?h~bK$U{k1mW)?@Pfe zE`{KpskRB^c2H-<hi<GEI(yCp*GjaO9&nm3SdL9UxLiqEpF}$001qB@X7m)2gpu-y zgfp5uykQ4?<PS`C%dL|;%IT?N$0xl7IZvR)@cu`Na@Q1*A!*$D6xeg+@Y!Rh9-e$z zU>^Ia!^sA*A8Mq`@HSy#Y?|m^MUf!s#s($;%rn*$hyDdw@7Qw2V{+@O>C*l!2|sYv zrOqh9v7h2q8S4{Bg#aDJ0PebQPv?4CM`}K-#pXEyvrVyxEBw^Sfh_&nuF#_+;se&L zqpCAN*kfppt1J}dPT-cXT8A7XkH*jzGD$XrkE}^?oAf|A=tmGhDLM88VT?SdY7vJd zYO@FRh;!6uqw1w;5M8>Nqo2g5W{UD(6;Dqc%YQogQ1RkqPad*s@`34McI)Ki)^7Ra z<kSPb-BW||h5IKbPa=PD`u-P-)0<x`PjA`%%;W>7;PT1IL!;4LG*?wIO$r!KF&K`$ zXXIVpK`D2HQT~mD0+n4TCG|WI6j$+>iY+Y6%0{~2=G<5o7D1xJs<Yi<D;JyUVw!WO z0x-s|*a8?QmJ~;=f*6W45?r9`_+OpO9hA(dcz`du7=`M7s?<I(_4;c{5VBOOe8^52 z^JBQ>dU3>XtD!ZBy9!(!9FjhTKOAFBx-&>t^G%$`{m+#jM?TgChKm0uhp*xwRA8Uy zag3el${2tYM^g=5-(HjlCU;LyO-=S6e^kGDpPJk<`CM`Q(Sy%TZdXe*xnt0uE>BKA za`>5(D*eXd_~i4Y{0zv=Tc#%Eq$j5y9KwaSAg)Z~26ed1v5j&0s#YFuXhEEHV~rbk zFQh*ymQ%OuOr>d<Y(4=^MN#zb;nggvdvh@C<Wa?g0>;P}H{n%#DKrUT49Z>)JtUAx z$u!3*YWDaQ0>UpNt7%hj6*jCX0jr9Z9-#~v7si>bbL32Sgv6(1h%eSa`Q%aZPJ+C+ znvM;elU5-Y2NhMG3pw-uG#Bpei)n+3#_WMwU@?F#ygnMm<VG@%azRrR7G!L&`qtU0 zC-yz?+~kp|7t0fqTly!a9umX?r@_>tRF1KuQ(KM?$~PUKO75ZdY0KoPa(41jM~T!n z`ZwgR&{5U)m>~c<SjGTf7U{XAAuu6TSeJmnzJ~=Ox5p8TZ7SqMP)96_8K|0)1ftXw zd-bx;K5C+8Xuiay`w@hd<b6j^(zVARP<v#7geg5W=GCCey+CBeA+km(De8gY3|j#g zJF;RmV#Mdj(0`;dnq0SZa>-t#p4=FVo&Zzk%z{F82oJnFpi(CC0u480MwHNj!^YMr zxossvtax~jRN}KJ5^OZqEz4E+Pj23RbZYbDX@!hk@|=ehEXv7uJXG}MIglGZJ~<Ve zCb~B#rxaKwUnt7QCXbXaOubsMBxXz>Hccafl0xRt1(x@R4ZX`aYLbm%fyjQCJ$5y? zp_gFTI!W#*xYE5+cv)tW@c`zS(x8ERIv#qS5={Ot%ea})g_891Myt`@c}Gqqco#wH zqaZzHuZM9a=#46w5GJf7r3n(O=o3w`&WMb6X`-KiSZS$=jpGLDfVG&YAX*Y;=Dc@j z%)k#;6sS*nR*a~O`>l5#)6f!39Ox=irwULRN4-X}&mw_;F*d3j>Rea~SvaFx2enFx zfRpQf)UY1!676zupj%G8X;>bg+NtBA;*rUdxKRJ64;X=R$@I3#2UT<x@n`?!^J<=U z7UhGJv*n5XUDp$Y&S-idlv)?~caf;;7@6kNa65w@Yn@>q3wnq_%-GU;i_srNFq990 z$^+f_Q58{p$m@}1<P#%Z847V}He~38l_;qMSW3OB*vTZXTMhk9kEY^kB>}^Eb7ay9 z9bJVyD#k@-Y*U3QSmA(JtTkvS9p31=L!`j!&Jn@U7+w2B7US}9tZ}v=B6jA?queLl z8E6~58h~UpMzfB;g9syzitU6XwOe`l8wV#Rr_1{%pDgIJnCEPr+P8gj^K5@=^FfVT z%G1x!?3vt(Bdj_(x%rtX>)A{mcz$YgQNFPCRJBM^HLLC=t`bciin5r3F^`t9ljfBJ zL!m3st7<tc@H)H}kjTHU9eb&i13VHbyjhXd*pTMcJo$~OEIIC?72nZV4t0m(Y*0ea zPsThn<H{(>?!-wV>zhK}9l(dVZhLE8m4hRi0F+_Kl4^&wtJP>vs0B4@qf8{z3RL08 zPVUiG)WtQ?2%WLXGHof+#HODsm9+R}w5_7ZfvE}Zv&1lKD@27TOu7XcDEgEP47d-g zh&5pK9ZLGmVs2{lpnO^*X|-L?t95#$I5;)A^<j<2pP8IGEV?Hrr>3@?66~t{k;$oN z&BxR$o;+P>)P4-UJL1pyi2+(>QflnP>#VW}K=4GdbX(v%&YgOd&=yWg;&4m&B#d91 zz+Cn)1-Rq91Qo&;dDJ@>W?C(aAUYdE8W1TX{hRttIccUK7BZ^NUe!Dp)2LI3u)i4$ zCh#(dxDas=rn@S1FsZ;lz_H&?h)AVK#H+zTY}1cDbjjf|dmz!CSdPVYhQ88pvFbp( z$tg$kO$>nzo+I#P%-z+oPFrgTz;Myhhl+`_xD;Z=Wi=A@;ori{Qmq{uuZd5^C;h%c zu~5%^yj2guk(=wOJ0)8|YmL;&*`){aT(b1w36KW1$o@c}=QElSAAnZF5pP@3maLJY zfLEEy=in~JDkPyg$6N556-o2@X*_$wkKKKwkQ_8V4B-Y&A<13S!_jD_Fg-Iu6-_}5 zVH`Ei0uRdM@fgo=6kT5<wLH@b*(vx`d?N-@FY0-i`e@NoyYBH@RH`NhIdDEa!{qi@ zV6?0|gF9NK@}*edyNOZIdi7P1hBLnPMJj;w&|r%Zn-j5Wn?eeT&@`EX5WrM*uPdoz zWxi7$o7^EJ5)+WBOT_X9(lYvkXc^aPsn)5r)@2j{7-uO?N@5{Kl{O)17@Wg6rtl>^ zQ>}c)@T-7Nx_RuU1;!K58yzaIiO3P#NV*c-N=Shw={Z+Mpqx9mJAwB-Qcd;2612Ur z?U4mDV!TMxB(8lg0$A4?R)dOcNB*e@W?vJ^xpk`(Q;-Bs7Ckow*Y3wi5xeD(OJccj z(eOZ6V`7e_o7jniY-*}VRiV<NBYG1ybA_cCIOggKok51!$Olt{M+O|8ns*ICe3*K6 zx*qvlnz!&kaiKA0s(?oN_j;A)`2>TcD1d_q?w*|nCGg`t0q27_qJLWi(iyyQ&?N%Z zM3Zw(OrX!_mP(U3)jSuPPyQaK4h<o!rqJPba*f3bpgiTnt$unf?$HN#a0;NG-9$_< zJKfkOqDt2Q)YF<PDog`?SMmtPe*!2P#8GrWBf>u^iAtiI7C4+gG)pORz1cy-62lM} zYlfnd*9}<Bm??I|wKf&7Hs&0;ix<{O7v}w@VJf*TGLWr2M1m$2Ett1h3Gox7rbQL6 zUdbg~lgNk;U9<2G6!@x^V$}LOE!P>!Hmp@7@uJMRgAg~UT7R2^g;y{jicVbBG$2K@ zYJWVJF*GK$28`Z<sxq@|Npre&JHWSfUmaT<2gT<mFazeWDQOT#9uW&u&U;+PS4{-B z1U`}`ixw?sy4Jj-lGYh4#CTJS8lxtBtPh&h-$Fvl`yd6yASuG~Q3kF|0jj<S4YEyo zEJ>j9&{5ktdKA)edU1lJqks<UF&6$M<j7xG$3rl;s(a{p0NB5AqAT|xlF+TS+bZE) zz+&a7P7t|4=+zywc>ggW2nsHY3}qw;@ufWmRfNMl8QDw$3>Gk#Sr1#AQDOs@w1N<B zdO%}4>4C!spw@PKd*(5I)C;BaUn{GpNyJLx9Kli-GI@s^ZR8k0o1i$4{~DMivyJ$d zB80GJfl<j~(i=(V&8>v8)FrI&Sj#Y%?Cefp*}~&71MOOyp&$Ckz~hEv$wYY4*O|}d zRJ{gUur?q8A|&wwyAmOY6!G~NcZ@jPO93f9lZ3N-aKPdS+&wd#xomFBL29GGEzrt( zaP6h31ansN#D&#u<gjOTbXy5k4QwbU)?;aB4pqU4Ta+@1GpA$IfS|RfN$5B6EC6!I z`j$=^4|5f5gFsn^y5sG!@q^Y}2_87A*)@1TonA3eD<&o-I)ZSfM*$$K88Lm^m(pEj zaA7dUnO8J-8t-{nBj&rH3NB&ura=>A(t-03f41&oVp}p|1%V?pNPO|t&{#_a;2kEh z<tp|Ju()S0!jd}fqlTA4w$N(4TbYsfU=->$f!m!H(xjAeI>dFMVoIZ3=Xdhjc3o#z zW30;*ptd6g)e1hmKV0=bJj}b##V#4)z{ZIvJYfVc)Vy<yP1BUJU{WukU{O<GqkquH zR?J5&5(8B9;ZvaXbr~h5SYX|GaHy!eC#H6Ny1a}RKpop>k84$9?QW09nenVI(AYUM zt9@5yhchc?XZXy_>N?CW%rtb()-JW#GF~rH-i+?b*}hUKRm?2)GUd!lU2v@rdG%R= zl?En6N+_*Bo$`gSl9;e)?^vbevty8#b%ogA!fbEm9Kpd9e9efn{>&KHC4`|>%$(&H z213!AVLLmP5D0|A><TU{5un0p6eisWBhWpik)F>ibIc|NQiFMz2<HMB7--~#8#ISB zl;<7^%b6uk*5nfi=n;Qt-*8i!m@Xo)q@iAvKQwe<b}9VN7}j3m!7=nu$*c+$vz>?% zs#vLXotEemhI7m$G+;7j^N3225H&EF&IyZ2YbqK$z^*${XsF;EngNN)iHv5I*{Bca z*(?}sV+2bpYj{LDvJ9iZF9H;kFcY;}I^@8#vD^@eZZ~;>n+kOoo`jTki4aBvg(I81 zS07Uaw>_h>s2pZ+$O4P$16WA)LZscUvT>r06)|%v=r$6Z>o3~fI0Cd|SDuPM-5CjF zmBx4}#JDR7?*v6|=H$+=qS$zu>=5}Wy{=Jtgn*js3~>$Q2ni`?0p=g^14+o3R$wo8 z(M$tk&2DFB=aoaXAm8m0yAZG0g2q!{yD`l_1pE41+q{12Yw=qA`cF2;`G<ITeGETa z>g!A4Jp8|gVLsFbC&Q9ckAzc?+<oR2J&|%JjO|$0nmZMi>}i#IT7NIlo~POZTDtG5 za{pE3J+F&uAv6YUZOFCi@QwGekzLRxZ{O&LeV;4!|C%CE8!FOm&#K72_V=dmZ1tXQ z9qw-UdJvWWv`93Uigebh$VL0smD;Cs_G{XjZC|TLk*i+AeKe(&fUkX5X^*|u+zr~I z%}Rv7PZW__Qp~hZXc}VGzSaTlNtkcdW_Mrvl1jkb>k1=kOSL6p>x*h0RZ5%3Y7f2J zv}fR)ilBwpl!^v88OFqh_Nb`$yLY^<UQd>dJ?n~FG=W<SKhg1Q`KZ1hkK2^jwEsiU zt7+A#u`SZor3rVI-?lr=kwvX(yQ9tlr9G@ZL@jL9@ze6Ua*xjH{@B(?U{^mzn_0i8 z@69@1)tf_o19r~jad3UO+TQ3at!k<_!N0mm8eXb%z=lTYU{fI<Gb_uJ8Izn=GMy;W zyx*_Ri~3rrAe}gVs^yc3bYAHU*<&dRqU@MYAB0qfagn}17|ISkKIteN8qZj!q2l!d zOe_HhYRGXoTJO2Re|iGnA(2Gy*(hPf;Yk55y{;hc!4KL~mZiR~5mIl_C$bn;S#hLD zPqa8=`ZgwE#5OS^nZtQS$iyc-JC?Q#E!p0|Gx0|X%Y8%vjz}_2b;nJnkfWmL8$+S6 zh?G|-*rbQ?U?RE|;9OT$r5Zcg(MEgF=%Wk0zl0rUl&!sKe4`@Guj@{U`bsJB1ss;{ z+v2DQ@8sa0ZEviwP-;0SFFNsE8AgFzy{0D8vweG<I5ebU6=Bbu^ezkAJV*tkIHhVI z7$}sv_7SQ|#eI3$ONS$E`{Ud9fK_wni8)=5UWbC5ww2LPdl7-f<Z=2g1RED=R~FIM z7)kj8a5mx&NTmB#J-#)My_Q69ywF1?R!Q642fX&06MM@D8KxJ1gNko1<Zlx(W+~=- zKdHN~YYux)i_!O8nvi~xO!l@GV_%d2gK1YCTOJ`y+-4~4fW+oZZcnss`z1lg9YK0I zJF3G@uvoqBM59E9hn~HMq|a7K+zFG(<l@C`lC%#{43DR6j~k7)Y@Zw3QYUSo!<qel z#IyF|VTT|#!Wpn1kbT%C$6ifDS?wjnOP+?hj63rzu#b-Iq*D%;dkJoBe;?l&$hJ80 z7f5x}Za)6<tTOLayYS2jEqe&XosZyQ!FLyu)THMA4kg{hU6e%DIn`b}+TunBxBjXk zc0fuSFOlXOCiUZMn0$Mtw0{sA2gR+7<UMFX#Ljo=5nUhqceu2-P*NZFer+!S)0(b$ zCE<t;+0|bkrgs)00ssB<0wWN2dG}Vz^Ot*3R<HIUku05~_)eeQikzm=i#>osdkL`( z(PKIe57!NE(0MSN)i*m0P3q_<6{t-*4zue}^o%F8F%TOKozihc@3I`z_CmuGmdJiX z>_zmVj-d{A9AZ}?y&FW|b1{Y7R|b?|52BZKJf#DO?K&P9P?DXArga?F@sbY5;w&_F zutQGV^~ZO<nb9se_Lex?7%06EPaBVDiyQ+i`WM(<IOL~YaSCmP<1dJ_*TQKN9kv@v zuaWa>(EH9iX_Fn_?P$PD57}EsyZ$Vs?RcQe`{{aY(gQpj_)wmGh<xuN-}1*_LziA- z829d>tntd0KiVNB2_!Ng))qBv+@pVXJ@T^3$_<bNAyr<r9TGU81}4V_MkurIk-b$> zyt_1M2PV@DjIwD`VXxG5W%-swdD_7VLJ03)><H!3N$g^9mZw`me{CQMc8eTv&;Ci; zkVoIcq({AN&|c~XR#YZA)5|a8jhn}9JFGI1JedL}beM-P+u^&{Xj7HAO^<KcleWO| zy>#R=?0RFn;ncJbj<m<U_E^!kW`wj!PTHzRH%o2z8|_|W`wJ<-HVX0$cG8AN!e<Ce zor?adxDAey(iO?0t&1FkWy<VnA0zh6F-D5sidaw^x2PaH6`ki?fYC_n?VxPt<Kl@$ z(%E3A@0$u~f+}uv<hvsI-afVm5M;E?iwYpBVKHgJtDR(^%x*!-@Ew+no;I$b99ul~ z7wt2oB9Jx(vOg4Lw5yNdK4ae^HeB)@p$t7c8i6emW*?#RRLIbocnFg=WKss33t>Yz z#<pHsTJkbVbpf?cmD9#*T%%rX)NcDNvF#K4E>WEAleo6sj(kTY-}p$Vw7Ze<09jyA zD`nU+%Jt1IOcodGJ8WMaduwu6TMAWg_+}rSxGfJ`>9ENUud?pjMmy{qBuVTg%mA|Q z5u5DTUOgnR*G|bB%6a{A+E&Q7-C={Ep}kt2Twdes`2BU&<cd+zv3ICjdD2GjN}sbk z+p~yWfuL4upCM_&_cWSOLdwv-UnExVsV+zFsg`C`j%|&~xSLW$X)>hTw8xQ)?To%g zFU|s4F0^k{RK$0?`@5%IUk*7Osl`a8yhPFkvOS;D3(G0!yGZ#9(0vCa;}-@8yz3e< z`AD19+tytT>_t@w1LycgZQk%Ldfuk)xURddd!$?I40PPp{fWN2I!@_0qMYlxovt@v z^_`t^q0w2;chMPJ(8X{ebUHeUg<7Y-FxFXEu**`ng_6sKa|EPBj+i$9!~76nKH6Vc zz=MUQ^9GSSl5*iJFKCJVg=G$GaE7mRxWR%(mPTLb=5-0((ok|87M2+FysqaBiSP(w zsZvER38Py}P{}dUi-mee5(Xh|*ln$oFO(_;k47XHLgUK#>z%<gBqS>!@K6eCSD0$^ zD5+Q&c4l=~UzjJezR>B3nA8CYvTI7<Y>5Q`#lrIWh|}?bD>pl!<FHUia4t}I5T4-1 zDHfKAJ$ObV&_sXm2G!+$0i(u_pp{N0&}Yr-ihHG?6+2-mI27?pEtV4dX8Bw(U$bL4 zKQ=c%KX-C|DX01Qa&DPUTn`0N&Np;f%;iAM&GnT{!QOm6zXX`MIo+Mo(Kq1Q+`!TG z=0hyMf^uM<>nbgPZ*F0JiBX`iw(*~<&kJi1R&Hw|RugbZa+Pc3$sEitGjv`=FS<|~ zg=;D>^gL0>=T{ng&^3<rej@PYf&%@(N>NhS>_bjNz%bF(0j=J=xHnEKPI6NSq|S2! zo~?qY3*CU;3%joRCUQAnpPMIpUI(D!+`zf#8aX&qw2aEt2GmhwAmu<(Q;Qi*_~Inc zU`~@KbB)=#+2Nd~Vs-FJfmxjgb7Qk}bGju-bJ_q2SOo3fK}k0-y()K3YcLU*0(~7r z0T1Vv2)iSqP*=x5>2ooC)~FXsSq7NWwNby&YUN-~46U-l${{m-6^37U1rM!x9r@e} z%Ll5QUFpCSl6jN_S&9Kl5m@QWEvt&CuxN9eyF{*)p1_K^`mCvml9F~-cCQIiYa@op zwZ}KQ6W0{tm@{a*gyaxB16`n+o<Q|>Ccw)|6PmwQ)`E^BbH+AoTFtBPv?=wDrrUkF zqqGGR7BBit`TO*{FCGOgATZf)OBKxj$2Eij7l4*COyc`wegyK{stgM=teDtxmFD(+ z)y-FsSg!G93>L;%c#~dyj=#&g0jq5~k?89ZzG9%|82i8gD=I9Ouz+U&x?8;dvuH&J z+G%l5cxSZ2!P*e(A%@W<Qi>K4d^yjTWqjd6@YU*`Bn4SqMf3%gD50^0W{bFd(X&;O zK_$N}(NP}i&OK*1Kqw?b(P7alPt-L_S<50wwGx6NNBW_pt&+tgA;XYqk!7^JCgyBC z6GCts7oJ!KbuZD&1ZL{fGsSc<vut{X&x~G=r+YcX^l}oEGA-jxOM}W70gVA$Og98U z_7ZM|MK8Zos;Ete>7}W3IjvPoK=lo<%KGIB3fX@-ttBI6ikZQ59g?-_?#xPKz!;N- zb(RQ1?pH(bz=Qm0TFXbyFW3spF>c-fDgGlNI}7tgRf1tR80XuNmN3spq-OHSIx<cR zD|{kn>14{8vnynx0_Ww7By&>JL$Q;}<TK}k!cfP2P^nUw0#T*Q28vY`Ttv@lU;yYD z28Ao1S)Q_8`!$nWYh*@A%oj7mO7|q{gBfbmE9{ytEy6{RA?RFRs3YA7UY4QQ7}T`j zZA8H}BNj$>%pEeg4VM5AhZJ%?$!fLOozd$BYk#D(#4Mkt>Zdx!TCUYW_kG3HxUy_D zGWdEmwTUWa3!A>wt%nFm)Q82=w2JAghXlG}Mho)>1CYom@amwZ!bx21g=nNtYT}b% zHds_^Q*aHbrWG@*D%|3OYYrL2XsR#^__oXqUR8DD6)sr(<S_wTM(sI_FTuO+VptG@ z7#LvL9}t+4VtsvH_~MFbjIoJxU&Ln(7&X}<Dx@K7Pfnl=m?eP-!;=Oct_kiIZ&IYR z)qaY4E1*2Z4-<n{z*`UH#@KE)G}~EVj&>BF%7H>6nqjp_ZcP_2VdWjJ{vH<H@D3Z^ z(ZV}q?ZXRAN+kr|5UXo@ovPkTlirKMJ7sw74KF+G=?FVI!dUQn6n*T?Csv-<#E@&R ziH$Ff9leh>y+p=d4MU;o)i8xF{r#%`k{WmcKXl_uSa|75<Z=aNxsgo5<u8SSu!|Yd z^Y)eDj$e$h4sV4PrKki53`JCigZP_v5IEo2iK>aOy|wqlcp2C<YTUYh?E+=TH{~J) z8u285MeYSggEA7qzU>7vB&eY2TqN!Fx)e1fTP8-Zx9(U;-Y~@5Z+Wv$<ZU22yk#c0 z*Zg2&UiD*CK%g9ZJ#U1GZ@nGZTZ$}qu)}o=aIy%m=<(O^;v;^?>xb;6!hm6<juuHr zud_M!|KCLoyjBx6{r$6l`G^0@|N5?veT?f`z40F#s~i8i@t(%-H~z=Q`}MiB@xI2t z)cu;q|Dn6TYh2&>X5;?G<BhG2?Tx1!&osU#h(A%z|IqkDeg5~xzg5ZiHa^_QYUkCT ztKVI_rtzDNWsToy{I`v_*Sn2>)VQMYj@n<={zL6N|1>_Eu3mHg{o3l<n%ZTxPuH%g zudMaz7uFl~S}o`SkzwtL+V0w)*M7D3*4i(nQjLFGdt?0kQtj=v->SX8_J@r(H7>6o zseQ2a;rg-0rS)eUAFuUmCu{fBw$}F6o~<3Jy<D5EpIy_kZT-!)>H3QLTWWK)6SXb1 z!}YP+&9&`~Uu*n)g*9P+?fF-0zoF0X*4|;qJ8JI~Uw=^h<N8A51NHs2e_p$?@#~F` zG#a(HH-5SPbbVvvH>9n9+<1TD`~Utdo&9p-4UKm+&TIUFbot-t>KBFcosG9Q-rV?~ z8-FQXzo&6y<Icv98(SLpHXdnQ+xXqa9|-QhtQXS!KW+S0eXj8<jo)hgt3?)BZWj6N z$|6_Q{(a))AGFAL?b6znvdD_seEp(&op+N+XT#c)wHIoCA<2J9Hc6HpS>%^xk+;__ zuKiJEkv~lqX*3%jlgIs^jX!OCu<?n;yBg~npKE+ZI{IRx-MCUYA8!1yt}bo-GkyPW zKa)j%%`EZ`S%l9&sr}R1+hmdd`2V0q-q*;a_s=&zB(C4vXf?jvxD1bPd|bSKv~iPa z$)?83jmH{08V@)2H6Cc(-S|}FuO!iDRpJuK+0yr?8rL*F@fwT#e&e_69jhb1t2*-U zDoy@FbtGA2Nv&UBCBGfYpO0G|c|o=3S7edbt0TXx8nW0T9~#vW`ONP%{zc;*;$)dT z?EJ>t8vniY{?5k#q&oaB<VSCBoZa}Z8t2sejW^b3ekP0jYVFr$lYgQQ_IRf(LLGTM zi@fzeua4wdtyyNF8M4xjdS<svvS!n-l#pj*x`|++X&|-c&{Om5>}Hmce`XQTE>T*R z<w5{*Qev^JS!4}m`gd;hYt2E$OHDavfffY%^bLUs@o`dlRv1S^E3{M@$|;+*3_^u4 zHUwJQRgu-3g6?O_V)4?5yV#-G74TVBJRu2QK#3+9RGmy|BJ>=Q(KFnoSYK|1Elmn4 zqU_E<a2+{yxD44!P?G>>aDoz|W>FF{aJIyxCK6=|(3?bqs6^AVVKLIutZ0-%e4Y`| zSEMyi`cl7zX3xM-d@1^FAJ<Lp47yfIWlNjFxTv%-fMNUY2Vg-5rm@7os~GPQpnOV5 zdZHU5-<T^=4l2LON*k{U6W%9MiGhkjVU!J#u7ayO>dfF{l4;j;)-wU$2oJ{N=!+y= z6K<Cqb#a>G6TsMibawp8-5Qok7Z@{^ZkIDs0B{L0B@9Er)i1Wt=rB5>#1a{OjMFkX zsugi>&c#sQREMHtm9sJtuW<lZNf!{OE?|pvAZ5=~;<XRl?mXsL_+m|jQtdY~#+P_S zh}rBM=afXH;k200D>v1P3{^%rg8@gYDz<_Q(>!?a8|3edU=th8SZS_56qwMX=2X@d zN-eLde0P-Jbzkg=L^9}5GU0hya{*C>r!Z#V2OfdML3J{}K_w=nF$~jP!Nhu3W<$wZ zHqW)fD)0X(h>ih1A})OxM8~Y0^KB|An+Aw8x$=Ufb@}t`A}a(#75b<}l?^IVn&ird zP?2uLSyF>LbCLZV7!sE1Lh7i32n-cb2OeC#h#<T+cs-6`)9B|04q>XXN2q142l*x5 z1&1+Gqe9nl-{lhub8btIE(b<8jC-siqcJUx@t=_;L7f=OlOskEi&4D7D{&%Bn`%to zZCgl5upOGtG8Ag5=3W3@mp@)OKZyzF5mQqaV+3~vCtpJ;)Ng&<%bgGNt5St5I;&lC zV?-!|u>6Tq6m*Tr1N~ze7UxZO7_Vk67O}*ofgv}S@Dm+UkWqSaK@T(*#n4P>zQHLP zO`~j*r<f6aEK`L~k=GhjDHKYy=;+aXHddUjKv63)So2|`2(7!VS6JmHgx0>B$Vpo@ z+N;QspYrBP!)VN+<*K<wvvz|iq~HSOrf}-oh;Hu6v4#Vr#1wge;qrh5BC^Sq|E7xQ z&W51q%X<?P!^<(W=q(Dw6ox@pQ(mdYye9M3^L!(cB(wr(F}92nAyl=|T*lnRT?ja0 z^H2vqVBH5{FntOx1(y_zy|GL3Aq2;wPM2xHJqM3UT`w6BoCb{}A(D0f5Edq22bPg2 zYN3~cI1p+-^--qxP3VNA+95XaFXQ%HK>-M;u3`@p^)48ns2HwNY3T!}vp|j4$IB#k zSAbXu6%k^@rLKvxvUKW5LI{2ajs^m_G9@URM+rmhs2~k_=2Ui$aZs#TwK5vD41*w| z#~Sw*i|@G2*|315oJg2+XC(&3j!o*^je?u&7L3Fm_<+~G=y=oRIB7$n4K$c(xJ|b- zQJAW7(-dFxOde>3E0*LHLX%*<-FII|T|H6o<}+duIIa{#t<bgCc&d<-L=$ieckXgl zQ<6Ptw8cUptl||*x`()zTh&v+b0U+@EQ)on2aDD9s{M4<hTaN#4TO^sI9@}GVuIsn z;6Sax8)1)lkT<JVc0z_2Y=lfVxQc7WLWww3zV&LjGz;La?nwX#wC!Z$$$%^lQpBqT zEvWaG+)pEDFY8Bu*dxqEEh^8oMnTK-s!sRWl?=0{A9_A`g2iWPo0{d_TX9u3SC|t> z#R5Py>Wv}vXo&7b0y!La@;CD_NX3ehrI-=hbMP#R?ZWE}TiuNvWN>5Fs?&-Wxc8x! zuE#f5AB0Q<Yz?ziZVMyP8A{9$^@d|n8B#;!9T?0z^e%vD2FHwI7-qtTR}Dx~U4@VC z2Ca|X(`>mioEA_%Qo@^r3!=dSi|&mhLjzPA`9L+QIQp-5%xzq1RNNVjw+NV=1SNQ_ zPO615R}EN4-Rq7Z#ZT(jd&M%{yGvVxq-+nB)O=Vs3F4R(RtPn&=f1lgNp2vBqE@fz z$%b}|ghT86nHE7raEV^!mRaQglua=ewqvNqmil;mliE`k+f4)Osi#?MPKyS<4{>VW zz=cW8xSze%k6sh`@ix>@da#p9gLk5#pB&A)7l?r>(}?>#STvj2mw;WbrO10Ub-Kx- zt}NBZhzBKl?26j28Z>KKgxX6aHFI{1SkB{7YPG%Edt+f(kwbK%r;1be9s;tL^)Wc* zq*i_WD>bH7&2XK%i@<=l`osbBEOU+=-=(((#%+XlP>}`mNCHCGE+_Wz(Z4%5sRS!T ziq=8eX67AZ2UQ7gs>F#I1B<7CUiHVJi>JBf2I?_Y^0-4&ja-2~mNixkxATy?UT%Nu z+#pODM;xv#MumjM)ThFVUcaE5=;JY|D`<Uj-D8a;hDcFt)J;%!MG07lnPOrMrD@kB zi9Ysa*#_lt&ed2=of!hpfvc$4QJX!oq{Sl-#uk^oPZ8T2WJ~6;up+WJ!$pZfIB=e_ zQREQ-SiH%M>=$M(@L5%lLd0Mt4Cw8`k#JEwHC(VyAp&MmMP=h7qDGIX)uc0qVtYoL zpK2Xmky=F`!n+!cv{-jtxh<>yf%!umvQvRZ^&o;+dkL?o1(WyW;ldW<dP1J6SJZVd zMe7Ey2B(J&SRHwwU7<#s*zj(7ERRZJ1Vi@-nHu7OWAOGOb}mYBRcnqgL(ls~V!*4R zS0x{LCX>3_<vEOuyt#rB{bC=PnGI12FiMr&i#!dvyegXWaf!Q=YzjgMyG)}6_cVv| zPUI>yWS@AVQbeJ0Sqz0$w(@XB32(pM^k>la&;y98+=quQ5@LBTqmZF(BoCNrJO-vD zf^{&&k@vb{%L!R0nc|^~j{_G%G@_kiIqu?dL#EMxq?$%A%^8&(&6qf^ZU%gn3hb>2 zTD892noW0D@`chFYBQzz7p%MPxf;f)EJC?=)w|9BRXvSKqUOve9GAX5cv`)K0sJ-v zIUoIr925p|_94|k!b!|R8Bx6+_GzExP!0h@?!4x&5Q&Ykq_p*h2x#iIk%Wz<a_jaX zxTTfZThM{&0ae&XU-qv%Xu8i^pi8r{;?2mI?D?Xe6~2a^)9}|ju&Lus9T?5yISTkj z<8)Tc&D}XjP7dJNq^m+C&0^cCAxw4FT^)D8coCi!DE4d#6COi=sekf`;?Z-re6NMH ztM7m866N+|t7)A@Q#R~TP7`CwrJQwaP}TZQ=TlOZ3*as1SoWbOCP~0J0AHkg!&B)r zb2)uXVzm+aAAVvIWmCN<8YgrqL|F2=;<6Kx;-?t(64Wh=H4JP~eIo2byT}2_-l8WH z!)jHDz47p<D^*90yFsjiqf>N25+!};?vjaS3g7OSF@8DgKJA2S7-H%=^%_G(LrcAG z9_x*u9iV-xP`E7?(u++Y0{?bbv;MJeb1?vfTVhc=r!@BmI)K2Kada*-o6&UbM3o>H zj4-900-x@Mos}Z{7iF$QJqqDN3o@-%xpFl0+SDyN=XX1u=LEiHw)06VorWDK5#J;r z=%1D`25HocBcv(x_1%TbEgzjA$=T~W(<<Qwt&vfJkbpso@+Ou5;@tx3?z+xQrEKAf z3w_F<bxGrhGGo%I`cVHF+@>ClyFcpnA+L{=O%qlFW3!9%d%FoHd2g(UsoM@3tB@$z zXB8tK?)kVxXr8a4LT$R?BqkMZMsbhAq4{%0qT(0;{ypSIbx^O=-n+XPk8t3Xi8FqH zGp5-MXxNyS(;4=$Am~f2IH-5rV1(jP^<MRD=D^tQra6h&=36_UoYYVi_@E0AxhK|) zx_D6{5>LmFh<my*mp8xPnfcL=AKY7ZmhEmf*Bm%~d5U0>*Cd*87w7n+MW}eV7DCdP zON`5B_oWHqvF7D7FU9_@9N_X(r$1t?9<ywUA(x+?{)ku;jI<@)4&yk<*cEro!qWF} zW5zBFC-3AVa%j>5V_LHrXXK)_^N?>&lACw3(C7fziKuD+I^hN8^Kr(Le0d{gh|N=+ z*Y*GreKD#-N`iWBHQpmK@>$ICx;$c+T8XNtnKd(znJw~Vth=xP#EEsRR9J1nLtM3S zPAXL@_>WFW!(t49Q<upU$-`_JnYheE3zb3qxZ^r!rUv+jC>be!S;nIAxRIf!<#gbZ zmfEYto0NQe=Qvq^ak|sF31*BPqAkL>P*gF(K;>s}ncAskt1r$j>vS$p{RbPmqX3`( z5gP1+x|Uzs>8Rl)4sn~h*3IUn-Ofiy^WLLL>theVI6UlQ?lfHUS}|%_><UE)!khg! zL{T7UGMNdxak1FM93cb<4R$KAqNkZ(`K*|-U2ByST3tX<&_zMjTxicHPM|x7+FWWY z=!SAm%~(}-bVpOr;;wtO#OW<U^ai|>>3ZuJI0e%d0Uk$7Ei@6twTT^Y737Fr1KpvC zp;G8Mp*xO3m}s$_OB(|yjo}_NH6I<zai(M~Sx69c6g*#uO+yHHd-pgf-+5)X^Kx^| z{-c*S-}U6FPG|N$0k=-P@QK6S&Vfq=_osWio$1Z59{xx(Tl3Uhw|n$!N)$J0cHgz_ zRJS{OU)lWm?A?1io#_YVblK&{U%2Xcr@JTn=4_|?gqB+W;>2!+D#!TWz4DPv5K3s? zDq{1Sn>U^6c1|9<iDEa-b#DP>XKpfU-bniKzia-*@jYUH{K<JJ3!4yqQmnm#+ai1# zVBnT08Ffj<xCCOFM#JcPRHIY#vv_6}Ww>u!NFZPhGoHqfw4=kXjFQyKoqvyJ%Wwwq z0B8L)f(1pK$n~JXjP{Zzu2-@*U;b_L^+qr?@;KThFWd#f#vgz62E_>z(^pU+kvi%L zfdvF__S010;@&}gV8VGu;?%AB^Dlnp;^yinzTyqoFwM;w-zYVP$$~x#GTTRAK0*Og zdY+|J=i!o_mqH>zxoWE@6361!`!j42Q2LHTg{5*%6)v+?yF165Yfg7Q)x5IPIXT<y z+|q2W8+3ktf0n)Hbf<f~qaR~_GJDSnUCwknKXKnb|H^Ln<V;7f*}D}(U+t=WzC2s6 zAHM3UcC752-R<1l%+_^IWom-UPQBY%)!DCv?x|*Wll=HpXQzU&a+cgG0G<Ewtygxs zr{vE!tJ(-n=Qc_=A>28pWD#CRvi@IA!IWB?9y2hnK?{o><C1jA;i`o;>{&%DA6iFm zb{n{V;>oF5H7xGVvU6^YnYo3BM#6Kd6&TTK|IbUcs>}<!vel<gXW6p{%^lW+O+rS* zbLX{Yk=D+!+dS!K!d@>Ma<i0~lyD>9alNs$-kSotns8!GC)S5J-ZxUXhE&4D#p?V= zac0>TWk_yjpDiy_H{xCUi*VlUVk^0a3ZYc0Gc-+>=$BTj6c5Y^1@8-Jj9*lUW>dvJ z6V{i_3k?0GN+0h&XPyiyZ=bwvQ(QBG*f9>>D<Z1p@=VCT<Mz({N5)TRXmH8B@6W~$ zcDBm}G}yQ+d$1#&KGEsikgeI?S-8CUM0eqaZ1uC&)q}!sQ((=3?)FTe3s*Nkw6oi} z9QRrHPWF7KGxNpOFL$=%ovH!r%T7ZW|ASCAKSjc$on6iB1MhEUst%u$Xc`1B{OzA) ze|qo5+4up9DS?5`r>H;1L~}dn*LS*+HJ45*WD+9I!E-0hd?HDw(fSzBDVkczGOo~> zTCs#zeH5(jhdv%;trr-hlR)DnHO(GGtM-+a(7PDE2$%YvWfuDi!uWhYyEK%Sj(6|F zV}5S+V3Vl06d20>We`+bb;NLawUHkUyF5OA|9i>GanK2Z@$M@hyYXO{v<l*3IYrS_ zF^3F+o1Gn|lNGDGJDS<Vm3SA7jwZIo9*})B+j%s6zxii({mpp)Ht%{<nP{+!(J&0h zOixguE(G92A4FrUkA}7osmeTXiqJpa-vwgt*ddf@x1tY2)Npk<Vy`^YkmR`1-q}=~ zx_tbE+G8WJ(|n`b{dQ&^@~+dJM@0ED!K^vmeMCIGXTEbwoR(7UeO~TNMw$HzFu2*( zSvG+?H=k9Wyz_)%`nEhSbk6ytxodNCr*k*_p2fgM_*LxlDE>FICKwfhRbL2|$1^yP z{E)>tzfC0Wd{Sk7JWL?+MRRkh*uNvP;B(1MJl447ef)?@<MJ?Cr3R<*8X87fFyv;z zj9%F4fho#5NIj$C{scX&nP>l8S8lRf!rE_z@YRop^?#d(lg)9t<PBZz_Ltqz58>`? z{M6Qdc<#wi-jpf-gvyBQTUNgsLibzE+j9K?ao6~%WBbF$j~~ufYnQ;@x7I8@b!=A{ ze!0y4oq)#&vU+x^lie@~<=xHfZ^1o2b6d8yx7Kh!`(!8#w`iYwv>Wzi&xSBqdoYBP z7jt#R@mpY}G**;7$bMmVGi-c1+;0_TyuXc7tF6TNg{QW1mwi1Coo?HBF0(%n>L>GX z_+kgjwuT_@=Q}&HJ^Ny~DSP-u<4@u~8D7l3roy3Z-kd>9eYU}F$$gQ4q?6`1^03fr zW0V^P=OY#ZUD0bB=RO6JrqDG0A#}Xs#|mQR!r9mN&8wxygXG=BM)~cD?#;TCi{a)s zOS;uZJCA!DXncL&T-kZ!_H6ug=Vtdqwg1G=Ow~i<oM*e+n*>yO9rrc)@bb$&<gU}6 z8lA1G%n&gG#~4n2{iXS`^ENzR^+CkeId5QJeXR31*d_aV)sQ%Os0_*A5t2uGY8rOf z9E?;DJ89K0)uC`t9`^R(U>rcl{+$#V=cB-jmea&9w-&fLS*T8N&?obq5APe}{-t6A z)@gnu-1hk4?t}OA-WMKTGyja@>ifcpPhWGz`@%~X-yg1D(+ziR4RhDbzv%fY8nU;H zKlO!M!_iNN@PilS#N9C5{jqMRIsW8^Tf?j4%etYvKfELo@?t_)*1S7t?@Q3VH=O+R zHEXFUp9yQ<CESmNxxWVYL+_e@M)y-c2<zMV!OyI|Z|z@)+uHe|&lp25UA#G5uk1-> zYcjPR)+7C<u%1W9$LFn>6}ffIMS@a>*#DEQp)JG`s?2_WO}D(`dtvM9$+qymH*6li zy7|7adCk??Q+?H%?alsAC9e~?<KyoMFaF7s<yzF!6fH^ekGwLvQoaQ8M-`&8OjmDw z|NY@hE>XKB*3qiC!w8r_p~@UNXb^EkzGt0<2Rq%vTMk<+#PKe2_f@x2W3K4QW%iq^ zfiPs*gIyIkqUbGuSAUi$NoPTxs|YU)7s!=8qN@8r>bhk(s30`n`14)r`5sZ4P|Ftu z!2G%KAe8RQs-d8B^a@8pXLaISqhtb!tXW?p;K&tyD%K2$o^oExt;O{bgTYzSDtw$@ ziH(;^sCn}qoSyNtk74D~{)x7|5fH^Q7PIYweu8&2Xby=R|8;iyr4v7X<<Q~hZV9Je z4f|!0Tf$dW=9_YsHG^&A{rj@d$Y%Rqyd|7gKHUCd*1T@d$<Vnc>}q~2>{`?9U!1M( zc4F$9W!(XN2Q%ZpaYw$Vyj|!NH*X0yic=8*>G<F$*=H5?UJ`E6etEqAV0J}VJ5Dd{ z!%w^vHjQ`H$?k6wD{9Nd%7e`-LL2X>-?NZsKX<45v(P<6xmf0p{O)FDt_|&*O)96^ z%#Od<bi^}Z$7Rj&S$!)Qe}4Yt+|^-Yq%yd#nSE8)Yr|UE>CN{@E;)uAIVxp*ASuXh z%S2-Bjgsq09Qo6dNDKpwDQISGR!KoKZ+_^T8Z~9(Cl@Y%&s^uuX7+USVnO1?Yfg0@ z)8&tJ`L5F%5M|AG&vb7CSJr&*eCN(Ads;zPor)hR1>cGxQ*}fT&&k7aYXUl9dj0Px zl4f*yLGZyRJDtyZ@4*0s{5^AB<KY=v1A^{FxW7h<8j3aFJ=?hzY?`JrN_bmp=zV=* zn5J8tK{=AUF+Hicp6X*Q9~)FL-75l-nur?XIQC@L$D*&t@;K<R6gqY&lAdq%yp~r0 zxiqsFKE>n1E)bR3ziB=e!uqKYZoDOIxpUKo)%_pb60Vmn)b&uqy4}Oh+UylM-UD~u zd7Y`L`OPptIheagP4s7p&a?D!J27?5((asGb{8!`L%vXE|N8jCE%M#*{&qvHi|Esv z)K75KB7NQX;C9`&*YtPEKVF&0H?2|kM8SDNb!xo-jIx!!Rz2sV+l2a!&8x$G<~`$m zD`#cy9RI_?ZMfHsLM%r|s5>`^>G8pBnSA;)hBzC4w8%A(c{I;2UNbl}*bojMHx38S zh&Oe;MNu7O)ZIAxq=>y4r<OCAQu^C(lr*Yd(y2<Fi(pa{)l|F_Eqv~T$8Ie!|NAvR z)u3K=S)(|0LBE{6`$Xp{kEMLeL!a$*?z#GzF5TYeyQeS7virK7tHre_sK8e!@T5X! z=hP+HHJYw6msXX!y?cVd+<7MRaaimd{1Ff~FuQtPGkbrx^OfvM&0YwfIX;yF9=cBo zdsj0aHss4RCe+-2_7hPCj>;p}@X|QCjc(|(rTAsXV`m)1QGdj-fx~%RREYE7sD)`H zYqO{#sZYFIrL5@aAr2*YhXx`rfFTqk%weexkWM2fn{*1<?}6h>q2K&sDAexm&Q^b1 zHhEt-bnz$GUK*Zi-WI;OMy8dG<jTr#uKsv)n<fq4a!+{dj?lRw4DaiP-SXnBsrcNq z)b0le)t^>;-uAcz8t=aRfxmn)+<s|zGP^Z=6WpJ=VoiVh<=wK4+qf^k*J;~*yE(hR zd1tux3t`jhnU|aL<&QWk?k;N)^L^pkLc+Y^bhsn?z>mHh9chyl8o$Wh>auY3`~9;0 z-moWIeT6zb8c<&R`LNkBfB3s1vHru~&Gg-TUcI7j*c2rOnH=@W54~K<Su^S7S}dc= z`tk=q@o~w4T0lMsYsHF6y-|{V<6Zsjf6*=1uAY4vU@L*etTh$b_dA{P)X!@Q;<);! zberEj)9D`4oYd^3cL#n=UiHcB5>29YyE9CismC$5^OY_`L&K&5or7ifjdPRDZ)rM0 zleoAcPN!j|`Lu?S^cobQy|c0YZ8)$E26uN4KYO~f@c!(QPIr3u7bAcou~2q?T{F6u zbUUYae*tvOtfe{L=MQwc&svY(s?&m|GfIERRqVhIT&cA`+qp9i<zyaTiPnpRCxmj# zG(?=gQK<!YZ0zXea!>H(8*|`7j%-W%rU75jH@d!z!zu@aN3*Qw88`14yp+ASFFSm_ z3`=*d?r!3uu_?Q)4Cg+ct<k-Dx!JzG&2N<9ZM((?eWCxn_SBsZn|6lqYS=NpFsFgT z{A^RHgZXghx%0CsvXgMFpsks-CG#4p3*Fe`SyQ-IZOWbuLH;r>+=`>>ae({Hit^TM zXZMHls=f%6ZCzcVM3sHh<8mp>hUtmi1k;565zVW8D<Zmd5VUjG73W2?-|3Xk%3p>0 zLiz#YolXdcvP;1nu9b+pv$bV7dry|#9B$5@FD`@3FF2VjdnRZL7KVV?ExFqdNgCx^ z0iE}FGy870+-@Bn`F9BCKi+IUC7C3QSXM<KtoWP?*1AQj_rKRYc9*bevOt}I8|96s zH_dlu+=Ubd7qkZYp=XX9fBJI5c=MC5YK+*~EIf>Gvabq$dedBYCTrfSTCs53ypWjh zs^_duarTsgw|lqsIhyOv2cx<B7S)l?iL13daJz8cN}{;CvFyCzG#Kf7YYy0_<eHy4 zT6C7(FN%UvM`2xeK}#is<22kW{E<i`ai{jHML&&8eGQMVL}7kmU?2OcYIzFJHX(vL z`|KGVW*a>lX6sQz2=6P8Mv*=n5+^kIfnN2~1V*E)Kk-o>Sy}ywi^ZtEF$rr>%aoC2 zkH5+&bo>*_&$2(e0{%3yxBBCPw5M%GJ$%}Ql`0QAI*I(pJ}TL(N3VrWh4W0Sogcf5 zn7{gpEc+N~22ZuuB$+-3=(AdK^AmslX<92rwUE5RNS4i2;^l5tHYJKhy1BP~=;I0` z;!$9kC1#(vOggbPPGcA`<QUaLniNnyU_FE!OIdyf+LDo8v$?wd@r%`K__NDs0P7#U z%p1-448I_}<3^Y{--dCYR2BaG=d$dB*L@_-*Xev8qc6F{r?2~)_e*qN?i>I7RqEbe zcd0b=!RxNOSib89o3AGLg*`n`nytR_y7j*F_<`&GD*4O`Bi1w|7kuEl&zas#XQCw4 z(=sb2y61VgLtx!oxTGnMO$a}q?OUQHXuUXwRbV{uQOcEvxO4!{Gh`(CKWVYs8<)xH z{VF9Ur}a9N=m&jeL*<=gBM|#HP#gVRHO&t-_g)Vb8&^hhz90>_S0T}(KZ5iy%A`uF z19Y!h%hkVe?el`<r}|pqbm<&$_0wM#_V^G0sxfz>6I5S4Q-<1OlrkFQ`6g)kR3$ZN z(TLYHW8-L7B+3_N;iU;f--d1ZW3FhKg9->T5oCRb0LdW4>+y<fA71|xMJ)yqkskvP z$rbC4-}_frD3FOUlu&i(7>L-TAExN21f1BJ_BB;QMr?`30|&!>EC%WHv<78TNU_D# z=pg9_fOhMZpfBOf)Uo=AB9giK-Iwgi;^K_owI>3pVxUjbd>P0dB&H2d&#FoATGOp- zl8Fd|E4sMVgc=6%-`?qh?gTjPS0of6&mIglvxC_U>#{HU`2~xW^be#)fh3wri2R*F z2J*Jv2?;m7`Kqj9d`1Uw+003>Ik5m^t2WrPVa*R*^Q9}iJdD-<>|%83ZKf?RyQJuV zHpHZ}Ckd)&3yfVVmloYVC}djfGlkNhvPAfaQb`fET<IL&S#)Yoxi-<L(_jFsk&rgF zJ@oz<Mqtc_B*;|=hmX48$U_?d$%}FMntnjocklH<grnvfcM&bkd^!)Vtg7-Qe5x2; zdn&qdkYf*3Bn|6KElX^;RWX0mTq0|?7IG=c0Vr*)*Jx^l!^Xgc?y!SDZeu}2g;Gu7 zm!D3{I<nxy2q_GDe2^q2DZw<l2PvW$V~XYG{;(S5Q3wFS<N7rn_}qc7_*xB)_08Ri zC&DQT^S+|t5g2pQ-5}3TF|rzuO5!=j>S<q0?~5wlr{<Z^Mb8z1JU)qJ8L5V_jwT9d z#j<r*mBKgVq53ql4{hD^(p?HKRk+flZR6j6de2L{H&WhBp|&Wp>I~!Tadyzh07Y}& zeqx|>N?c^n!an*aXY^pNJ;?}8M+b8MN3=q%2W~Q&cVv{|k&(DkHJ|=$tRvw84L~T^ zCpbjXprJ8#{BwfgaX{mp0{-;Hf@pfogi?G=ViAhbU<UerHyhDNUK!mLWoGo>52JT} z`ekVKomzHt5cffIT(Op(i9s0@3l`<z8Lr~fUIqtBL*S32$m5(B(8s+=V8y(6(YQ=F z%sDZ;0tlK}^wa|t&0E40{XD*<B|1SHLS{cym@pZI@Vboqxz&AF3xb_LMg_YSJ*zKO zprs1?bancU9MU>bKT`AankWD8Ga|nUp|kxil)J=b^zqcrz^T;ernX17BtZ1sMe941 z_U?<z<iAG)tN&^QCl`ah??;Lq_=4L*INxO2F@LsF(6xUyK>(7c#^MAL&AhkWR!Et& z=+Ji_&RlgSBzc_SO1<$YZgK?`k8?}>oR?r(HM|Jp?YGx<=O}quv?B3=cm;LJTK^*Q z)LB$_JOsyz;(|N&R67vLS{hM}57@Xhve;#H*2RQ9%HsZ{GPG&>_b7?axWddKa`i@& zNnkN8^Ltpr7hP#XZ?2PoO$$cKjXl_eKXno1jNTs5lZf=A$3@BEhDedPil&Rd*%QOw z*5jx`7N3Gq;u%%LRZIA$Qn)2hb)@J~A^twiOhx#qY7COaM|EPzt13gPvF<s(euHw% zOEG7EGy)N2nv8)>yNC)p@;;<%W7gvr&ea(`844Jk36BM4Vj+pYCsR5u?S2fK70=Xb z8P3h*zkQFv$E`S0C@$@NN}GgoA8^-pw?gx%%$`S8wqlCzlG^QO0Ep7Gtu*4p2(pU_ zr9N1S0FK0~Me4uM)>+v&*=59)6vK{L*KMSZQfgdN7m7!Rv7GKzu39(4#`1(g`VB{s zlx52BI)aX4mzzs#E@T^BBAWj?0Iaej5sM7dxG_YphP0>yC+C4TNM1J-MHEaViI8&w z-V>mxUPlsLRN`+-Oz8|#&UURBj0$4Q*xDH)b_c_=;{2c~(2^kP5tg&}zOWoM*|h{0 z-V$03@gK>>%Hnx0nMWdiFpY<kMnvOBYE+=Wm^fO_Psry!%5OZJi-JiGlxRl;w{k*) zH^jcLJA>;p@R(Xv#LD=_TR1XNKaR=<X&{RhMVpMu_rV>zoW_80?@}aHx|CRg`a@ol zl35mTVzV>)X^XouwvAFHmpPV;<ofApeI}wYTv1mP5c1e#L$#`*{QS(jD~V^vo2+4h z$3;Z-)K=JD{5a(>&VU(7*+JPZ1?1AeIrUso4j}-A`j01)x}lhMF(HlnTqIq)lyP68 zlAy<G{e(^i4nmm1?R;1aGH*b5@=zae>Ypoj)F`<73&n@V6@F%+8CaeMPsTERahs<( z8AAx}YDN*^O{<Ij*!|I;FQHSLy5_LqExkWJD)K&G1YRFlrP>#(OJW?ocs+vKAwSD7 z$>7B=Jo+LP)V))$yeb|zUA0mu+IYqyeV_dsp)svhQ}RluNq5yMQV1OiPtHKLdvo<u z8zSi<;@-3H`s_1DkkU>zF>Jwu@kBjCNOMg*z}sMB)Ls4mV(-nK?6~eczgn=86c<rT zcaJ)zdpgFRh@Q5?GY<P@><CBr#rBKGeskFVCs3057Ns^N*<@aTBnXgI6ai46C~+x( z5=ej`2@)g$iVH-78^9_O#J;bEs=QTo*UUWrety4m?k#HA5gqg57uT)a&hp#O@0`r@ z%RI5Wfg-$cx>e;mk`cKo1Rtr}a81lwpHG$8)Kng_oP9`J){y&;uT%(0LP`I*Epj6f zd!u#)4cSg2Kx6lT|D;4B0`A=L#E4?#;1AsV+ahMC|GPDnWvc3GAb{<ABXpnPtpvZ# zn9ZpKt7*1>H)k%%5=}zUp8U2a_3AL<=5D<i*3usvQ;Yt{6yi<T-%Jxz%io?8;zf~> zdLhJRdT>l>Y(+NB5J@2lx)c{jY<XCv%PQRfL~N8zo&no)888k>(kRmhTU-W^O;_ai zPvDImxuIV6B2Q9{?8Cb*Z)|8SJz9Vlb&f6zG&GP{|7I~}V%3QwS|I)ly5Sd}@2%HW z3r7Q=;A1&&_^#79LRM2(#Y7F_quVjB<PvlriA>GLt>rnj+!4qv^&cij9{vxrNr;l2 zAShUuR1L60v*8OF5}TY8746(Pi5-#UYv;y;fx6osv?)Ws82xsC6blL;5yj^az%~TP zKE5I9cV5U1eT$1_zR<2>dv(iC&m%>FjeN|TK$masihZmvf_>;=)SAd>K}jdcgyRTL zh1|zDjiNKQU}dN;HP+nu;WXlVfsq^kgbkLI2Hbv5V^W(U*|cM(heyX;mEx`>zT#{` zcBHCi`8JjZ2XNe3>JT3{NmzdSjj;g|X>*2ejl)R?<7&f?P{fDG-gUa&nk5Sj2Iq=$ zjHn7qmo*}<re<M=L~%Bxjzt)gTww80GwuX@4h=ShKTVoIZc`<pit(L42ak$Eqvqz2 zMQUG3SAJhY>!hypCw%nh?j#8c9Z-kkE!>S636P-#qtH!6_?MCB9K~$>&Y%IQU}6xm zU^I=~1X|32RV?_sm+ldukvKcVmXu{8God;6?n~lZIxfxs(3T>n%oxF}|1%=yHmE;d zYMO3LjMjeaF<mSlYwF-W-i4pqsF~>?BuhXMs=@9*jI$KJcjj_|`qT@;IhuqwH$#qY zobFFjbQq#S2T7RTU)VcP1Ge1wP_EngvS;S1SW1CkU$DRz@nSVJt@g$8U$$&n&sG4l z{bHfTzqIz2GFz5fveXwprLwpe5Gr3o%`5ntUupfX1<zViDV8v6Cj?r&jpfK#JnW{R zcpgi)v6NX{;*HhTSYd3XFUU3k31(l-jkLkyW5Je!gF0UZ&KHfdrQjS@!>OT`q7#G_ z`s2!Em4wizibda`3G_W=<4dJQM%${(LT^!AbE#e#*Q8SwUo(yM(>f|>^;mJu*Q`?- z2&}p<)W$+?$igf55!}rvZCl07==Fu@DC=oj0ME|TB5gwp4PCQzoh?#V*@Aa~f}KG% z&e-O(`RZ;^RHQ}U(n50Rhy~`LtBmWynf|rJ9st>#nJC)Q4at|yYc3iMUL7!OX)U>A zdQsU}nVljgPSJ(_wJ={FM^hQtM^hVI!T@Pe!?{jLS^(|9DonqqYt$`+dN2zl=gB1r zVet9&t8(!>2tnoT=ccFxw>+l-DO}eE^1*U{kt*~LSXLNx#Et|>xDlDET8lHyq1Mgj zsKP^9S9E%+sY$L@L))%q)w-eMg0?f-I?WM<gm9H>n{Cc%Uue6jt*NbQhSnt=Ne9M) zmRe*_t*3QXG>4n53p%-|jjWEgUfh-_*1XnaQC1cm<rvyp-&2cvR;^K%0VR1}$t@k1 zY_(M_4XRAmTkZN%slGI6x9tm$Qkz9gdn}o%vc3$dEy8NoOUi4e1zuTI6=*9tfOQoI z{cFKp%hE2cwc2j8Y%B}JYRy_fkE^V*_^Kzh6E$sLeAWSyf4iU<)VPB@Er_dnoKfHK zx7wvHkb<qJYD?LsMQ1CPk&VBOD){=TS{*q7X0_B+5k6vEVZ^eWtSyxaB9{vCL3qP( zMj{Kc-fC={4B#Ca;4y-U1sww9vTiH6TKw0vRkAngZv&7pI6SRhtTMiIE%lsnSoY28 z>B<F2szY|QxJB5Kunw**n&C}{M*CZREXFm<-%9YGUu%7ST{*x^Sb*b8_qLRZ76C$u zp*FhoWqDl@Rr|YNhnrXd2$lj14$ut1Ip{98CsgLhO~h`^KzBK~Jt9MLu%{wgs!P<s zE*e=fMiV3%GzL-Y&`e!XCbA?K>`fh$1$5jzlY+sSETC^)fa<mjsYs@+a|*Sc5nq>g z7=sM$wUBAZ+>`(ceF!sndDiERHYJ`rEaRJ~6JFz}@I=+pudf<wq)MQ<r<I0X$Fg5p z5`e9#fovg?*=3pb>~$^C{qrwb*_^fAS!uo3xx>~u*KY6B)DEpuZ)=mccbscaonvis zEg7wK%h_(DAgiad@06C>R1S;AkFv75Eox4l&RDmd%D#3ytI=!0bF0eY?*R4H*PRAi zLcYlg^p(}6KA<V1mEV1dd8kMf!GNu{4q;XIJBcvJa6F=-ZP>vV7pVs%jI-K3fPJa? zL}p<N&3BA1U#>n8Uv};SsIexv&IddsK8nst%eI6{`JScK#3cr@^s8+BdcZqaR<%b` zaKLK!Fc-Qlt4fJJOrW)urA5D;=OhFK@2VLxX$|DxQBfc_JKr*y8v&d-au+KQS6hxa z(?ap&dqqjM+gbDTmv#B`FG=bq)kslYqgU&pcRRb^YkWABSDjm6<@e{>yUsa79iet2 zZIydt)0uWA$zvPp<`J!3_M$@EcF^mHuyw_{%Q~0@p>?RcXjDmtR>I{_b&v?iwfZ`Q znyv&IfMze9D0?sOkjad;DVQsefl-t6B%{<a>;j2MoeL{21a4Z8Ct+AcojNjTB-@df z!U08A#w{$>QCj7OCp)JO{9!iM7=oL=TLp;LBp8Ni(5kQlj0F5rUlOH&l*w>HOhrKQ z15oT#npuGqGytNVz%Rn+s+L)>mo_^=vRI=xaq;d%C0i^zKls_}Dk9st^z*SFe%|do z{{GL#-u%PZk1upC-7~hW?ELj&!{pW8^-<@>)Ya>|rgof>1)cB6f@Y?sJ`udW`NNSz zh5>gs&~5rr9z?sbRhCa#&-XUq8tD`1I&|mf?0a!Mf=LDY2BOJ-2-TPjT=UWEz&Z(u zV=9-OTPYf4VI)-149yZjmRwG%I~3b{Y*wZdU^SyAhorq8a8=WQqlD01V;3Z#HFpD; znrRzv;_b#QFhoW5T;(n*=h<aJGeDC|IxZP<7bt*Y(-3wVR#1EGTe`ucd7=`R(xOVF zMumL<0c!)EyE|8o@mVOs{ht@T`j3C}t6#1Asx!8`^Xa;4z52Riht_SH-MFW_?!(^3 zgH<tddB;*&e80E*(BkXQx2Hbn9G{x&?Yhu=;X-%nM6Xd6Lp`=aTUAuO(L$$HuPNXw zIPG<nF;}eMwAWT@;9S4TDu!OKSVf-xD?d|S&wvf-xF+V2JEELY5P%}$wFhyx7^MtV znz0BJh2Dq~9SId1{k$RqRTUBHU^|A;5%_*cXsX^y0E0X9I*z9(ZY70(c1x-V>jM#} zx+)Gk<Ey;BvYioln~k(JRBge5whe;u(Je|79C#gUSs+5Ln%Z16eU`!NEHn+3v+dNl zd|CxnyFywZ0{#69?R)jfnNN?b`|A8yqu2YzyS-n0-kV>y*n4r$nXxUuS+`3tN59y) zq{H`Ko|@V}e|2i9*V{EynBIG@?)a>YWP2u4gcFR6&}&8Bdg3A!!@VM9BH(4DSJ5Cy zhS;)L2~n=!GG>+${E%c12d)_QO+ZV;aCTE0#9+?R7DPPI;+4Y(K-pUx)uvpxMe17N zs#uLi^&6xN3^NHCO#n}fMV^5R5s`i<X-7(-u0;mKB$Z$=t}u%FW&}`x281X%Z#rG6 zDPYmv$TmV1_hca%ICnrYviOU&%VMpghXgpLU4kK6^Purbo@G&$q4@91;urgiqWt;s zv+LCGe{rz*#qqK+wp9N9rL$w7oH#yPmPK)PhZ=ra?EX;aSEkxUvFoU8qu6z^D2_e< zyKY&^qDzsfO&2=q3pC|WQQ9`5<0@4Y1m(vwm8+bDQ6=ktSox}`Lq~_zl=do0DT`6B zT$FcM23eL}2+B~*H+CRnM1_0BEwKP4VYJfqw*UiJ|F1+}w_HJ*QzJs{f?bpkr?*)( z?d%sykxa6m2(U~-^@Ebco&756L{J=|685BV;q*-&&2h);HL1LnHl76xI?AGB@NbDF zNI|}^MYa=UDlHKm`RoTGz#_$`e(eZ-4fXg}$sth!HPV!>Ds2HFst&1Tv6_nfKzO&E zQqXGqRY&LW7L|$0)f_;ja*o)U_Vcp*S5+y6{Cr<kmOnqy8GE-pv+h#)ixaZEX8F6l zy>+jYWm83NOwAYN@UD-m^4s01ney_~jq-(y`tM#ZFHEVxkUG6l!KjLIM8&&G(4iU@ za3zw@R+cM3S1p#I>e%&A)$@81qq2QlQg+a}xYV7Vst7{cuE{qv(zP-LzA}7<!%Bc% zVpBQJ9O*D;lCCZ*;REMNfO<(8o?np2nIv!MsbSPrkslyZU6S+~DrVF`xbrxunRu=u z&nO0lmhoGatAJzM3Xa0V6<j9jsj|xQpiS5+mEd3%DT%B=>ouZutVBp00kTuB_Bvn? zUi-lfgu2#TT0@d~P%7}y<6`7?PUodY$0KF^jjH;yU!17UjE$}PV^!8qRtsaTYWLpi z^4Pku*QE8Oxn4EA`$$>cc}4fu$Es@gCH=Rjc1(TzLAALW($ezJX@9*MuEMNNKGN3G zc2nDp>Z<m0b~Y6LPz9Y$Yr9m9h|{jlE?3tqHLr%7y#>+J>`)oXT1BfGZg>A!<yN|> z<R|sGz@cB)@r~+d)zdnXbFDhA{i_;E4uz#^I8<Msf%vCiX%%TLyWC&6nw77s=~0$> zwq>A8ThCdGGP4{ut2nn=qItS&t59>@O@+hEDy{U)KMQaNU&5NTpHt0h`Y!UljM8IS zma~o+y<|DFno{~H-IlKAU@K*Na-mCKDY}|o6#=oBbSa!Hylr*CM3S$T4T`k>I4e*O zvwXEJIz2PpvvsWD7sAE*j8$U=@Gx^rq!XZ}Won^p7O95!xF|X0w7_;;HrtlkHYkNH zaP7-<+fvy^H|SYJoz=Fdg*-Uav_3g#jXF;NHV}N-Z&nazHE>@-8y;*$@5Hi5u+l2y z&~52;mFlk`?yIifW)%#-_)6<=_k@`h#<dA75{qkkm&S(-d1jP~NC~l{KuY(FAn0D3 zK%zOf2U21^$cVBRoavdCSrREjGyimZ{r|4yi7;Bteez0gYIMicjvaGTLpv&Mxwb-E zZ)zlLex%$y{K)2&n;(1n4>zj$pc?I&FRs29*0#QwxvH-~X+IaPk~(wsiLlAm^*$Mf zdmnYDRtl*6O({?<Z5#pLwDYi|J+&rm-u#IDip|3Zi(KEBTHV<9(8kH<-YJ*D=&@Su zRUy*hl@Qn)B2E&bQ(>fd(}2!Lz#sxiLo6lY!{+Ldk<Gs^8X*ru7phtqAE}Km3Bk!) zZNCt32;t=T_<lohLYE1_=`dU!Mi#|Xhzx`sBa&4)RSD0CI0Rc80ZzeL=x!crjkF#? zY;RQyp%K<rn`^b79(dv2@upA${8|`o-d}s{Y*@=x2q$Xe`#WK@b>H}84^b{B;EV{E z%coZDD#QCiE0mvx56h{QpM(#Dun-l!sg<vWbFYN+kSSt}f)y=E_K|Ay@D0rzHG*cG zYD4q-(%}W<8foZ^*B(=r#2zI;y6EWEYDUK@r>=Z5Y86sGa%HaA@p%aIvX8^zgG#&~ z4j-b`Vru0p;iCSLNzqsD=9cCpHm{JT4;VEo7HYNeYu&J_x2HB<+rFgt#ZQda_E#i~ z*J|6FWmsFjb8qe5@$KEq8>`yzw!Pi3;_}4A(HXI^uMDfo1NV;Ce*ShfkYH_pHw<4< z;g#F=hEN??VFg;@uIgO}6r|;MFWg(JsS8`(cp(#_sYVsnT%MdbYRP3-v$(x>@8+3p zTVI!?dM^p__N7k;%olrmQ-4W2k>K^eq_N>EQ&V~~zA0Vk&<Y<`Q+Myxy>K``HKh-n z6`xPJINH)mwRuST7-|i-9_ei!eo7Oq4axI9G4w$ZMv+KWyY(NIum)^malEXp9_PAs zzjDI(>ZLD5@^~%lhM{BK+Dd(4C$#>rUhTH~+p&r&zTOSDsC}qlJ+$tv6}92}TU}Y! z{o{f$I=&Q6bZRT~?XqLzMQz2srB1rSB3<UHRMb{J9Ku3Pn1_G5^jV+rmBsU77t<5- z#nj)v6|Nl#XQmG5Gg={h@Kz{}hwz~!@@fd@m%_9TXS?Ae<6O^1<OI|XHx~>AHV;pV zZ#BaAtJ=u;PiCs{w@;1Nb{DVLYVRb*pQ_bfEM6ZUe>a3@Mbz~Cnf<*&E#$r{bKUS) zvXk0R4*#k){`c3&exPyl{#tGKKmf9WTZ-eg+I?4UhG%NERaRhpcQ^cX0@hVS7u<u7 zQ!kv|d9_@4aJ+U==&RZflq`Be*jXFDfA;z#<F&~UB0;rx2ND@Bo_GKFeX)HhT>3op zb{q+xPECgoKMS96kRiMpu1xI<7mtLQ9S6e2SC_R5i~)Is%_EN>kohn?EuoJ*uX*3v z4;o><R-2GN!VVV2=>poB3=1Orcu%fFRJFsch@>4Vv42>#?$T%a&ev-9v@im%+X<_h z)Kf%8ZFR~nf*RjAaA@=QTnlGv;|~|%pD%S@sMSuH4lJ?uaA>NW#Bv5=gkdFgjZY4Q zu%dWLW<g8uP7S}HyS{(<@saS+)RFMvk?=7GGl|Pndy&CWMBy@!uf*+_Y73fp+C2Pg zNnkFlUfhG-?q4Wsw~A5mk4p#(o!Tm~UK{^OTdb><OtkS|;|Hto=X)g}rQFk23)G?M z4Tox-u$H1S=JDD+t5ZI_kJo<M>V^NzJ-#YPJmp*W3UO`xT(UrAP5|+zs%S-Uo@zhC z%efyd-jfTM`tIl9%D&e>4~@4&_p>s5pu-UzsvX}~GdMmMzI;0rGtF>Rtm_}QA;U2b zJ=!t{J@Uvt@jn|@-h7}|%g}#)<HH*tQsZ|0kB`^t8#j@#D9evRkp2;ZJm#P86}vK$ zaXAXH{1fzVJ&FlIRm7mu$5%IH2joi#c9amjsL)J?>X$0>l$_()z7WP;2tUzR98Cza zqLu3(hLV8^443EC2goawQ@89`3~!0OZrFFa3?m;-X|K1-r-oiF!|2Vasn6wgPs<&i z*FWx%Zqn3$TCqVl!WucZd#;Vw{(iO_RvKXleYWR4*9Fu4_+!R)4c$vvU%=PAJ{~FE zFMW+|X*sd&`9G0Mwl45uFZ>(Vy(xKNeEgv@?61{K_v0?O3He@2k;kCbjn`%m_kH0= z)jDXSrKueqS$;V+vin8thj+i=-SE_2U9H^vI~*omWk<%Ye$S1)+PqTdFSo1{{IA;2 zpVpTMU#!(Oh9~67E|r~2pPH=IewFaxrLs+eH1pF-p>wiCk3XF)aDr0gh48_+*hg_s zh3Yr8+Hc%o@NQ=R<F$X7EvsLS*H%3hO65P*4gZ}A|HGxwK2@SpajUYEaQjgEigf>l zu+!$0Ij**&!uK3_TutL)(K9{{ffqj==w7$1*Y}}taoIB`z%XdV4s`=p;Jj^yfvP*3 z*FM5HZ}YR)^{9bvZ-MS-ymlnyJ+=0_VHDn6jcm2JQo^iCto{3?(9`AkPt;_GPIPJ- zT%hf8{9Co3Xe6ozkUX7cJ!&g{(weP}ud3Z6lJA*UucxB&s^40Qf-$aI?b==EBKMMk z*p$~4u2Fs4CGXaT>WRVA8X0%59=vRviK`v^UTSIxxM=(on@9Iv>DuT{bMxxT{_kV@ zVoZBV=vF-+!s%M=fXux$CE{x}eMV+D-(J?%{!~p#BMoC`h3xOqM`Yq}mErD&q&!}G zT1{Ba_JHr(VGW~_ds?BfMg8$_o9!^%5R|_Wl+*HmR_fOwe5IO?oK(qEpe1>{rtjda zx%^;leD91>guOLY)P|l<oSh15s_yKuw|9%F9EHhLPfQK(ke*gQGP!;4%xt%kua~pD ze&Os*4ZJ!xZ!Q)~I?mo))Z^^YroK|%3nTM4yWOx_LVP>S&oatr&faWYQTnVN1&uDv z&MLIb%I0BpZ&nSleSL93<Eo3wRnvN1o~RAPG{V{xu7#I;aC#)X7goyY|7PdCc!Bp~ z^NS^pjn`hK#PIBRuQv3_yI;>;{N$5MN5Z>d)s2t$KL5Kzt#_7X|Hs~FH9~xP;P;i> zz;cII>eh8gx4YcTa--f;DmmOYazEYEnQqAW#m5mkjW^<Ua~-$~RYF@gksQPHomSfF zP*zu60~K$exkE3luvMK|LkX)=a%bzeuZ}uC#+VU}9o6b2stnC-sT%bS9#2538Qn$m zkik;@R-Aig_~96zI4HZY^IN>I)#<8s(SLMNh!s75aX5C<4a~ynwPYYJs*VKU4;lh@ z;?Ust>G0`y<TL*KqBnCp;393nPR~oCZg@Q7@>V(I`7I~Us;DAQT;f9+3U;*(P^AYc zr1@hRLsm^k9*q}&Xn@S^U;1sMd*Q8kP-N&TdyZs}m>@Oj)y)DDV7SRG*$nr}e!sj) zw-7^~I{i;doi+%6TGmr%G?+N_#}E#Eu=DE(Vx>a29h)_pc|=|9s_Oo_#*p=IEICss z|AG5vw%4|G!paBK4LtDhHy7+xcRx5;E!8Hg%MaD=d9x}X*jSYtHZJNx-Z^c@s@JvW zabIDN0V}&Yp?yOekN%EU+qJ);ty{gU{YTXs+8?8IrTi!w&^&bYx$#%$YyWWZ72Pmy z5Sj-zzOSN}s!z0E(DsLFQw8F$w7pV2tNn@UdF?L`0L_%;52|9beDmJk@$m!YQf*`L zz{XM($EUwMW^LKy)%4i6NDr3nd9H3ytCjx5)}Pe!h*}T7HJ89+TwRpuQLjICUPB_k z_}o0`@h_nLX>q7V$@53q1B^T)=E1K&681;%>4|+ccw$aA7%6Vgk#zy49uJruZ+ym` z9*g^fbbAUvWK}5DDsQ7!q?1R@Wwqp7dwB?Onyn_l(&OruKRAzML~P9@f~G&P7HoT< z4-Q~KE9e$Y&~XAlGb_~{MzzyU0hOX)l%X!52lP%tkW5J%h>EB7%vbQ-d<4nr%=89y zdw8#;{#=D5XDwr7S`*ggU-TY$m>Ha7<8Kv<x;1)WW5LF>j*!^QO+2o!d7e0ZR5Axt z6?Zc0Lv?m`)O3T*`7lw%{F{Wpb*ar~y_gaLaIaWPJ@UX6nA+piXV92$V(xJHOqb+p zWh>^hVqGEdnM7SPwa3gAgxQRmVbxrVAyFcehlWa$w7D$9=*2a&8!Ky?RAn{q5vRT& zmPs=EDZS^EYU0?c3zQ_P4Wv$XReo269jozVOe%$`M}V*NTyP)+1I^Lq6M@5QSxChw z;8MA}57TSe9#lvgnBdp+p<zcfh+N3XtC&)CjoR!gWHX;Qq^Y^YtTTb8JPkNtj&qm} zR?t8brP^^VD}h9mYtxMo!_P399Vj9CwHYS6zth_wOY0TaYX8rTKaRiHdthTvDWcEj z)kT8J5Xiu^zlQ+CFcD@WmBZ|Nnoo~2_$gLIQ{=#DSzRW|nE=;hrcInPc~0G8`7}G= zVw{9B0PHD41RF3Z4-__^mG^)IpRQk2(N1v-^X&ewE1RV!XhW07J&WRC`W>3m1{~Ru zcr)-2s0IK8=e12#LY&iAY{0F3;7XK6eQuvPn_jE{z&r{o#x=lq|I`sX;l$oJ@%<Qx zzC08x5y?cz9_T^nLaQIGgQPUS9l0fs6c@O-ZHeXB@%DPdn<h#{EPPSb)=YJ}n<skR zO_MizLj~KMwrjm>+V`||wLRC{uKi+9P}(}#B9SzEmCoMRR%pAb?R4*)_S4!<^_o5R zWJ5EJ?r>x2Qdbd2+OBJBYAdvLyPs*lzdO?F_Dc5MtGZs&_PMr;-M!jV{+hP3`>giV zs^YP$<6`#>?Pt1zXx;LP8RF6iDkETQ!GpVESf7WPrD#Qu?jnYfNU<Uw7l;<S+r!G( zcZppi&P;JzJ>u3#V_zu2quo+;B_U*ON60BrUaLGpO%=f4@m(D<EJ&BQF`~pgG;(=R z=c0j%@nOPPP@&R6brTT~Le!guNeYk0?s){VN9AcRBEiuQkW`&qX$H*;IiW)xP(qoD z$0G_oI4y~-6bg?sYz;ymjTKL~Q>O?}1PTtqSS<z*sHlb@${51g^(fgW*B)_n{5st^ z#rTO#ucF$wS}Hl+j%j*irrpuxZD**h=s6t~UEXQ8JDs+EowB`xi*`?EN>-|EVz51; za|KB%lPf=?ws2c*WlIJ+1*jKOm#zW|-D?j6D75c3kbSr$w%ZEvQyE3^8-x`G3<6h? zDGD?oYOhuuD-1@NkFGeAfqDrb$T4(o<I*=B6ei!%n+2jsJ%Y9%Tu`@G)tzA_-ok}` z{7Y(1vI=n~V)T<jmf<w)O8I`Q1Rzc$KqpM}0<R;YV6E2~Zi|vplJvreWvV<#gi=Y) z7OVwIIS>gAn#o^fz><Wk_8k!;SZzayGB}+hbV&t7!5L8Kx~Z5%=}<sj?<<`S#muO3 zFiG7?iNpy2*7%k7dP^mOBVAIn+8h$`Q5zx~fUw~PH_giidcDD3bExcv0^YeuuV(1I z12L(05Bz8^a`@{A_TGxUs=&)fdUr$T@s$r==HT57lH!{d01(UtgJmyH=&Gr!^p2A7 z^9F{${lSYCymFxw)r;>E`TG>SR{?yzbs^~f8ij$0Z&9RISpe47#;Y1a1zcX1STeZ1 zwn(V#RTs%i&_L{Oi4+lW=#wIy7-`UMxpp)FAaPcq#@-x(A`+bypc-~jhb;Ux6Fq1$ zx+vu@^uTP@KA)KG;|77h2t!#o_m_U)%|)))N+Jg;VZGqm>GK!P>tDO-LU}%1sLpFf z_WW&@azT6ktMh9pWNC#;QG#uhl<LBWvI<pQWpF4S3{?00hzbN<1uM=`RnDt`GS2IZ z-gYdl$S9RdOQ<fa)P?>Hw9&OvnfeFv9d_2I=fe5o!U`+i5t2e%dA@`s?Lq6*f?7QF zs{-n-1jBHt!UdzcJipqI>9P{;;q%5@aeh>(LO&$9(5kF(eub6f3{D-@Dg)=0k%<14 z<5GhD2ylgEmFK%gYbChVg{}bvbQA!{%JZWDDbL>`Kn^aU0;%c7l3hHYg1!q&R>9C~ z2P<d-T|otqMG2+t;Gzm31{nG^#E4M^xbErHm5FskVvGW(<IX`6_$?>ejjlm2At<$n zu;LJ`%!eA4wwAUF+7`9VYn#h&ZRC0Sw;~Hlrg$%IH*{ReS2nEF^}K4_R6>zo*B)pT zXQOzbjp7`;IVr6?G#dE|D(e`OI@D-tOZ22X%97W~FKf@$lC~lrQN0s(Hq@Ba(d&`Y z&_+49Iv3A9x08>GA!B^S46MN{#Q{JSiXGQh8Tg>HT%-Yrt)s06$)Xri+uC3mX31;h z!;Sog<Zwlm=9B<P3Ke$E9t0g7FX>1%ICD7#E13hru^~nPe4?$Bq)ft1%0L?z;04te z+5p}&79m>~%5*Ky%n0WdrCjjrPEH-RlU~duaXuf;jf%wZRb_$%@jxx<Ah~H8gutZJ zBm(q%Q5)A~4wq#j$O|9NQC~Mok>ayn0Go5M1GAY+z>)S?0BUn>SG@c+ap<aWwYUhd zk#wDo6>LE|*nmLBCDU*!-pNTv8JHpz=8ol<AE-fzIpub&W-@ZLbv{Q>kd27lJmJfA zBttbuMrUL<a0#GO+8_t(0PRxJDFuK+p|-FAAMDUiLB!uxddSb{3=sPyDjEalmj~oR z23TC&*w{5~6vA`?2ho57#f`j7CI%m1Ty$7%15U!y063Je35@YJJY!H^RZ{M4IzORv zte|W4!G~SAMNkolu4&q&5~_yO1bxs+?#=wP_No22<&$dVDKMYoumFv;V3F$cQG*z* zpvF{Mx-;RWsL@l&K|0zh40yCVWV4iy{Nd#rc|LM(?;mLDQvP*$QdNW=6jfrW){Gog zbca;#8S7MY2W8GKUt#VNO4$&RQ;i+DRAIU4ZP9pj5k$bSiB9osXs$FQZM8^@U`8pJ zrne+(Dh)~GlocGZY@{$ZXkODre*1G{U*=cG9?J9mKe~GF*p;q}xI&Z1#~y|FLiYJ$ zIW~02xnVzT2&2EjmYhsvB>zOEMTrS}MpR2W2Q%_UHf{KW`Q&5JHRtdKBr0)4#WxL* z$>MCxa!o})<05o@(KLn{?|+@a17k1epO5|MYQAY>zTt;An)%wszI9*bm&f+z64x5p z&%w8jzdTk$g?NB@SXgc@G)3UUmNz%t(fK^uge32+Dwy@c!zHO1x&mfRCYQ-S&;_7% zw^?_6u6t5aJ13oM2;sbyL&jm9VZBHcdY5G5CK}Nf?-6KD|LMuGNAj1}jZNPidoADa z<B!MJy_Dy>$H#thAfH}0Hn#8D*lUe19~>L|RWJYkwhh<jf4$*a{^Y~&jjh|I)|j7K zm+5dKkEVduPB|7_rnhTX<f4djwQ_`1`P+tCGZZ6;8_BU$IR<gn!63*>y1baLqWNo! zT%dPs8z)C~Bn*0Yi0Hs2?bg9Lco8N?N?p!dqQDyQ-{Eufd~W<lHzvl$Ui)h7c>ciH zy7gmYSLPph<-PH-i>H4!Hu-UWd^W#t-Rp1eEb=?%@Bh)2{JtMvnZJK*?4hxB@2DY7 ztos-_0~*aVt*?NjX>A}z$w|Xa>kA;05(tZP>S5fK1nNcvo7b%c0hg<pd?t2isaHbG zU{1{8cHB#W4dEbTB$-SVVf8S5GXw?g=0A9H?C{vWb-#M`$2al~V+XWN=lS)sPmUeQ zUl=<kr$7I*u|3y?;yd#X{P<eF;YZgbp^x(eV_Wll%h)GHQXWpFYpxE8zz<bW_^Gx; zCA`KCzh$h_N?;CRDMTLt!;Ku$(};*_q$cD4Oy{MIF_HkAZZ)4M171;eDRXiPKGczO zm%3<+4qV*-VcpNi&fWh*xY_U{BrrYyq+SV-5MCIQ=NmdyjSW95I=;O@YJWh?BY^3# ztZ{klXEavSWn)eCk3$W7R1!N}k(+unHO*MU$-s*7$drL|NQOw<z?|h!jvR!DFkuX+ zq;Vvl+U8G_mAIQntZ4{|AaCa06?sKaU=;~9*8u;TWKNB(8_$0;HuiQdzOUyS)=hsl z_8X*<zc_Y8quiTsu3IMwef$0&&(4nj=-T`PKfIB@zwWpBwF94Cl^y0es>C88GwCGu z20lcBFAOC%Y%Y7a1_(yeY%l`9X+U@x$<Q^BaZ;N)U<ncKPgxcK-;eEW+In~Bz)TPs zLIw}qS6^!fe>pe4ZhQWRbz`UU`TNAq{p*f=Hug)oyH^`K$DaMF%2&<r{OH8k*zqF2 zd&Ah1KO2MPu_r#gXY6o({Lx)fkonlfNDhOH#n@aCGx~!x8aax=!G|>Nguz&!GS?gw zsc7x0nbsFNbKr0-&!|172H@k`;LdM)s7EgdpQUwDC)|h1)zLqo3uHnK{0*ZH_l85$ z-TVjJrSY%E?w!l$H>kaDUialSdAeuEet7kZv9X^?mm8|Fq33(~x8E5X+lHVvjAiS_ zewXK;jXea!r0FWZO<FP406&LL*A+(273zgXSU#nV+CAeH4iJzJQvRqbw_dayN1c6z zTQzTED4D8=%7I}Tv!)RgUzj;8^o4=hLkRj|Ov!aLP{2490ug;B#pd$6FVE#yG~k=R zG-qAM^~*PM)w=!qRjhD+!;faKUQ-4mR}3FBO+ylBLU|11$m81ao9U!Wj<ABSZb}Li zZJD!k#;h=zvF}BOiC&j7HAp#bg?uDI4q892&d<@3f-Vpq-kVyG+wUBQrsr(vBf;pm ztd%b0BR~7$70R<E*L}?#IyeU+)=e108!v)3Fpt8F617vErU)rX8>B-<&j#<5zd?IY zzD}{3Bu*+JN`O<02L|4(Ky<o4_9w5Kx~b$>mKmRQ2BYfr`uE5P_T;g-o(3tSunw7M zq|nW~%Zok@5N&U&h|ixL7%OxGC(YuMF53zJ1+zwyseaSUy?<xrl=_W6_|P|cL?q}g zNt`3sIFrSJ7n^pSn|-|1Z%E1ePzjNh*5Gp+LxB))8*gSyysy+n6-b1wFSTJa1~uJz zrG84cum&^o-t0fxp}E1J7qq(IM^$sy3c*Y!9RwpejMCi$<)W=&<nR=|cI>qWRnaqa z`hXj$U+S|x00z^PVsjf};Ak{qbM9n1*6TQbfQ2@$;@zr=9vaz@7*s;{hzygms0##h zW_F}d3PHj^LhbVRVL42d))>9ZrVfe*11z#3!gOx;kx>LR0eLfH2Of^wlaxeP@?}5- zI}r3WGwo9j53Nq<y3CJQo@0etzne!-T+Lfc<%S}0K?lNvg|<Cjpq(O8V8^B~Kd{Fc zDp5GG56Y$36JY!ZnlkPlT&O24m3Aycbekm`Uanczm1w`oNRbh4fD*_KWXR+w#ynsN z(Nok_?hGNY&+V}x%Ag{QP=a&Ri|87Cjz(s90Ku)j?g;rw`8*>qTa!BIlg*rTuDf{S zt}+-tkd1ffmF_Mr7Z@ngZif(rci?E23KBq-mx79%poB!dcdD&0$D~Z!kCnq~sK*sj zr;C;mn`MRb0auyd;wM&wszV0N9^_hGLlhcoC~fTd0Isi$*f0&EirB54E6MKCR0%eC zRs-Z-LX7ZHg?Tz)yYieHZ%S^a_DBIJ?s!pyKfmxc0yQ?UFxs3%(p)g8ty1~WSP2ft zVxE@^hhSC;m1XoAiQbN?;_P*hJR!J1O{A!@YJ<h)s3IV>Vp1JiH{jMdN2Y-;jR^zJ z!TLggh_KX{<$D@Y9!|4qFzUt-R#w+tlMP9dU@5<>plE`as9)0#kP+-^10+Pzcf%+o z_-5`8F70j%CX6Tq4sSez;vT(kT40HVy$!hB7@gQtE2|Y!yAWy=0kH-cL&k_vd#dO< zQaP8OpomsSLQz_x!8TFRL5Lxm6rfRGsUreL-+=J8!<C;!wo#mlMS9|+huEw80|duO zt4>t`!gh;E0h~O~2PJ4sDv%e4?1@Ud^xgn>LcZ%II_*D+QuWk-Bp&q}%YJk8>o=$V zDcm@Q{YJQdTK1bMa|nN0_M20`nd5IR`^~BU5fB!_P<J-0_~UH&<Lth#hw(-n%`n>g zRqfTAVP#c2rT>4lRO|2)`zUq)sc_#vQfe^_zqGFxzWu91_tth6;rjixpM0gT;8Xhl z6R?pLRoL}v5$>)Yyywi>+To)1a(T3NQ}F-88cyzv)es6%5uSSWa&1ZQ4}Bv|QDa6E zDDKnCIlta_zSauWeeVjzKgNZj*h7s6UM%z4(QfU1y-#r^+;=+sBWwuMO1(R!mwn2x z`hkb_szwNB^a{#{p?cs{c<@hokAlAuM(;nXS$DlxQNH+%s+m>P>Ak0(tN026k<Uk~ zL)w2BKWs3h=&%sBtKs`+6$o11Q~lPi`mxS4H>%-IaY2diDF|^W{88ImifrZ!349-c z%7Euv3NzJ7?GI?XqOT46R~tBz$Hw`ke)RJ#GaeL7Tx|SshJ99om}fR(j$>>y@wFro zTRf*^g+5x$t$mB4RAj9M0DDD`z9lkOa4q_lC}00>Mnh-4e(G8ka1sm{#oF2|1lm5O zVVM@>%Qr~~?1c~yLiU*B^f`|Bfe`-yhY)*72<j=)(g`O<nG_|6w-h+c_c#pfO-mxK z8AJ*S=3t)@A?}#sp}N&65(I!~AA^a9DvNO@nayb>@EDvP8yy7CVvQlc@Q7>!A+Uh= zWDji?jEGX9(T2!l(BY$x(c{Jun9&Mvp;}8-C(lJj6(|>YYfd9G1iUIlRX?5Rt49Q+ zDqB&i9>=V2pXf@7+NG5E*&a*xs99CvOFsM)6>F6R(qd_w@e4bKfn0suD&n)SUPlfN z;&MGkIDG-fVvAKlLQ{^yM8QxM3N!B4iebA%)v~3iV2|zvYE?E9aXKG-L<v4E(z&Nl zWuO>8j^CN!lRgUC6mEsCD_;eij2IwIx<~SQ<gR_pNagqp5TU{`_!qeLaU}aT5g9SY z*lR(ve}l+~rJ9F^69pY?v#&cDeh=b?`(-@YH=c}qVWJpByXc6BhM9hFxd%uSyY2c! z>K0B7E;j_xb88fb9S~{%BT4b2Met;C*n~#=hnPTYvFy%XjG|VUaP*IJ76Qu`<p_hd zh}#rj%aL$k(X3Ei0*Hx|?Gi3*KZ0oOgJ#rKs4<_0>*+KG?k*8#Yk{^^Z?)Ip(!zf| zaM&WC{j+ne6zuDt+^dRqKS*~$U<omffzi;gL}@;GW}mDp{L5>)h(XrMb4nG9s}NXi zT>1yj2#`*3*`#?qbtitjjo4~Jh*KCbr7hA~)`Jwpz#YcBu?`LV6MsCYlf(xMKetZ@ z>SJEwfP~9dA^1lJ^`$cx5)zJ|JwsS6zSx)Y{F8vx)d#^yBumH0zT+pD*>M`a*!P!; zH6~2?18tXjKkGfNW4G7Po=D_3v^AAVsomNx5tSS*<FEpU2}HiB?Xo_AJF4*G-VIA6 z9+_C>liGUPh)5>txYuoHzYtT%J=diMG0JDPeWHyLN3^}&r6!Tf^V*1hKBdi}q{%`e zcw<zsN5<wB44gg>o4%u|z{C_jTz2lXSXmE3_GsiXe#}&Ho)$aHHz@~SpY(IU6Wr?o zyc|8Ox64OfE#$V+S1$cyw~Ej8&sw$#;w1u?0AK3!y;#oeBcn?30O9oUQv>gHjVb>= zZ2VfLh3}H7mP=r-{)vkAx}u;k@FWPRg)>LN@R?KpFeqnEg91XuDRI&EEmnmSJ2xpp z+mJyhLDl855MvLSE>eUyh+y7#M2tIk7Oi}XryDH)+9(NqKA@iXY6a|S-%E1TM@sEm zpg=`r;xkDrUbuQ(x4nKQoF`R4gf_GARns2bs_@7d#_J)yDMZ#|ZS_G?qGBytc1Uru z3O46jF__vbpj1J$DU??iD=j)!(XAGLtON@r_5j?N2s{H==}>m=j$yJ&N@pYwLYp0e zWlHTS&Y756BcyDvi4_&tsft80-|kcZ(NI?e7pI7Bkw`iLxE&8VR?v71gZ8LtkNve6 zVbCaQRTW^>pcuEnRir7Hi6&NtM_?O11-5#~Zz)WJIAm1;wF!{;anLC0*I<7wu9<*r zj~F-bL_AC1E@nU!?b~%QaK;|Yq=0Q@5PXadp%~qIZAr=NDAgHM9J_v$h$2C}K?%fT z6Bf>q>V#KwZqd*laqWT80;T9@qXD#(@jz+dfW%|Phds)9c-kU(?NjS5h0yj_1t2Uq zhV2q+E2I__+_6Ah0(psB=F9CABrcjDT#Mx;fmqy%RSgvM8^d(dx9a(3e$RrS$pwPL z_ix;jD?$|zZ0jyqebNT&D=gTR#WWK&47N&f$dZJ|Jm*SC8G0{(#Qw+a<AMy5it6~r z*Z)1*I)XGFQf`WYcD9|+Kaq=*K$bJ@fz0WX^!~wmmzS694a8!oQeHyo3|UNgTI7I= z9%b%}CiqA8ja~@s@_~HV<R@wNS7>lCcnG_}5){Q;SGItJ@Ohs)y{YxH*5%evv#af; z*6Z50wB6KpSvi}u9EW#c!!yllX+*1Z=+(^T=#ox)OQG3a8d5@NmOA#9Rw{LA$u6p; zRh%w0m3^Bh+qLIXt+O;rdQYeNGE_6@*d}SISuEWZ%X&ovS}d(~fB@|*t>8kitwMK6 z_n1b7T~-FNGLW2ySb9<Ctpr9;j8G^~jKN;RU_sMxQ=EoK8pVpG3Kk&%utlQQId#rT zPpp=1Q7L|uFAN8GDiILux?JithnJd*@lvO4l|nFHI@mR6yCOr`1rjxIAcx(a=>y@V z6sRRf#W|Ro#0Xd728mc+H?h&twMj>i^_>Ml1P2^ecD>Sg(8Y*O5C(E_DqSFU9Y<%r zk`W8X#N~2k<5EIeiD*?^n1=OheBGncSHxM+(mbr`#M(1OTri21jBaY{SYei{vE^}C zoW|>~(K<IQc*FWQtd7J=IZKPa>JXLnsSjUSDA;N~EP2CHI4xnaRd-^ptt0jI^>A1% zN*~2hVa|qBp|`jSRKid!u8n89gyLC8Q>YZ+Sz(9dk{b3ShgFkUQizp&z?D`lqC}+A z7V|Mww>tvm*}t(1$h43Ti#l=b%NbQ^C8R|qr6r5V=2~3Xx>p>*J6LN-9}h8!0hA3+ zO)PPdsW@hy=`QHu^TJ4Dq0w8=Q&??$cBG+WcVV=#u%Jtl^n95@DlCL{?L|qqV*14P zf~H?$VJdXA^;EdGutLxs5S3cmx=LS&=?%kPDrFVLl-|)f*TV}U=x(d595U0cH28w6 z^59z3RxGTsd`eY~wO*J?Qjd~AOErp81yY&|tNK+`S-80@oFkV?TgA$S;f9Hcn&P%0 zt!jcy{5B1cOOHLW6V+5=Td>l03d$aEx;jBLZ51uNc-5DL9^ETzN!#TGBO5ZU<tZqb zr|C^SY4_;?1=-j$erCIT`a+jJZ{)MYah8Hd|8e@D%L!8ll_DhksePO;Ne}V+b(oW3 z>LA7w>WoM9JoEQyT;@IWp*781G3O?^_#83e5K6I`0}_3r!Y2zf6JtLJU^1mG1k9b; zzph}1X$>Y0mQCg?pVzbCbD#5ND#Rc<M-qbO518@*nMVb~l;&jm6MHs|6DKv8b#uCX zE-uZ}lyT<5r*^x2{%v*+^1$xYbA$pXn+Zce4kmb_teJ~k<!q{g(Ewq<Nb;ekO_0ST zK}3;hl4dZoCgS3>8?uj4-W&ui`e%hD%;)8NsSqs9($7na^Fh~|=9*tkf>P$Cym?LG zDPvG*l(Oagh)R&Xf=fZscY2g6Z1Z7$WvX4xYr>ME+EZ9{{d5hL?7y1VM6@zROm}`5 zltc5ae60~+gh|6Xigp3_vmS7uL3){&tvkIyD=o*U`3|V~kBICj$lvZK7<4P+bQ{nL z;`s?xUPRL2ab8fN6Fw_PQ{}hzfe8zgSGhQIRP&0u>enH})v4*%0F)Yq2@p{_Z-BTP z5DvtN=Uf5(N<_{OC|E_lI>NG4WI?W`#|)E*S1e~=_9W_u8iwZA*f~4Rzr`Xwz`48- zN4ijXX@+W}VAEW;Aq7@0TmwB8UNX22S5UwnwhSv=PzK0EI#!P{db{w}%LJj>G_5gu z5w(;Ugyps`ziRWGu|)=(kyk_UCS`M)v>nObd;}RjVNJVDO_1r^l9#KZ9}yBLA$Wn7 z3Waf^ml_d2sfkWzMLnz!M?+~QR5^<+t<3N4!^S<uO$srbs?6NIc^Yb|sY8q)cz^`K z88(ATFo-pBpU9781r0|V9RnmMe?<9+B2Jb@ADbxm`Fp7KaEIvsKx{!1Pyw+d;9&?d zaCeP!kEFP#jNvHIgl|%w{D-jtaZsV3=?UK+eHc*O`I{b9Q1t+zKEi~k`Ehefe7Ttq zKidbSW^_?$;|orFc-nq^?uZXF1wJdSbNdFfzFL*On#32U_$U^iifU^M(@jAv`FN6k z_FW{a?;n!_jy``CzcfAgh;{nJlzljgO8pN<@p)$dD6@T7E5b^jm$pwd*+-?E$~Dx5 zWTD_A;6?<bIhzqY-)8Df|79%e<*m}P6x9HLfr!HJB9P+@>+6nDH1S*6_Vp;QgUAdU zmo8sBLD=#0+72d|{Qaxg)y$oSgF0ft_V#%x5>(M-E|m67ZbWTDwoH`Z!f+mX6c&U+ z;<N8>cZG*<P!;wOFjUNkzzhojlw;rYj%DJfvb**TGt2ExyKE_(G{X0+{M+3~->>*M znSF^oeWa_YdD6khuCD$6S5X3gDv2T+s#jU4hpe(~IJ3(YSv~W!ZZ=xa>ak3yTmDeJ z=c&{#Ra?bXsM1x(;H}Y>>g(UHTNKY!bVM1xZ>wO}3WFRls$^iYddrA`FgC+q2n$<; z1j$1g^$N>Z1*c`Wo|Qrho^Hgp!r-=4!|?>+0-wQkVnEb0WR)RpFC(<f96&c)Euh9& zg&0yzzyW$~BHsm34H6&;^ig(>3L2b35JUVDi1c&n4Xv)=v=>Pz#Abx+qG~Gv>;U5& zKDt)Hh1YZ<AR9<keMF}mjX@oID%^2Nbc{ch%S;r2bi-H)Rqz{B4NhH&t4P+*Nxy?4 z`d0#}nTkpk2_cdr-wF!|Ae0#*$KWy^Ridl(dBc6HuDq72mYMJw5O^#z;WI>j(BA9- z(xbURJtXqq5!ohuvqHD3nBwvq5>l66sIPKTm7*$GX@y`QJ}DOb$iOXbK)TyH8d#eu zxc-o1m6;stszqItfH|W4MMHuHu@llL(a}|~4fAjtjE!M7yUh`(m?%^Bnurj<k!u72 zjc{l(X(bA1cBG5HCDNQTH$LYKUBeBwB-uD9<VF*;#x5Ota}fHb=Px*#ri!_aygpnu zBK_9LO>aq-Mp@;yf?TO9X5tTN81)qINgOca!c`H}6Y8TBZdk=+BF(5CtPD|>s%ORE z3tdA~HyU3w9JdPBw0Lrvsi>zzRuH2}^}P(#5+D>O50NzMB9-dM>_)?--2uhL476CA zQ>?%tS)&PA5iebov{F+RHi91{IW|k6w&2oeO%muK(bDwi#wVe<qG^;a=Art6fYCPG zkd1c=IVHiIMdAs}W>D^(dKokYZMQgFl#tBiPR;@37<J+_B*bpZAnlobJJEHs{bJDA zAS0nSvAAgi+kJJiSZH$vMPdx`pmb$M&=j#%R0`&TZF`F~;nH<Qk@ot&##^HKl-ROh zN&@QJi7VADs;`q=pyg@Ra9oIvrm)tNx(yeCX-;HWGbpk@6Y#GIE=q9VN!M6Pk^wT5 zVN_I%;x+;izo&>RgPl4R39^vh%sNyvxhyD+4GklAS$TJvOv*g4QP=9X9PfEt8<Aye zTT22b=q+!`Mhb#rR8g1U`wlJh{wO;0#2O6I9?aFK3Jocwh9n3{gcu-_@2NbLtW5wA zm(ZK>SP5@NSV`1n8ctwiIDS|~nEA3%2xTx5h>1>uOYi?ea;A_bT(NaTj!pKU!}GX_ zSgF+fi|kuS0&z%hI`dJCk%8=}N=FEJw2_!in~SH3x0Z5OM<|9XH73!e%1MyX!s1{K zu$9??iwsI4tJVbQF|D!N07YOilTM}%8KRBgY)FWKo|;e^uaxvnUeL;-ngwfsHog%6 zuzQz>Fx~Ot*2)a=l1tZTZOkFLt108)1y@(NdQm)rGFn~CsLJRxGPNUFniLa`D=E;& zo@>BhEP4L&rVnKXx!-+2UvkxSpjb%Mzq8RzE~K;*frfUxj{Bgrry3m-4j4hgbm@%} zdV%R9@LmF#lIgwNUE@w5-xcCyRT2hp3#!4HcVk9{<FNF4))5$4tqXw~o(nwJFO<<` zs$7{Y#j_~ujlyYiBjel$mAAxVpl_>fLT!HpQHT_ismrC`9=)xg%jC>c=Kv~sD-lb> zkf{r-kriy9BWhKkP(@@K)y2rf*r4rTfbMcovG*A+!Pq46LDBbPoK8Q~!@M^+nq8DA z{iU}i<;Jm!VVhTmE6wF2qT`suZ6kTfC<_GcLhvCc1k)<K%Yi_w%h;}DBfyAllbW=b zwT9Nj0iC6`)FZkLME<;$E%Wex8b?mhpcVwb0G@NCK0J+@8fX~K-~-Z9b8;(KWAcKD zI2v?5AY>WCVDR#cZ4+UJ#$2N*6E-6?luxP=gEsOMnN9?N`o`tME9mME_LmR!gn|<2 zF<HCQ;e)zrxz^2=5_Qq>JK?T~WUKQs01T@`Wv5yDfs1!#^i&G(BTe@0bFEt^wW|6` z>dK|{M}{KM>d1h+2S_)vhQ?&$Zfzhk6{T0lNE~ary@2jgl1p9>*+t*(k{CEVmq*eM zqD4}!ZAJv1vnZOZEzk%DMj-Bxd+M_=&$f4^CYjV*xxaC>H3f;LSI}?UPrIby{`e~S zI3#91Q?(>971d>^-xkHep>Jt$g02~YVQ21Ee7s+`Zqdz#QqlHOd*g_^x9%OPlAi)* z>J7y#<y^DgV|lh@uR2%>uEA{|BxrO&H7FHZ^`c2D^#k4_K}{jX?a39YJGURqrs^*L z<@`#5E(i#=5r8TI)U58?2EhRdn*Aq_=)I2-9+^s1m}Eff10H&eG`xl+=MP024)aZp z6Q#P{Iaq9QjUfeh>KXCq(OQ*H9XE~$58*AE$J0p~NtM}My3)V@j1_eYE?Bw;C->`8 zMHSH#8cWHeV;88=2QbkNZg<cLzL~%5A%aE$snI356jB%YI1F?fJ!#*7lbmeG0<PH4 zn-Q7b92pX$38_9N)W4T-mIgXCuK?}wNth4pow8-%qL~48*%LhYr6~8+1CX?6><oG4 z(QK0&No@La35?zdz!I#6>QLPh#ZuqbyVOCC2k}nRoS=(4jy}AJ_!tPfC=cZbGd<`s zL=H$wsvEqB#%>m!5VW7T<L<@OV8v3;0O!%T0FIHA?tGEAm0vcJMC?2Xl29ZQr>u>0 zRSH8tPje|zmWPpW1EGuN(Tpx{5vXfUo86KMsQV8XMmX+bt2lT_&vGW;+HHuenJgR8 zIy-QHh^g(4A=xP6Yxz*p+cs3iUTpbrC5bx<rSDT>Kjb3<3N_Qn2TXq3BZyv|gf+S{ zUWGQ)Z?y|cO1ztGcyHpa(6x+A(};;iBu3+dGoV4UTSt;P7Rt|T)v(}z(K+y7!-pI+ zSHxm1I<i&Q10rZOv%{1rj=#YMDDJ+8hT(=wn$#T$p*-mWb@%<AV@HM2c$^qW2d3-S zNb%d7{<8!Gd-wC796tQfNAJD35kwDu{2qL#7U<mj0|dWYNPVz9kgR7f=X2|wZWR@M zquKT&`(TXL1IeqmA9>9LmHd+Pzv$x?P(FF&HH7Go#IPfC3L+x%4?SwUN%VA0*2oQq zKZK+R|5k-+{r;SEq!yo5dO2N(L93%-AR@%c2wuRw`2z@h^8o@tV+X?s!!Upn>e8b{ zmvjVyR$P82hgeiqf#*XzE9o5zmJ@wbd@^oSTFb*t$gN`G{L}Q4tw5uT+dC2HrI(~k ze4-hjL8;<$(Yi%rhVHT49l5a$#$#$7gBBp%HjEPrm$7E_Y})mGwdu)xPWci>8vP-| z^bi_3^)n#xPLrJJEPE-xZjh4|-}-WX0#KH_mJ=lyV3#I)X!hH8RHA$vSP4mbEJU+L zM&8Wjy3)@_le$y!wu$iFA(-&pIZ+ly%xSoUDYZuFMwB@j(@Zi|Iuz@b5NGVhsge{G z>UVfuXBjox!y2Sw#e3QJj6&NjBi2XZu47@uM!NRc)A|a~dUu|j&|0GrEFuI+xedCG zqxoVV@SSYP3#OZ@J}zvdKTIbznF>-}euLeLPvM0v%@LH@tYOF0si^06NAvUh-#UCo zVHfY#>zl8i7i`xg`{XroNGA2ZZyVi{&kBSOt2FrCm4E7m=~sV0|0!lBlY4&tyg#FZ zX7TxaenGWHRa(sY15Qi=KsXvU6Q^^VyebMC3`1;WkJ_TroDugNkuTGE(Pssja)V_5 zI^YkMl7jJ9rt86oK{rg$9~-$2C^H&{TPEySQ+2O5Adc~cb7D`rokmF2ukZfF4(Cg% zoCeU?sZrsD(5Vs7>W{vX!6z~EKr+(JExu0CsoR!IRD@IMhPLGLYz&(OC;268l<U~Y zKqnPL>Fh{8L&4`1<g>|$cU>nx;!@{sD0M?d49T&nNhl9Kl<kt8;98J*%+RHiJHWpB z_xVkek=IXmv%fbZ^Cn>}(sehemwF%X>Ye%IT_V?UVCM8Dz^KFhGj+U4dF?7q@`>8P ztu01s;*1i90tT*8OEB2A;X?oMQrqVNu+e$bN`G96fc+N0h)}C=YT{gta*ax5lGC3X z1Z7lnoMTW4S(0~Iec|IhyuVvRb=$ax12;C#g+Z0U>vF&$Py$Eh&qE`>3>XtRfa6)x zklKfY(I3=Ea6%BrZ#sHEq;3ue0((dDW2FA;m-GC?`sOQV*4HP$n$7cTdxZV@*+b9W z(3ilV^vR2Pe&xL@$94Y5Nqu|c%&(x)Jp5zFROs67s{Uu$whMWF>0?<&w)4iJT{q_% zA7}3<bm?G~-TM6ON0$1mJ|p(u%&7A7H$D=CLpSI0xfil`g!AH+2_+tSGjD92Jf>3D z_hj{V1p3mI$vTDW+2#`hc4m8(ealG8MH*5P8QyB$LVYB~7$wa<BO6QzVdF2{;QVMT z2uc#S=h=`^P)$x$B{`0Xz=`%`VWumu3lZMvy{LOk#@6md=}8QZL&KIgel?*q?@O@g zc7H0w3Zko(_2<s+z?4R^-A~J^Rf<8kPj>qar;lz^&y6zigK54m-XeXCG&l+M+nwob z`!ieX^@mSPrW$LUA5peEwxeX~0~y&*JMTUL<dSAGD0}8h?PH<TS3-^5X~KByyWJV~ z^gMfw5|89xX<ub`U(dhFHqXzlukVwwDO7Dsy}qZLul_L0woCDs6tOnDKHIMT@X~xE ze;#OJ<F!WPiX7qAdbUl6%ZkO-;AoFR`Gzhk0P?vk+byW|J@%QeyJX~coxLv%v-$q) z(;{E7RRbyoy#4DfhBj|($vzc2fz0;g$LiU3ftB?)b_xo~iVHlP41y+^hDyjsB)NY3 z>c;!T8*QFY^&b%Ujip&w8UncCxR1blA>4sKbxj%wEE}QX6ogJ`cp9@+pNgC)4`dG) z$FfY6N-f#r<u*aXi`h`YMna5t9lEKm{$_bVTBxh+73-s|*FwT7J*h7>3@^S!@xFuO z$v$NS#>c>e&>16XG@A_DtXrXh;;0Z%_U4j63~ya5!^&-2!xKr6nj-*~{*~<}48iy` zn=!CF8)Z{SWo&NdK()RyLl#t}Plo-<#N#iiF`@!p#=D=`9dH;q(m2-3{>_p6QhjrN zeSP-ZH{@Dw=C4b?jeKrrb~-<uWf$_<iEQ$0E{nU+xIU3RsJ&GAUp&2E9`I)4^(;G+ zUtM3{dZ95ZE7b>+f0JF!^Yf2Ccr$+!8<X(&=o`B`vr~U3aCIfrv$Od@RTfpR05+@Z z+rw8Le<=H{K!TrpLq=|YwY#APaUnOX4D}-*;HZ|duhD{EAXfcwfieJ0CUs%TF-Ko! zgQ11jw~0OV6mG2U8~bB->#owxHl5CrP51KT6UlmOci-8=Ddgv}-<R|CN6Tk1#P2>T zQ-dam8j$FQ<|fS@qb%m-@_-E@ANs@Z(Kv9c%wrH#aWZ_m<)voWX;$v;0vGAMIrffr z9}aJHvo)K-{(AkbjqVL;eceotPOsPyX?;~ZTi^Qrrpf9tSQ0DBXQT|Ej)fz+M739r zu-OxVS1V*ENnDx1jwZuFMC&(zf7<L;WShbp5+x3wd#R)HX6hM^N^!C-fL7VJub^F7 z*A}c|w*FY2?-8@RWIL02{(_Lp!6}bhmDN{eiJO&LWq-X(LoXTE^$nR^(&hD{M|tkR zWII~~@^%Ji7+3vNKD!$#Z`qSyQ%UfwcftNAK-9H}F+<D@ryLtzQ>Gh<QeBrGYC_b} zhasvI@Zfq!n+&ni%vHSSp{2PRaZb1jAB9=ZBHlcYG(pBXWUwBx2R?xMjB}a&=k@IK zV*O`jvEhwk{d+}uGQ+Ii*0(ISW!krQWD~8Ai}Kw|<<eyKURj>#Wq(=UxKx&NTkD^d zit9h{Xy@!)YohgKM(X^wiIv^c*UH8wbuz+h`dnX~%iam0v$LMPQ-y!GZBnpbU0gre z)>_){UJcF3?2uNCu1|Chhj65xYuV>biy@p{ue15d&ZO7PCfj89vLDooXJKi7c-~l> ztUe0iX!bBw>XUaFkSzNkgw}jLdtZR7?0>6Ic0Lc`SRJ@$>h+63c4YhYo!7GWi^=TT zAtO*oz6ftqtJ^_vvMG?&oez<(40TQ)3V3c-{7$$7zTjxzA_V8MtJK7h{ZWnjq~u$_ zY<!^(7rS`<T$%q1vyv~w2DY+!zA>rOmt?M+=W|XUoX=nNhCEF1@5xM+p~{%Fc8uzd z=3i)-bfxin9hXOssTMROGZm6O^z(d3eeO+}nkvzyy_C<Wdwl(Dng5NU7bGt!*b@Ty zV4lCCnqP=-8McVF@wqahxu$s+=5ZB(Wrk!fj8p82qu)hPz_R@I0Fz5i`a56+sEaoq z{Fx*GmOY}N{j*isf2}I||6Tdm&11!L=gvJ>zW8{t_mOhzRB>Wr>fz_g59?>j4Ud=Q z&P(OFsp4JBf7vMi!K2epep(*gSGHc7D-TS_M8BLU&t;E(zWuZE$b>%la(%XZS13fE zjJ3-Cr*p;5aCrT>YQv6ja$?6ub**)Eep^G>c{QBhQN6n(ys)*}tLwcpRsDtV>DGte zU;j>c?1k{z)`_rfNBFR=y4yl{X{K5)@3gxxc2AUe&D*odO7+UR>ii)*CLnjd^hH(Q z5e`3mvCxvgFKi7jSJ}VYDx3Nw?0xu9{hjd39bxCATUBJ|#MW&7QnnEGZ3=IN!(iDO ziWerH35OoO(q4~L>$^*Q;GbKo%LG+ytdGDYXr0|zKNr?JOZ8o%J?a+!;A5bbN9a$v z$nQQTbCfZi&hu06(P?8=^03(8=3FM5)w!>g1Km<(|4JsSZe3|vc1qvxe{W8HSfw;r z%wF=2TQ(|}t(%}buhOaeU=ho$?^%UeD?z>J)8{nm)Qu2W%yy5J*`J-x8wOD%G&E>+ z-|C20%WPj4WrF*yJ&l|AV<e#+ZtxbTh`n4MW|~HELorlBIdC2<;3!p9bq3SvDTA3Z zKGvtA%_w6`kxzbDSPQIk7vkNP-z@ljP^kaU#fQaHoul1-pO@FJmG3@UZ2i34pz@y; z>$8bs@1w<2*&BtPBp>{|ysmuXK^^ynx$@kZ@*q9<L~$+49x2Xd^;a&;m**x{71y(u zl~rZ`tGlPHey(-2;(YH+0JhYe?XT3OK9wDiUG(0b4mYlc_a?*6?Da}Uph4)9CohF< zSj$AU^{6aVb(LLLEo3r$=Cp2^&J^n0Zm&P4YWvIe*^?)z@;`D_)n($@zN&73A^I^j zmi6V^_3eWD#AH=|TGxQK_@tg4s-CD8&m8C+t#sQ9l4tALCpv#sn*@8trD+ZDwj+^= zQrV?~nvPWKzvq-~gEA40r0w6m&R^B#4CU~oW8G{#r!M{adiA(Maj9>${|ojsIiK%Q zsiW$z)iLXarM_*xp*FzpNlUmS%bd&`zg3Dxi0iQ{l~S7!boK3+r4nAU>plO>t(Lrc z_Sh-SHmJNB3|>{{c)LJ44J2HbNWYDv7Un4xVSNLj>A5%ULm<+~E#6`HGYm!s;w#Op zYsPBXWP`h1gwX3-I*|N!L5VgSk#3Y^#WV^vbstsWYklC6Vb{Wfx7IxfrO<zWq{|(^ zzpq~{yY=&BvFY=2|66Zvl?flkgzI0(C??8%j~3hNugTY8!mq#e))vUtSgO480Ve!L z_GWqT(Nd%RN6T|{Qj2pFYsxd(YcgS4;J-($+4|~?x=ShhwSfuCcFmGy4!yT$!W#z; zY?;*E%>J^zH5{zJ9%c>%-QFC?<a||EW%uFV_Tzj<ioF8;z4`&nP2@~g)*|+YnS(OV z|G|pYKN0-`W{`D%F657ij)PWcTQ+er+^GA0Yq)&#jbibrQ@C%kdLqk?_3E-=A<?~# zA^Qsva8S5np-;q(fJ>%I_?BQpTy~&>cKiebHI69Yh&uH8pFQ$<&fNzCS`8RCWLq^9 zphK3S{I`1;f?mz%c0VT<D?_`UpA}!n8uJ@Ow{Ym@+A6$4Uw%r?a=xJo^4bPn-t|r! zpUMh7Rrf{Ti8h>NQySOrY|K5(Efd29L;1J5AreT94C?il2d-C`&j{m}`P_yGp216E zM3ngGz=s1d-YJF<VHT<ygH%wx4~64!!QG}0c~>JhipOUvcwjH?uXW(cV`E9f4-Y`6 zUD)k+$o@+J94fEW-z#s{pDPb#8z*F`&y~~JZ#VwF++Y8^+&ob{5iNJBJXGH}@z5#V zF8$zix$o2R!h7YyJ7sxrqBxh;A1%&ll%dp%6aS}15U-U7R8nG}42L&9vlyP(rF-J( zuz5$A$)0|AYj|Tv=*as$fhpE|2X_Q;`?YST4%JUq8a8a(RQ(al-K7EPOxWx$dp%q} zhui&L{o$(EnLYZ+r03L6Sf$Bt(*UaaOW~_Sp{=pOAG3{*R@uLu3`gr47N4v(2=bG= z>Zhyq+jnK!*B8Q}O(AT1VSq;C=Qp-C+wukf>^U_pYaZe7qgy6k5E~-JV0YGw5>@(^ zQZ{W3`*(!)dQpu3aBpQ=(~aBFeD2!yYgPW;<B~VFE0dW&uSYo7UUoxTsgApzJ<H3E ze|`g-)9Cc-mzQ&H;SISSDb1<t|K9ai>W8(yf$s1zHyNQQlXsWx#yc`>w_&4(zY!dj z_$te8=4aGwE(n31iheoa1u$Dc{!7uI^oyheZdW5>W<UcV*{+69n2;G7L#Why-|EyE zg)(YPmFYRZJx&i}e1<$eaMSY;cd-lvD9_U$`COYS(Irkb&Hx+Z7Ww05?z3e)%?Dp1 zqKFR_ek<esZE+~e{;1DJ9+dm#<nAZ3qxv4;etF<0ve&xn>zxC2CI8KVN6U)>|5{Pb z_lhTG%kqkD)Xe=Br|Yk25Zo=Fxve;j`^Bs^SSZ7an@?uhbQMPTXY~)NaQ74Sn<1QU z%ZBAO<>z{D*FUVnUmW22bzNT!%@;ygD%zaU^Q-P%``yWEEF<(^T+v>SJDzS;;f~@l z+_oz2qEhFv+Zmqp>e&ZH=XkLm(03hFok@M@NVjtoDm(kCF!EvcY87tP)3s?i=0)9h z%~au^85#k<9`q4))6UElOxPcwjkMRR(Cu&3vk%M8R~lle<V*<R4n4jQPZv5yywT<{ z_h@Oj{!x+t+s1j_+Gp8gy0gy?>KWwu{SD3d`W@Gv{Hp3~J9+WS!JYYWY3X@AJ8#Ur z5+gzmRQcbX->+4xbZ;ihzxsN91vkr+^H1~7C6EiczY-|jU}+~Ld+q?BCGfaCKf6&j zsI{I}Y#~urcCgA<8^n5D$!oXjMh|GeyP@<s!2-HWc8?Ib1GFh$<4ZT+CKliOMQpP; zQEpP*m12);RLYC=8-W{YdX6Cbbz@EszlkZc=U6<4um_@12!g6HH>hoko_p2?8cGzD zjaxSMvNanSAY>c27)?EU9RJXkjahc%F#V*`RUq5)C}g#>l@C3hJ+#F_Hkewc+gz(6 z24Sl(uArukUeu2YjH-NhVxvIRH$IwWI*TP~ymTs}gXc<?f^5q2EFTLix~yu$0+% z>zUA>!?Hv!%xF~bxLoX=Dzi~@37)v+Av!V%$Cws6L&TL)4x-*0KreV0V)?*5+jik> z9NJ=!nzw9}^*yQ`9hyOdLyyJi*@HTsPG#BVryrMPKJ!p|+fjqU<2Hb-XTN^tsnqGN z-u(10H5`5BA<6!+XPyymcV;oF#YwFDz)!4>KJ>)XzvQO-v1gue?IR4q&}jZ?!C0$w z>gXqczkd2D9sE{5&PArFAM#_TiwLb}xT$#uykoqu!7SzQi*8COz=;u*{HfBpWg>in zF@S_&J9_^91hqTg_`Ev?efyY}M}x8eiK>3xYK%N|VZ!cYu#Uca_uD$b_6ZXor8rSO z#K3~}uOAkh`nuG(B0IoUFjxF-Jh`bK*KH)zt|X96dY(VDkFxO*!!}TO4+0|qk1X1~ zDkz0q^4oZ7lZf{ArT38lw0fWMmPx8E1glGEGhGqGc8_Ve{groqc@*Dbun;)3fNIU2 zORqh#?F)M-%5{H;#p7q@sl1MzST!)j9?Y!+wc$OG%itc_pJF>RP6G_DffXYny?bPr zK9$mOjWS~>v+-G39)P;Qk&*0Hgz)l*iCz~_<FmAG)5tMCFiNj9g4gYn*K8s?Iza{= z#udjbm_y0!PBO^rx`exA32@^ZO*on#z<IY13wA_gC8{_FKwqq2B?-o2o9LSlCN5h1 z#UfdwGY(^Dk|$yUqhaUN@8ud?w8L9eYS3i-=1_&91lbtrx^@|PTB@sQ^NAh1HY&iz z3gc@SiI_Cvv{@Q*sKl50Ld9z?HCz#Oe4giJzH~7>lehtTddjS{q$rC76(?q(Zh%N> z$T}WTCy?goTvHA`s*=3eh*O{A!cHo8$^q9$Y%-<Q^gRrkXvFbXl#7WDl{&g*I!bCo zPvD{uQx{$^+6!nAJ}o7NSV}v1DPkhMogi^1*4wyab369QJBW0PL2}C`kX(?AH}x;T z+7q&itni>jw>V@onZDR5N@wi743J$+v5!bms)k%3XI<aWV9ElG>H?X-K}^+$25DZ~ zOF>UxC&=B9Xdvut>iM<+s8F`;$jOttEbtoJL7um4erx*V$>|+r;|8HTdIPTmZ?r-k z$j5X^TC~o@60I4igrFfZ6yZT)V1Ndhk~dY4q;yh1SDI|n<VpYKGg!2S@68>l84d{I zC2E9#NbJQG5F5n)t7g1?Z}VH3JDvXH7N|4z#EC!?iC1<Rd*mb90z4tN(f_!Iu#4D- zA}K6TEy|RXT)sP)h$Y!F5WVTSH$f<Ft7}2;AY58r(;heou=D9(Za{xR=pz04qf-|= zIZ*+2<}Ybt8&<X7s4e6<qJ<J!j($4v#^KC^$i)$?yQlB=z#Ezv;vpAq-OALm0pqW` zI7+%7cLT}h2MxGXJUPxl|1FD8H8N>^0}epqgBTeKm}ty2IB#9?J}y~?P!Fn>HegI- zpeKt4;<afoc$l1^S%kcb`2Zk#CteYvD{?=GbX1~gy(KJS-B5#hq@f=5WB<{M<VlgJ z%k=32i@|fajW|y@aAy|nWWcHBb{~x>wMp~=hdvlK(TOT&$PIuGhfsn6nrq0*`@qc| z2tc#`!*S|a|L&ct?>!Nrxg4w~D9j4t5E2<Cn*$vo95w~+riPT_%k(kS8K#o)rmFqE z08-<}3|#8Q0@DHBEh7M$8EQ!G#cpoQnOb6$va{>6+U|m^%K<l_Fviq}`b(jy$sk+2 zPW%J}oF_~;Jb3lNl(l};lY)diWZHt2F=qHoqYe0KB!}J)=8R@SdvZG_j**(Fx-LER z7mWS(;DKt;>54I>cnfirrzmDOlH~ABA*cw;0GJQmNvW9h2diPXoj2zs>tz8hN#Pvr zJ1b5xmnn4OcH<$!)4}^GZ{uQ!cR8$IQcc7;?+#Iw;+y9LvY1x8$st*EmqDe1yCs}W z{~Zo4Vn5*xm{Mj|UmI&g58)nb`3TaKY4nRg=iM#HTfRW!GhJ3bgt(0)mzb%^#`RW$ zU^K2`o97_ysJhW@U{X9<(hV|{K6rx@o#H_#l5Vt;*5ZJ4nNJ{x5k0ELj#A{FW5*(` z#|5Yw2DabtqUm#;Xq;&``#v;$-3qu&9kwLY^N}E?R>-ya3v6DAf;x*hoTeCX*^gy5 zU=SQLoMsb&AOc4@Zo!Cv?D*v!U0R0U#>KJ_;fCz~$8h)Kttf<nW0!PKdNctNxQQp! zLS&dtys6<mPRT2Jpd>R$rf~A8RB}IxmaO%;ZL8E;6PY2Be3kv@c5bXYi@NrcNIud8 zy3Gsq6#!2E!i>w8YuY>P_(*^=H+785qqvRsfdTPmTSDdl-HXT9CL*aE0L0CMH6hFa zdDF+kGfIih6B__AvHxaRP{rMw;jvvDd->>@UKTCIn->o`sAT1Eja#rcYmI9kpu3xg zGaHHvSyZdjhY0Y63v|I|F;2VbPy`Kn3HcyrJ<<jhZYROM$&|!r93vb!^*7;Ys2~c) znJLSFxRCsQBQg&Q_5~8^xYQ_>9^~jfspttnO{*Z!%RvzGfDm#yx?`i=t6Mh2eL(;= z#_%Vh=w?QVu^&b%&LcySWUR7FqyT^5O5))<4Mg16(6wn)kj5w;1&RHph$kr=@JTNY z!5izc(Y6}1OC6QE<@9})dp|t8Q%I}CRnirc21wV6T$ID<Yu}9_g7W@0Ia4gPqfZ!p zk4kPyoHzvSqfrAnz7mnN6T#tjle=~iahGP|iEqs@27p3WnU7%mqlpM50X5&|5BU7k zZ+y#u7<Bhw$Yf2QI6Mhk{7#o4@YdJ&QOLzE(#SMfncqaX$=jQX#<4)7%Jls;H>mUu z1U#e{v5+;6Bi*gKa>17R{AGA4=!&xDA~_0~r0z<KBiL)kOzcSe9c}-;6{i=spdxNK zaa4iH038+CD{z9%Iq=P+xn)N|_XkY_W27)PkKXK+Lsg8$NXCDe)FE2`v_QdyW15;v zCB6;V_ckhE0-%mtXMB&x44j=6^?_N^Nitx(8|Iuwn4Bj8CsRvx{`AHFeru9pL=E{s zZ4GTgfcY$iS2iBgjgpUlbaR7KFtNFhg(kXpGhug|#zK1R5PQ77!l=H?CZ!p?22B82 z!iCE;N-CLQCq8NWdR!xgtspA$`37s*Vg#r@d=okD$RHK#qlk--A`EIknabd%Xp06H zdX~2+-fD?&WswCV?it;K`1m5)DB0d|$4WF&gyzIrI}j;8?7L|cI2GJ##nELVl!Pb| z9cZh|Qm7R(K`}7<|ChZtdy?z8^Zly3(O9^M;v#7@R~paNSdO{Z4u@wVd|$2|j&S(F zZ?@y!2m8hUM>RDLYcvltk|QK^R|5pNQ~_KY07a3+LJHg|k>CoFV0VKQ!3`imfyB~V zb#3Pye?Q+}=BcJeGcn-^hhH33r_MQ<zx?g_%RHH<GHaQ_!+;~(u(0je?#ESFitaUS zNO};>T9J;-Ww>3$r+Ac0>dTKI;K)sb+{xY)?j3)oQg*iIMt&3r%9SBEN;Xd2iwvgh zsdkQ94O<*4SHYwQ{$6Pjqik+rkTyI4B}K~`&K8}Jdc?@}AiN<(#=1|39*ra#ur!>c z$dcVENRIyg>np0VTLSwC^x2Mp{RzCU!q9sR_;-Dz-3i!@pwuo1?A1`P(E}f)vikrS z%Gl%~3dE)ad4qzr$l4GTdo1)afoY@g?gm$cCGv!SoxK*)9u#Z`!4?S9v17y-C6vX5 zl1Uryj!=283b>1XDq>fQQLw;93afERsi7nqnE$kOLMbKGTp=kuL4JsCVta@rC|fzO z|3gyO)m*Mfn`Wp;Z0ZpEJ+O&G(yIu-UhDzk;<1wiJ59h~6o@mlyGh&LX2Sf&P8q;P z+WLB2=UpTak{v73J{hHUzX&l9XIzXcj;lIi`w2uI<y|TAP8YDt4jAxN*#6eGk_+nx zq#;aFZ4r(XyHs@7wKqi+#q@FH%`UR*C1c}dzFgCZOKhR9b`Gg&bd`aBbafyl0+5z0 zyrN5z)*w6f3fmWRO@(Jr4q?F*GKD5#3}(N6SFGP=Pou0p;fgwi=LHXF;Y%G5AH<#` zhA`#6D1(+QP=as}u?srSrrKOz>NYm7bf-4E-OVp_`C+%v@2ZYRy5;6qI<M*YSVzA* zsjYpuThVd3dsV+99anU8b!e}c&Chiv9UN=g7lvO--LI=rccQy_K^LFtAgixqn2rs= zx|h1_8^yjzoGb4gr7gcUr`V~8<ZDXa)Oo`jLTUFRWwIsIAa-+#-IE5r*c(Y38F{a$ zA-g&WHg-z#K2g5k5Tb70gNluxz&6c^J&(3~kEEVTvB#CZBzg~}UT@Msa3~2Pk-d}H zT#2M!=B5|>V+BI;zhOMF`4Sk}21?tAsT^07H~r0Cp&PW|EuXyGR^At@WT&h2>8n6& z@uUshNDG`*y@3^K+-7Fk@yfe7L5O2$?V>zy@kAnfMqM9B;uno^z@X8XtBe75*;<NR z?N4TWv27IG-vA2n6qvNZnqXpgEy{r-REF44!CF~?qy*+LOL&BLtqOEK@r-Obt@duL zsaON-(53Cbx^J#+yt$r`hC{@bTOs(SN@GT_K(^7ta<O$-SfcEG>+6WKEO3LXAOqLQ z144wsR)@l7pl^hZLqxELBElh2A~|e|mNz{MmD=0ZReDtKe?|tiLEHv5+bbzWVuxn0 z=)B#^=qW92{1q04W;S5$UZB#hfU=Q%Th{>fLXg-yYyyw0db?oL#KM=54E|7N74R4} zIhBmlXREQyo#>jCQ6%CVQfW4gYpD{b?|C=0FtR*Pt^{Ih8e(gS&4D&=TyK5U@2}6V zu=^tWPqG{2uz!>HVjT204lOJ^{Hb?a+&)-4w6?mi#{P+HaT$9o-T)vwJbL@a!l_;5 zva#h9yFYs4MQ`mGdt6c&8r(%5McJSdq#%zS9fz@ZXO~?v%LH9%|HpvQ?v#-qn_dP- z2;dzd!BGxw%Z$NBuqaYJQ-@wZQ)p;^QWDsrGPb$|Yp^*=+i;Q+TWV(Ji~h|ZwP?bt zkFJp+%Q0fdPY6e1lqS2>R-a_)Q+kih@h+Bm&rc*^M^2=z2Af;hNjSmQQ<gR+44Jc8 zP(0;0(AHT0?57DU-TsZ)Xt0opgJ58cJItD;i9JhQP@2^apzHG=3~(2a4YF;tnJ7Df z#%84Jhu**P>%*}x=*FS7^+Ri+0k%pFCi4!g*%3lW@;DlUmAq9dx5IjWQthWGBBi$- zh0#!J6}y!BZrx197N;l(9hBZ<72-vI7kt`QR;xC4M0fq<j{zT;)4r+(&NhOZyxXX^ zZpA>TG(195`4g@Md)}%vydrj14bKQ?(=L;812}>M{RFd7Mz?AISNS<=!Lx81SB5Ga zH@pHuJ2MVlb8l8`l5i4IZ9X{FR-J>ir>)Yeq+k@3w#yAJ?N$(lOm-&Z^`@{YWe?8I z9bVbT8!?k*52h#@qJ4k8^|3^i@BD7Qb@!#gM*Hnn>-`h0gX{gXt=4af{=dGui6;8% z3m5wD9oqQl(88}S57rN@%ZvIiEi7CR!Yy?wss~<&%X7fE4Wu-<Ms-M#t3>2SC5T`o zZ3maRvWF>iQM8xTf`5~212ob$y5XBiyXZ!{jtXBEnZiZ?`Y^ApY!<a6tbqIt_2rn8 z%QjMlPu0p>^@6Kw<5K4f$t1iWvBreA8te=bN*D``ui4z_iT!%17I<itES17+s47$# zx}Y9l$_<@2OgyxbtGN}Y%1Y2(8N0gi1({*e(z+mWt-?XTfV+V&;$8ShY)P!Wy8n|= zw{`F1zj~y#_El?X_*`qSKHvK4*K^N&HUGQIbH87ozo@Oh-+4^iRexvm(1%|gdg|)J z2g6qm4>u2O=zC@1%4Rq3!p+Xw?DIVp`(1a1e4F>hW~=V2Y1?kL2iNZQ-W8jzzO}cy zw#e4@<AxmX3eFDN<PS$X>#eoD3AsyvMf<Jm7vh8QX6RjSfF2xG!%1zw9Yoj`eYMUT zC8Wact;ollrgIg0j)SA8+-bJ(W|#6xyMBAq^%47hn_d5~nRnh)JXFB$<KFKZ!M8_w zVGTh<V0c-`;EiqA*8(Zqn-_68(Ej5n4!W^VcrgMKcU>K!ny>Bu9-8U8NT7y&X~_E7 z)E@O{37x^)X!Ha9ZnmCz@4YjvwYT;Rhnua7-PX$R<N4w6t`Fa69esT6car$~FFXkk zo9dRl++RAZoz4$^8Ft@1^vm~>dC(ZjsYHVFrVeBqN{VWvZQXMwyV7rAy-W^4a@b4T z%_B7)QKZZ;1ttV+kPHaPE~vFjJCa?|0SxjcUnsLGt){>af?~J}8ezWhMamkg9PJ=W zpK;3AF#&^c-gjPtC7Hns6N!H~i4E)v>wS|9C}xx3Fo6ruIBGVjK&TSnZt#_>0*V<V zu~BN;qaMv5c_5OLrB5nd<gMyq0g0)XP)Oc9u6)vGF)E8{^gk4v^Pi4JgVy?M^CMk< zwmH91oZmAl?)vD>)~6qTtbd4)MsNI5|1K|j3!m!x%;93xJM_io!bb0q{z-6p;rUTf z$fFCfsbe7cN_dAwL+KooI<~8zFepD=39bwlrj)Gjgz{BTr@l@*fQ}+cQC*3`qv9rK zkmc-=uryM>#et1U0S`ylB>*51wAB5LpaE@sOYt`-wviUxh*970lk~&o4KAi1f2u+( zlN=X9ESFIEN=cH=pOP{O6=%3aJXu^c<4{Bk+Ub60hBvfj7BcuKwD~;vuS*c5pkKry zI~cM_3sgrwzhf2Pk&;uNUc$bUa(o5Z5N^1UrF2*7s8FKHkXnp(P>>G<Z}laBE**D$ zT_amECMH*9g_Piea0ngOMe&zqQ5L<{NBWuH_^NfjINciPs<^PHDDM3D%G~>fwx=)3 z-yM=aP4*W)D~p@2EL<!W4-NW<y83QhE#5dH|5BqjRYJR%6!<_1I+YVbu0)aaQ54%C zS881q?ONVYUZWgFIjPaNByA|W(pggKQBOsLq33&GOh&d=rqGwBXBvipy3{5(t{^Oz z=1SVtZ7F)toCaw?%JJfcM6RTHlc$8aE0a86q_{L0B?M+}U^-+Rm&`JkNoEX#KwIQ3 zi|yd?v5m9na0kzsdx~s#9=wTKDF{w32qe0KY?MgaF+`Om0%gD05oMqty8a*yjE2=h zTMg;FQY!ec<9d?zs;&!l0eAIU=gYD`-z`s<t((vL>calAyzArgz1Cdo6IuPT+VIK2 zp)ZQ^o68Fehc1?bL%qSF%}Wc17CwBnoGlyL{_-LHepybG)n#40p<`3W6&+udzt`_o zUp1;1%Su;^IzBHaCF(#|7t2ddT`ea@o2%udnm-En%ZcG;x18t=U(rsV0C$zz(Re{1 z|5E3t%O98b>rBq2@^|`uLS4y5wNXw~<=5vR{^fU*+Lo>y@2$t?eC6U4JJETky24w| zX_Gm2>|>+3-lDb`TpVblxws!>;A&~RHlyRq9)Xp1w)3ua<C5j#&EyA6Y<351ATq_E zQ7r8MN+03z?s}ZOnO`K2bX&rPezzw?>~~j)CVK;tWJ)B(hJNsxw@74@JnzBheesqS zhu&%rWH2s9mRyWY3ah2-jLB^4o=k037^K-d&<Vh455TmupLYW^mXY`1lY+&sck?sf zkY}GqHUwN0@hT$;tdKQ#v8N)q!NB%{2r&{-u46kvaCw_SaOs2IF{t+@6n5_pDXR4* zhp{o_4c3wAOIdlVz@aF!38IcfENwejq`d^or6~%cCDe|JfgYM6_}-OKV!7}KQc^kC zNV*rE#idPq5-E+Pf4RT@e+T(NHC0|cePXyUb!g$xp{omxL#2)t9U~pXg~@7mu9%&e zo1LEBd;g1HX}eyPxU#go_ENR$^74|FpwaKz)#~@8F0I{N?e^A#=c<X}8-s;uAyv33 zglba<XV7<jT^;Hz?5t*I=lmJXPCT!jL$6iazc}&_Ki_lY^m;XQyxDwDbU0NNzox@Q zrt@JnIeNx8uO+<DfySyN%Dh*z<=o`#FGuWD+jy;PRx=aLzZ3qan$2^<	`Onwj~~ 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 M|5POKyOQ|70W0g)Z~y=R literal 0 HcmV?d00001 diff --git a/docs/intro/_images/admin04t.png b/docs/intro/_images/admin04t.png new file mode 100644 index 0000000000000000000000000000000000000000..a2ec8bb893c63075a9415019ccd75b589491f8ea GIT binary patch literal 22806 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 literal 0 HcmV?d00001 diff --git a/docs/intro/_images/admin05.png b/docs/intro/_images/admin05.png new file mode 100644 index 0000000000000000000000000000000000000000..b424393f562edc16cb22c5b5f7edd00ced2bc961 GIT binary patch literal 28875 zcmbrmbx@p5^e*@!!JXjl?(PsExVsY^26xvGLU4C?ch}&--7UDg>m}ds?jLt+Yip~v ztES(X>NBV9bobNeIWwV(@)C$}xNrafAWBJ!DFXob!^itq81Rq$D_T6`#{<@0Qp*Vd z;L-oRz<|_rYyd#!w-gmsRJ5>jwsW$uvnQ4k6(zQJv@^4`HU$9p<q8cC?%9odA-jRa zK|$AnSRb6{M3?A{6Y_AJ5zPViI|@~5rRlHY`I7Jj;?%GhwBo3yk0x@#Vu_ez_sBj^ z{9WhgkFTBY-V;Ro9vKTA`<YH>9TQIHV4DOa(-u>*0E%ctQJY;|&*RhMwkC7{`eFe3 zB(W5E{}lb&YWn7T{M>>+0JJMpeF%GXEq3y$n~n_7@b%8ylel5N`Td^sd3^yx;Q&w& zHu^9DV(i*b0We`^noLY&e=)$Hm?lsXN_ZMfIO6P39uT$y0QAmKJTL&gHna@@;w0gs zpoM<`lP{{Q!EoKY(EglcAp<c0vlSprIT&LEFiQZ@1}rQ!CcruwkS&%wwGHNu2PV9} zFhSIm!s>z8js3~r_Zb<B213ybPx#9ok^H5gKMd+->#)#jEgv!9Z)ngLd}sjy06nIk zx>*Md>FI!K!cU9TM$Epdtk`(_V962yp;#Q+L1@=Kyoe|87T2M5ZTIafkPIZVr|2o7 z(zi_&X;#%W)FC@~Z|QFBb;Dc_U6fwqT<gGb!+OF!8bSn1k$zT6)l7G97Yj70RZVrq zWYnS5aqU_adF<7Zr%qQYS1eWPESxT0F5%1;tgQL9KN&kWKXo}RH&Zt0XH;#QZ!OEt zQ|B@(yPR(1F!(F1dgiH+;hnQpFDs~Uo1}<|QNGe;#bY&3Ak#h6OX7L;zV`w8v>5gQ zR}zL7dlkJ$)RBS+(Fb)L^_!H`&+;(bDAa82LCUGhGf%vbUxQST6qw{|GMRF_GHfzM zr;HN^qxgSP7uh=8Y&VSVl*g^k2EbGa7eqR}bHM+IN{6_>$wg{nE)lHxjy^ZPhjz#1 z8%ayemK4v#v&Byj)&8vOb9{%3a*9mA+;3o{)}T?hYoXQ&Y9sg1y7@J!)~UVDTM43H z@YOS@GU#OSb9$P;IPLsl?#7FomU@&{wcg=;t~>JQIYb9paL9ILCUaTDPtr%s2Y*fK zgw)x%jVg21J@s)kN21w$@38`FspHIN+UJ^ysGar*8CQ|$;qB?r@Dk-R;wjC}jtChm z(mhH#Qa)ntP28{O{cOekT5LK0a_303*ZC=Y*K6;7t?m<%uHcog_ic&$xSPI-uSL#I z-FfcNR(Db^MUv^+?pf6mT_Roh+%u@;*z-7S!>UW-Rq>7Gy3Ud8A?c>7DO?W$3PAsr zLKJL@Dh6M3Rqaq)S7T@Iz5O!E(f<lH(>pVuGokUvPnTGNS&AC2O=VH-JFyjcAyXw~ z4owM30h7&-x)_!uj(C+Mjg{QO?A)Ik$|?h82W4op__ID7)TuNN{1vRHP#IXQ@K4@Q ztv?9AmJDFYLCGzR-i*3w&1#RMsaE7!S1whqEG_QyA@Er86t&&7gxVpy*<FaWr*}j> zg+I_d&$zC_Xu`82EEB9suM($3ql=z@XOOT^Bqd{#@CjGShU!b4)SvmZ#lIbfmPuYi z!B>DU?-S3N@@9FzAD%F3r?qkavOE|&mOvIw*J^O(?@joY?a-+f@Jh1K+ZhZd5g0Zk zK^E0dSd@{S70ytYI4R$sj>Lzqd!)1HI$x;U_2o6)vtZd{7k*exdJYb27qr9p#~`td z)JH8>y<Gk#b;u>h^9_%m%ft4YtrM61#$Qk$XDEBvDn?fbNU6PQs`S3Qc&v1-p!fZ6 zq{Is0HX)OXt6PHWAb*WF?Tho<QeLLYgt0z~Cxw^Bv!}j#r}U8<PBek0$C`j9@8{=% zD~64gslR1phk35X-p0LtYMo*D3)lwf7U}$~7%Vn|Wc+OJZ+}lpkY}Sfv&4ja(%ZQF zEWYiVM@$G|@^#_s!Re~&>pywAQMk?7$eGxfbX?)>^1VGjMR^I;aa#L+^X)L~v(6Nn z!M!Fuq8l;4;XmeI;eW;+WHuLCP&vbtB~ak86Er{*((0B%Vd^8R4?jikB#mXjCH{eB zj!G0?94i}L8?zTf*su1dZwPlJXIFp3U^zBtv!J-Jukc2{MWx{DZM1g#6A~hw9Af)- z%(nT|yL$PoGl-7kCsQboAE95xjH%)(bQ}sTX2k2ju2(Pz>Cr2wA&Edbc%nMNHl(if zu4Q*b`0L!RJRIB_ZSl=}EfgOna(`!k#eS)Lop|^A$?=)x(dYKP+L(0nbo{M5Gdptg zxi2x=Y#Q<Eak8D+(_Qg9fjFBo{VxtH3QyX?C{LlrNcEOu@>gM9M{lt&hPg7aTD4}s zWJ?WkX>E93*Ut8F?%AqL2sYwcxU924jkZXfSby|Zg!~Ly&rg4^zl;a&i7p^5d`=|% z!!*n<&G%LC%%$fp-?qj(bdn}f#XvzJ3y1cUrp@op%0sKa#)&84aNn2-rOdmu$)LW9 zrG?xJhcQaG#jPPfQGef4Zku=S>5I=qgbdfUUH|%>#bjGhN8LR4^z5{*E7vw*O|ZS6 z44usJPEcgy(cKBsmgtOxQItB-y{o#*u3M6zr5EpI_@(Yiuu_$u!PCgJhTiLS6$O-D z$khfv9ws&{q0N)brrzGe!XJT|<dm>FTcSt7j?AiO?<<)p$0h04<x#iQiA@6>1gP%4 z6==YJ9-3MTxFCSGuL7rD1r)cyyXS#s2MBjuuxWjmp#*&4a=3S2A;2GY(H}Wqm|*lb zdM*jpc&}*kS8fy=a)8I5os=k<Jf%GuiA~^}nQ^1>xcQlAXwFcv=jWjQgkAm-u6n#D zR=QsaLr?y4KWvCr=-b%51VXSSI0x~Ikj?p$I5lv%=-j~XAqOyKdh&)<dPauv2KmPK z2Nrs&h7Cx&Nu!CG84gGmDZgWtc3&AgRd0OH3*HEQ2yI7MqkIy!F4GKZ?sTvFo+8$k zpJ7rJUo~6Lu9q4>7abGZLIYyrV@#rCqBiL2w;753Qj?pqm9HF78*>#t466p3Gi|WC z6-Gpj&>!P(kHEBOurNQ;JY+p?Jl;Lv!;!>c#bLxo#BEAjUDY=AT%{l6|3f+*Ytj(6 z`OU`M*c8+`)-&F--t#RjFD<UisTh9DB}?b>&hy?j%7Lj*XKHYX>rd6RAG5!CkpnT! zfxA7QLrT6R5&{F#aj39LqxhcqZQq4*hcTT+)?uQ<<E0<P5#=sLRDNmEsY2FR^*H^= zQ_X^xfl8#a?Z8`;#~!pD79@TmH9j@33;oXb)jv@bE=6q8853~vQCT2v16A=(3pc6l zUz>A8F7OK*8_BI4^UN#Fj!9+Wm2(9QjbztK;^t2Gi){1z5BeKP5>IVVQ+6=Dk9lP0 zpDCw{pw`R07hf$Me}B82X5E)wU7mGY$-2i5AIpNY_eU8D666-4J_&G|1S3N6?L!C^ z8IA#?w58-L)GZtwJsGVW?H}EyR#T-djT8S)5m<l|A)+#wQ9fMmQJ%H9x@cP?Q*&<q z-t%{2s=s7V>rekgLlh{1Fa4R}W6}rm2AxtgBJbIWm^OSn4PHWDWWYZMIQ%9EtP0ls zo@r=PW7AXE6F~|^>L%tQcHCFrR~ZTl<&sX8a+c(kMw0v_#UNR<z34!}O3R9D(qXc{ z<G5R}lh){Nr=>=%&aQ;7KCG;+>YEc={!8UlIZP!<>3m^mes(Io2Me@hX=A~4py;ye z5^@uHz=vmusE$Y#o{7tqth?&D%sxRs$G=QEG(Bj=_j`PKcA#6`Ev+)6vm-O8B(EYa zt*%QZ8T3o%_np<fdX&fnhn*A=-3E3S+PgUzJ>O-3pvZHO9V(S%ph??gc=gi-&M#eZ zmQsGta9UJ6v9jd`lp=zx*b8RZxRVU!RNjorE<Ubp)5M$1gATc+Ri3`p*4K^ebmVpF zYN2{1O_k5?vNsQPanI5S@)hZp)Om??YNP7<UD2vGN@VtjuL)iaRFxF-A*;^q6@C(B zQrnfbVU}ffcrCqGG3rH{Tnlj#=EoCQo<i*}%kNIn*Aa`=XT=i+mfHz&Rc4BHtwecy zwhZMyEPCs8SB`p*e6Qy3S=alJ-xL8d`(T)%AG8PGJs`tSqPg>Nag5Q-u8e5SaE;Xs zBh7uoV}&VlpfnM*XeaRx*l+kjkjIcZ%q!T>@^>teD3O-(aQmbhXjnmf$U*(8R~A?G zSGM~Zdn;p1Lk3iv^vq0}<R--Ifea|?wER?#BJ5(a`qsiP)!#G7Ngsu2MVH}1dR&I_ zW7bHD$eTzvYIgI##FL7^mfeUyrVNYE30Q$0nc>!^j;78$*j8wt8f6Hye)D8}(m||8 zKn$0SV30j&dP+tc%N<2$xYNq4Zk24dT(e~}eEx%E%Cwcee{lGD-+Oj9@%X~EzO7Os z+B`?233&^2m~^;-LtH;Y!%SAp;!Yx#B1WkZGX8^3OiU#;PjM=fWxv?KGP14oFx<WC zdm;JMPJVonW$WQC&cW!<^7W3^=V2%2meA*r>qY`=x(mU2bxqZLC+8dYJ*lNFiK5)` zpGl1w6l(UFAYLLZ3e7dOI2Wz=VO^U!4#$qGh+v%tM4E`mF=e+T?aZciOBu^7pM$Fd zeX7pmEA*10LC?tv6@B{q#}4mxJ8nfm7*SulO60t+?O!J%BRb-UkdwLDJ>0A;Ja;=b z%a5SLq8PJQ_jUI(u<!-bn5_JMGdR%u=$}1nHz`+3Yt?D*>k&P>-g+G&KWFs_NpKDO zx-eq{X|HGiV2@&yXMD&_70B`8MnTE@_Z+(&=oUwGaQFoH0tXQ?H`R}03g4BiPyMzj zSf`dz0dfGPa26&I9<T=^R{rL!b1!EgMiG0k2?bySCLrp$k!`MX;jku0Xy8MZn0<WD zPEe4eXJ-HYMb|U14GS28ARf#!B3SdQ+K@zQc*{V(ipD+Nf&?^y{46xPb66k{7?P;| zL^?@=|3!o#-5;1YgjW#`xe#jPk_986_B)ZQK>8*O$xHr)x=-ZuC_rEoNbPm#|16M) zCn*d~s`zepp>aWUA@m-OPK=pLg86p2ILl4^ijxE27`<~5i7m-QwV)<yqNN#~5CkX- zTjt#;s#B}P;|#;tQ`1W$%qq1~i^fw7<C_Lfi{c1mwXxk(jhl^;_|ZCkw}1(T%oe3q ze6JXPPeHW4TL%COegA30j|29$zTB^i>N4lgB>;Ta)P~DIBSej=%b&^>owL7Fjs1Zu zj~B(|?*|4yFHzD)&sp(txrQ_skrM%c#p7H2&!r!qiH#+d<p97Y833Fj0buJ90Dh!= zT&aTqU{)Rg*xCUA-^2JX5j_AHK1zv+sJbtothwo`EW8U{XbgQPM-dh_2@Qn!jG^QZ z=5ij~pnh6w1oE>2>41dh)rDLwbQYR!^VD^k)OC)t&sw2rn{kGfQKE4q!B?Yq);EZx zlE3lL9z8!E^itkux=eKZ@o_q9;cAao(C|n30z<MRZX&KH3`6oA1<v_j{)Kw-Uk;Na z9P+RDJ2=6={Qp+?iT9rf$>)RrL=>~H`D+%srrI7N0D)V`59zCPwAs|2l`3~fx}b5z zMzKN70#g{Wt?z#*cBeyc>V9A>Vf>mWj4|m%(c50jwbx~Wg8Gw?=E@SK8aNv9SnU;h z)HyaR6Ic}UMq^1lM*LCPTZAxGb6%l}O5@R0D4B;t5=It2YRbCIt-xzoKh#+i7R6*h zCNx0Nz9qqs9m6-%QlM@}R&Ly<xN)N(1z`#GuTgf8yu1R){(=inn}{Tk=@~tn>zXU8 zOMra^FP+~spYKH!064d&qv?}1s9nO(i@r!qXseDc1SaLxdTt%+y|B{_V!}C^vZ>1u zQI*$g%KN0reGCo%U_fMyI?dZ|`{IlI*_KYTW8hafcNaQr-}y^n*lbh<gRK`*=g^;V zK}C!rk!KDv!>u$#ZYpo=(^#;YG(gK=79ES4^e4`=kFoSPgCKxuzB*^!F1U`wRY#<T zx*>Z$MtWiRUcOW02LD-n-k>~z0-~Bpi@A1kLYxZ20l4Y!QIR-RU*AcCMuYRi*N=D7 zt6`P8&tk#FLWRCyMc;W}`liQQN$j@p<`!PsLI5vZhME;obF^6$JZ*ON^?ET#w#hKC zG^lL78S#_WeAjt{fMV~%*9bXq0PFOZ#ux{tBq?Dv2DFf@jee5S)gyBRf&1q6n_L_6 zT_`jXy?YZI85B?kGC#pe=e#Yg%Q9QKFfuJaeP3a!98uShMz-JnQ996IoWB_`aftYG z?M2}C^Y1N=CUZvzCLq>NXMS|!UAEy@Ba}_Uuwl#8J9?x>?{E055Xq-_s;;3SpI|mS zJ?FBN_MP1%UGl9Ta{s45=pYATu0W%pT;~B@lu%4PV@}V84nE}T%Ac4jLEkLfSodGL zdV1bsLkq>{`<Nxb&$T@T3m?mgOXH)Y8ZPUOWuGb0YHJ<UfiR*2)fjIn+=Zg%1Q=Fm z2x7>^udM2{MipSdy03T!zciqq^MffGr*FR1m+ZP$Im4A2tb1VDkjm(kcfaCD_YT$d zQpra^mHF0=1Zc*3y-L)E1Jpl#;^*VD5i*vJSw|g$+|+NsWk?_ZF5uuE(D*tsoG$Av zm(BR_D#G`*tnJ6-0%b18EoqG-T5!3SSvpPuVDES2G$#|y>o{0D_*IkV<>`sEgxDfd z$CX(DcZKX8Sal5ciCB4GWSQz07actspRAl=E^rs19+$4;XTmRpGe^u#u39#61|Z+n zvwK)Xv(tMQ-^o~v!`7u?SJnD!g`VE?I{A(PrQ14Nm$>Ic0`j;OiR)tLkb)zd?Pw#u zaI?K{QlUmwheLJs7tfUTsxFYayAgzCXI+`k;ND$h4NWojLHF;+>(H_2L}zccCu3*% zHi7GB>d|v-m%SPY=%fur0fm4P`in&@fqMq6N2m2XtgV?DKRtujWB7AbZa==pm%|Pb zUsJN>(Y*o?SFVGB(0lpCHq(B{pQV{5V*pnR&YAuur+w}1(Fg7Q>9qGJl(U$?xV6e# z!DnAOqM%v*b8r)IPXG#g|6nIy1}P)jmWN3dB08ZwrNnu=E`R}nk5MiC+6d)r!{%P5 zeXhJZ-FLjaM-3SU%yu2S;j?h)Ls1rn1iOES?G)&d0AH({n<F`m>#Herw&u$WZa*p_ zF)Mv)=F0ELQ!eF>cjy%pnX!r*snzltD;gl;mTSa@3EVL$cEW(c!gx?SIZuUty?*8_ z3i_mpXurPZM@EK77O2B9<g}zGHcL?5^OEPDl0J5%R_kG8<mzKVOnmad0ak@(4uWR9 z0Y@D82n>HASB_stx!N4r*c7oXGW2Vxg*9)Mc`si`W+|dIy5=~NRF=a%on0bU#D}^h zD#BIBiW>yR1?z2WH?aLfGUyyxckT#wxN-C}d3-_xL?Cd<{?N`tRNG(b=Dq9=37Ak5 zy?Y5getCFtdbC+hi^Q8Ve(0m2)@|b#xew>kS#^BR6$$lwz4|7m!~o*B1ogt73$9<R zbQ3?nG_PPNtlQ!V671LvEww*YMcjw!66is>IxEZqqyj;)v9U=vz42<g;1^-X%ONPh zmz-)5d^QErNfz`PPPH!cSc)>4i2&TrT1eY@H77W(*NMN#6u?Q;=X*S5dRO|(AeZot z#tZ^Lm&e4d&z+hscq0qlj>z)tXc`iF3|9I9{!a4UQ--X19%_YbY5HDRPA=B6jn@&V z#E&sxryT$6<5a2}VX73llSXvH2oAh|f$Nf!fq=6X)MikC0z~v-+sl<!u*^7g^muTp zhPuHn;M6;+>h*l$s^&G-kVFv@&tT|K@r)aIPk-VLm$+#xIJCh$VjVE{fr20id@d&2 z8VG>J6&J|dWxhX(_Ai2-NEWaCbdli1RFsx4g>ZRf0?$vrtdrtU!19<(mG!9jL?^>O zqH`=TiTT>{I6nc)JA`NR-p58+TCKxH1-n>G<_5p~aObj}S8TXctMm6Lb(qUfgwOh6 zbYkTLW|{u}VPN~35>{ip^24PO-G598S30DyapL-S#|b|)mQdQNrA!@Eh&ySeyM%R3 zFq(9F)5NvNRxi6wQe?!VXT#O=d0vzygWoyUzNz_6DXXJX)Y{NSr-|l!r|$^5?ac|F z^SUq*EKqSZG3NJ@t_YcJz7ddxU`+wx-!mq&U`Kzs!BKVno5*h^8Ga!<2M_Ao-c}d- z4nvdQGzBGXlMWXVEP|3mBu4$=%7WbY+<McIHyDk)eScJg_ALg$(P%tk<MSuur=O$a z9XfyfA4dLu^E0D=v5!Wu;Cfoi^VwQAAiV!W)$6nC4e+=z$*<Xa$v-v-t>N)xkK};d zY!kY_q%nNfcPW>jYGc8xq3Y^+5VM!C+q|e+;arFI4__UPkYEE7h6L6HpwE~LvKK)% z!I=8$YASZ`BxHhzrwslgDkdlvab~`5<X~#N`PO3jyLSq${ToB4%S$>y{yP8dd*hm- zS_OP#R;Q3}bkgT;#F-1J0*X64OvH(muE#h@wIZ;*q?;P8yVFMdhKpY04O@&3w=%&Y z<sz4`sPS{01014GjuUI!cQ7(RkA58>=<7(x{MJE0uwebrmV;@Hj@2+}mFH$gy6#(X zvE~<#C>Qex)lo2NS#+%<2wTJZo~-qW$K$Y32!oya8kF5^W|1d}f}efv19LbNT`v#$ zwPA`8!_YqqV3mjU3Wm`z0br#SM`z95+(xcc(U44r#PVBeKKl=pYp`tQm90IEvgL}( ztx0hZfRcbfnBuf~o&IU9?4`r>FtWPm^KsbiDk{gCmim5W<+Cg56%)4;9dh+CNz>6L zom59kMSz?aQ(1t`=}qWTlXohEcmL&Rp^Q%wCCp2z&qn2{#9Gl(PXME=>~wj5(%u`I zn>@q=yB_x>&8_ojaf`;AH!=RR?aCV<2A;B5XvcN9Zcs@ezs-weJ(nVt_AH~^8L@UD zKVO{lQrm@mNzAxAf}!EtSsuH%5^<V$0c*>XSC=7Nw%jg2Q*pv(NwKZNVS6?WUW(^7 z8;n9NrXG<G9!8Oj)?~32^^%MqBy1~G+2(@i=a6DRPAEqo!)`M_U$oy7AXrk=D>3$Z zIsrXzyg{%)<gYN)6Ht+y>{N&O&U&9Dy3Y<kvUc`8Xrh)hNRncK`Ad?buiT&RHQy&? zgv=liKqDQEt|mW^w0Pq+{msDti(Y$yan6?Jd)Rgp-(59$e`+mz=;f8Z+IgK+M!PXi zu$*f#_EzReeB1Mvrz>5~|7~wKZf37C-G#hBDGbSY2V;IfbXt-;Aq)t!X;gGKtvuDm z74bRn4GzxGZUv_aq0eBz`RS?7Sgj0SR<b~4qHlM;Gvg(}u;{>uho*yv?bV<h5>J4Q zma^Dr&X;!Db@KA~B~?N=i|5pues*`pAv)>if~oA8alKWb6T7&TT%hIWMr9onG5-7# z`pef29XJx(sjeDw`L*0s`MT4kakJ|}q0X*M_^Qln{Y&{b^Yh|QZA|-`gd??!A(*O8 zx>^T`sdbv%7qkRybDrtK5(_gy6=teG(=ZZWMGPX6@^XlKpKeSo3;S1sXyxrIAH#J_ zzNsdZIe+Wp=Kp5n5nq}}dB}jFS;VQKr@Vnyx^%RYc2%Nty5(2__}d-Ka@ie&WCcd5 zRw9e_2wGbOz2c&a<S^o%QPlOkI4_&_8MEA@jr{Et<0{Y8r!<^GTvP!V?1L`LUv1#_ z_Vj#_Aui59@>trmU5SeZ+AOU0jokta^~0fICfstC+p4)C`n3E{G?;EeO$QgfFMl&Z zxWbQ9t?_iQOZSNWNF4D7w%>V}_+tpzT6Z-KKmeSCR21;ZKiSxgbKU)6_i`1Es3`<_ zz{l;n*9LhSME^UT+h^!%aYA7aY;x|^D84aYjgN@<v?wT)w%B(a^>?>me#TgJq#W4X zo}5zCthff+G+KSaI|?f@xhT*ZfRVO9VRF`zh?wtPf7X-mUDGMV{i8eFo-^^npEfrw zBG6#`(YwkGKCtBMt9Q2|f=PZUws1z016>o$ay>&+GOS%V42S}n7)?zVG{2#o#(=5+ zm@0z>y=S{uQA(ya=PfE-im6!;jCo8jUqcgpH}m_M*5)j6q!4EQOGx$?g)`k2C*v=B zS<j4x;1M<z46_L-nGgt`&k^U(oW9Xz5T%S$1TCp#7guLHi@6o;J2|)vD;%JemI|@7 z=+*pXdA@4bm4W1XNDj}&d#Gt&UQdI9u~mDLu^V$Ay{GD5Z*zni32g<5YgUKdb?&PC ze`GWuLQ3@jf49r@<}2R&Ex~d8?v1Xw%On%RZiWjw_Q+2Qp_7aBqQ_?Vwy98PP>)Hf zQr$ds{?kg3UP0hMx$Q>7=Z?8ma+QGUq(r*vPSjDA=oI=#lLj%{s%Lv|Un=wY@if@) zJ6224QZ|pr&147-XJJpy93+Tjvn_AY1hZ{42%m&ZJ|7WcQ##wieP(DY5Otyx#`9ni zkg@nw9m<k0zHa?^Zv=~MIFdy(HiO*!W!o*b(ph&#TJsLt1aTKa_`N3Jns>!wx;AQc z7U}d<)w4yX$QX=U<HadLiKUb`sk`_WzzuKpYMls0V@on7KDy@BkG3Gq65t_&xP0{X z6ZLAu#|L|qK)F?nm|n&J+vCzRQ4u&mHxAcPxe|s2rXBNi18d79$>t;O<U2ht4V9JP znKq<BBc}wu95$88?)_z`0%_M(c2)fSfA7}l>+O&CgLN>!($HdA<OC<iVlYE>v%6q` z3tAmT*V>s}dlQQ^xRjiS8<amf%TD;NJ=uWvn5`bQ)DkE(a<`H-TIK!J7)M$zPqmUL z$O6sUIEPytl$Z_;^olT2iv*Vbh%pyOSi&98gs4R_jyxBq+LpL9sq<Wjxxg76dFM_i zwK<ZowZChxLl58uvhED<g%4l5vaE-UDzH>KPBlh@`Rf}r9mVIi^#haNG}oWOo`em| zlr-<SiA0xZv@Bn4VJr9jzhGTQ_qGLb7y(ef^<)GLWa8i|*n#dl0ux&1YU9665Xt7x z0t5$T*XUsW+BCY(^Ul33amA~b6Z_>L`kXrgB@oZ;xz!h3sJk5kMBr6)mtj*o5DIX- z>S=(98iwf0Z0yII5L|U{A<kRfQ2eXp;XjtIkzoTy#MBanZC<$xc4r5z1A)!grw4A+ zSD`&1Rhl>vx^um8X|Py#Vn)a%!P2eY7M*F%kO+VWQ2*6u0p5KX%x-Ktt&@F%yCfJ8 zBh?vx&ns`0s^LkPRP5e08l^Srzm4oiT?2I>yPFiyJuuM}L;w~}fJQCyt*;{YqS(v- zHDBZPUlX{9Y8-mtHWn79=89Hozu8XC3rgb?x*$h;F7Mg#dl_%<&Q2p?sYw@2SpXmq zkE}+FBj=khkGKU{acyIKKc^03J3kSYodwcbaXXQnUgsmq%inKRU5CaH-Rfr#dqbJ8 zyNNoWf2Oh4oCMp<;MuVPf`GEcKD9ilJmT$ZcM}tUuCM>J4ApcAps}f{9oM?t;vVPd zw_5Jox#6(e?wDG_I&N2$J+A9F{^7DUXmQo(wcBA};_*H5Ma)pArDcKl{^*^aH9?vm z+w4k@eq|x@NF-xRL{wfy)arnd3+8`2z-4!xvnv17&&b&}!~MZR|F2dyPw<7zYMgd? z!73(K5HXnjM)BSk9`Y7~y7+P{leFZ1nARF!=bWW_ae?yA4XS6Gz^|hV$b>0;i|o~K zHN`jaqXrH`X0Jn}HFaiVAr!DY>Q`U2xp1I~&+1RbW%}pm$*0aNenY=`)|8pOuI7S6 zn46EOSt}ES<Pydd&>~a??=@^)JJyNe(2lPZK>}CeSkmDJ3+e!|5$2c)5%njp_t>my z{vP$~V@3Inw${c|(j5aw3f`zgn>5@aNc-K$SdV_j?XR2wIk}J5vgbP8seC&)!17na zOqXrri=pmZTmO1DroZj}w9K&)nqMbv221O9=oElp{@(glgo&cozT2&MXI?((_{h1Y zy$IhYoz5W;N^xX1-nYjnAiCnBW_5+A=-%@9>MM||7qa>F&KSD3#4>zTE|)Efb2zFc zv9m(E2U6UzppO?IO&e!8`Sg-LT^bSWeoxrY#06M5#`>*Szfb5A-#<)f;EiDm9QIiN z6z1>Cw?&we+>fW0{q5_ocTjf_$r&;Wlsl9LLx)RlH~BV(Tj*+?XS=xSHX-RRclAc= zblal@S1Zs93<V2?>75hdKBlXom9T7XgUr4G@JXZ7WeJZ^Q{S~j73jIOTV0o<ki(bM zSQ3|Y$JS{$%EQQ}S;y4{jOs&YG_thc%(7_CJNf$Kx%T(b6PwP?=~&|E8ZMrp)#6HQ z@wN6SGw1VW+B{AB#?lS_Ive_tcyvgN?5$?}?Dj<fWu_1&xyhwpv<ogSLT2BeMggEN zz0(`s-UXy$37g%DQiXu@Iis~Wkn^z-_xIBSM2q6?{JJF$>i&eQ%Q25<k3O-17I+%( z{kQ%+_~ji-_&c5AaigYqqyg>K3T+u^{T5@h<({sxw8CEaM`!Ud1I*sR9r^1jXCl-p zVh!)7^pm73g_SyUS6@Y9hQ`dtARE@n{e(cCHCZy!W!+;4F891AOjy9DbnPGl?L4wn zP4pK$`U&L;vz`VgW59sfkz>mxjnjuKK;Z|7-$oNGE6H=tR^0XSsYZNRb;V(Ca(Jcc zV&pIG;Pk^1F}IJ{rRc4a>X;mOv)czPc)>zsgL{0M<gxvX3Cljumb5~drlZ+8wmq=l zJ~gdqFTrA&WZ7)`d$e5Mwb^IVQa>KUzcAp_J6Al-nDVi@hU~;xYU<2H!>aWLeOf}- zAEs2}cL(EmyJW`w%eRL=9&yuO9$gl#;CEH6Tt9q1NgYy>L1dUuL*;NB%Lo;_YFaJY zYKSsNT5m;JHx@)bHb#&8_dkOLS;=>fh%ujs7QgEf02&e?ODTuI)-yF##=kXf{R0w| zL&It%R=NjA7Vr_YqB`fX@Su@h+9nYxr62Rjgs?5*C@W7tf1%H|!ht|GPPcx3ul4z4 zZ>?7%VhyJk4lXrV0aL}G%*Ssv!I;uc^-@C&;1_%K_l3<xvO0!>L^>xZ9&JI_ZKv8V zT>_*!`)F!QF@`yeIZ=5o{U>TkvrZBk%UF?-(`X3=r==appo+?6+ma7e$owM`;vL`_ zypFJn6+~L$XvZxw)^cv2M;3*tFdtvaqzQqRj+_W^Da)5p2~XVLZ7OvV&9%YzCzRGP z@kB|tPF#zyU<BuP5Wc4dNDUlPwssbIo51?1iEofQRN>F-I`dQO=0I=X@Y*YiFUFt- z@t3lc_Q8##<>3-@4fHR=l|)Nb>C4pKPTmk6S63qho5NW0R^GOt7naj56}@Y{upb<( z9W*>`UMop490SHzkrMlEuf~T8$BqUEg5`Ei{F#G@&fsmIk>X+R^e~)>;)Qx7-t*sn z-k%k}*}3%w%W$IJLrP<RMNqs2l|tLwWL*cQ@jn%#efWzR7l&<hT8Ah|O~}<-Y{ss* zf7yJ~lPJ>9we`S{dhYH{tblLxuwQFUSzqroyf$G}gVE&UJKY3Z{=J*HOS$N)poB#7 zJ$gSxx}r6=QerhWrYzUiQZqpQfkb>}y`QnM9C*RQGU@8$PkD}r%QIb}2%ML@X;fAR z4&Xl}krwc69h#Z_;|FGY(bMuo{}Bb#latu6AJ6|!Ji`Ab8JIp14m!-j|Kk)qSRgV2 z1Hq3z{nOeWeK3vjPnW(XxL}q-$3L1P8jEeRrZ!jPKU$(aIdh+SFq_ARmnAQMHH_*f z!_Ua}l%g_;$lTEfnHUGFJE;a?jr^(47QZxkB|n-KEur@MQ(kKR#dLwMecrr0Y3Si@ z+jL6BEErN#==E!Y$*bGat=GT;Y1+b9s5_9YF-c0J{c*vL*6&VR&+9PHV4K#Pj+H2$ zTc3uu5Xc`VqB_V{D@eE)2jB;`Cu^CzD?9>sU(fyTB93$^HR4^l)K_ZjHsW9iQ-0cX zZA{@A@ZAxzHJ7AUGJi}S$*uZ~R0^2%&4ih-2)r}Fvd5g42pJy6=^{avISXo5m49_l zm?tW)$MRo&X-+^?#1m67`b`m9I4MIBsG?+rC2yE8U^RJbu~ZRjMe>*IgSIYED1`V9 zM)rlO<8lBm?uQpK7cFC4r0PdqJE$;L`V45v=s$<Q<d(NN$lT{sgGpkr=_4aJqhyoY z^)G)%60k<bmr@E8a+HN`JHSgjKghO!JUVqHBsJ;pqhEf{#<sx0zp%_2C=frK{ltsM zhu0a5En@{DYe2uXC|gX@S5*Xm?VwH2R&*46xvFXk0}yBk!b%%Sb3&TdDvoJn-J){C zoq-{_2?@UbUK7OjHPdFO9SVaE@5@A}3nbj>kqy`%?QGCU6j%pf+>IwJ+>6(DIlZ`> z<29$Dkv0;}4$imCUn6B#Q+ktP;eq;-cPo2zDXomwn+rXSl?Z}8k^si*;mj~>p3*q6 zBoB*;1WFs+waE57=+yet6|TwNueK0?bq-o}P0VDB^oJ?&OJ}Q`>S=h>fi^e)4p~dk zRUiR*kQ=`y_V+i^ny3mUE;gmWrtzRB-ZxsyHeQNA=+!O3k7-exy@wrhMNE|&=u7!Q z@3n_L?>bJes=v<0zFJ=23At~ty^&n429H$!cy0-I<_M<o2rWWdb;w|@DU(Ym4GVLT zwLMEDd$b2l)l<7z%}GD1^LKyLne^d<f4_B|nmvT@8j`s}AQkMQ=dRO?iPLb>?MfMO zU05A)0xcA74xFBl#;>+fU7V8bi-PYx_0OL5ikezdMTrf#z*<;C<Vdt>v_3W0{4saS zY=5hE3TqSyv^x*8hb5e@OUa86<6gw>*`?BxW`rTU{*k3x#`%-(hIs_z2%bkUYa&Fx z${4PD|N4>F2Q|*?wXuF9Sy9Pz_V-V87CEXWH?*E;FRKOE0XBDMe{{WO(vPJ{D8g_p z)t<(AHZ_pv1s%2SD-XaE3$P$s@Kbi{14@IwzDPq|nK{rz2oL9DN6X_=g`#}W*?;_g zxbt%JK86Bd%4a5E&CXXx6VK?e0rUx-^s@)ttcxtZ`<cbLzixj8TzgGSJnX7V>0}ke zrI~A$*VDG-VpP8^I6d2z70hFBjv0x2OCVz%#Kp#{I6;o-G`V6Bzv??G|5{&InBy*; zwH!@Oly@|z^76O)<X?4ROZuzJo8_nz&i^-%Qy~k!IP{q_)^TAxUp~VB=j$`$ARR^Q zk?3dNC3pcy65}Ti+MS5k<u<U#eqI1M?@cNevU7bxL2{7hAE9VL#>-DQafM451qS|_ z)@Vly06~3!6)B?z*(?x&jrfQ`h-|hCcYea|Cd`k=1*A8?PZ$L)k9^U+eW@wD%+{O| zlzED0GB+frTd5qdsvaoYQ0dL*&d-2?wtPR9SSZ6uGp7zmShWi8kmr$g$M1GFJ}(;M z*Wa|x{JU-SmO%#NcV|l4=GG${3i~ll1BSb_ye<y}JK<mYtr~ve-0Hnccf+w=&<vwB zAO7)NjT@du+D^U&Vbq|p$CINCGipm@IxFX%)lR}svL=<bPM)DC1KSy(gM}xG1N%8^ za2pIf!17wNdlB?B8WNscQkLCHAogz$9)xiQgw2^R+`j;ZTHAltD_qdiLxp_0<|Yec z^NSz&C0ANtJ)n|}k&N+;5S(SJ+O;`;hc?HP9%sHeVoSpzntl_pm3^quY@4#XZP-^U zP6ZPStTma_&?XsY`HY$WS?k`rATI2!Z)>EKlyG8PH-GmR@rCuCE6ZtT_n6ASwnL_^ zq_o(!**G|%Ge2P6&oC?}^J$gW<zkmAi>sgO3kWBB&eEg3wrvU_xMeAPR;anFr}|pa zx-xN)E-h#D3h;5&j|sW?-DxZpUC(Lj4~(ug%ijAB$Z8wmPL7SI4sJIc@C>Q!4CVdD zf_vbS@uCTnZ(fh?du;#FKbUs>OZUmZ_Ho}0K#|K_Eo<?IPNbqibnXrs`h4&cAcz_S z?bMm%o1JB{N!$V5*`W~n_bd?(ntU$UJWCxh*#o5kxU?MeR^Gq&ihOQ$YFS3IV+4OW zrkS;ncF&LL1U}oYM|kjO+886lqUmXS;Btv7Vpd%e15txcw}{cJtrvq&x8UN&!Tyi? zQ8IB<ZdNn8u1B*($7Cz=z6^`pKz|8(Pp=)$h}}|MM!7e#PFp>QzS-GgkYOmb$vVHq zfD=0&&*`CQ#1lBv`}(v359|#DTqN&7te@_Rhy0IayVE~Qaz*3a1XGkRYLge6V+Kf) z`|gA`xRk~-(9a90Gc?qT3?2~2z<e{rR;Nb20y}W#)r1YkuwrKpkF?V^NQwNW=$ml% zmKb5~*}=24)_w4R1}pdH-(jAK@|#Q_2NlLNuqbO+NqTd{I&+Uf8a$?<1`+&tI!ui; zrr3%XbZoUkTiaOq+2$z6TuWch<HPJwl>PW4w~Mhdc?fzn=bVEu|7rU_!xfkyL{wEj z--7=u(U)Y;{ST7-{|IdO@B3c@K0wk3Hu;~ZhZ3g9?W?P+t*x!;>FKNMYdkZuPv8Nv zluk}gpt;h7pdg5k=@$-&<fP+y3c&S`i|Pttc;Dp@FLecXf&W-L=JHhw2JP-FoSb(& zR!+zB6>YAkv?wq~1PlU>2{<)L3R#gqrQ~OR^&1IWgN`lExAt~7_{b*{qw>)~^O>X2 zlg0!0aS+x9<76dPREkaiFw>sW`0pTSB0=v5Zw@|APW2L1BplZK&YE$uPrRiM3_>sV zjCET*qobeu4BEU`%0PzxpTT1oqLGEEy*-c%OEZMm{viaME$*|PVE75Wc;lOkzrFBS zj5jAsb@~g{<wtr^B#$8q!{R(}@85FJB@p2cH;<*DQ9edxIyx_Xb#=A5xtX^xsp*8v zX1RU=x{<xphUenea;EU%4+)6He!1RK^yP$M&+&ZH&b?|+!4myr^c<a>jyaAC*U5M< zp_>NN47`4P_u(X&WS=qNHdO5Yy5<z4I{Z!7jv2dqU#O{089^HYa>C*H1H+*ZQ&JWR z{&^IBbZR;b?xg0@pcrAGtxWyhy4y{X(e8|_oOML`(e&$*PrN^NeE!l5B%!^Be$a#^ z(AGL`NX7A@v@H3V8&|!1P6$9VLfYl;3&4DvR_$ol$1kgeAT4!*834pXqEWX++xU{< z$GE$$7gUh5#k20$uiM-9LryW_z!a0ceS1^&rXHjHYp#j7X*J!q772up*WXWJGxX#T zC&Jb`Tn7JG%t*%DMTO2#-dBE$lx->9NR+UB<>6mm?1`o!l07(6N~~nQogCjlHi$GQ zM`I2b`@3RyQr64oHEAA-@<md#x7J!)dl{Wtk~mRQrr#UvL<fmzacoW<CYzb-Ez2jy zrqvw`rS(1&C3nMvwZ?L?`|Pwm-y1u570*2K>$-{#7jnvEQ3}S$Rd5d)!3dMoTGy#0 z=MD+_z~e7RBwL{iVFQ_6OG``ok$Ink9N&OQ60SA;e5rx&cf~Rke>Z$kkp^BE*<SXm z2;SPt+t`SNmmh^D^hTJHINz85j4jkwdz!f!|9MPdp`l3uIQ?#wT1+tDl==xDOvIZV zK0z=~Nz8vun>MA|#e>M`*%2l3X=?H=+nTU>Cl|kc_4}cLbsS&jssGqd#l<vEn<-S6 z1r6979V%eiaoOPY0)|)Hy<GHyzAjr_GhQ->Wa2O+`6Pe2D~pSZJ6p)l1PbMjzxfUV zC_hb<bHpey8&6jI=hTx?2`+_a=_ePORG!;#XbH%_V8hL@!S6CaBf;DRG71SwZT~$c z<TiBvb2jz|JSKVqI!mp@5gxlFq)r3REuG$aX;j@}$Wsv%50U**k$zI;5tl^BA32Ue z`ieB31(swZ;!6Td-q8hTsj$$tB+yaYR|Z~$G}iZ(bB!v!=hv4|#({#VqS*QZrQ~K^ z1s!^FyNy))YnYkps>F(?^Fefhv4!!`6t>3Xy!3GuL7k4Hu0mzy9)&?Hbs`|KY`NgN zk0$4B&nVCBJ;4fyZn%Y3iO;)0es!HYvNMlT#>R8Ac^)6px(WS&URR`(C4~I$7n{F> zybG^zZ5&_$jdyup#@z7cpDHnyQ%%ZX%*dqUef&2TXW-bjgv%~hJHJIWSb@;CGD~fR z`MHY>zIT4i7?|!nwUI)Gw9A0}V+V!2$6I)3NVIG2V6nf7gWM8R9&fc#A@_KKjainB zS8L=d+1qR98Hc@XUfhy63DPI4Jqq8>xP0{Brzj10&5ztBkj)U>5`Ja)cqyD{eA9OR z_R<e3Ov;dOyWb1T@IpSY^7f;kEx41M7jj<8b@OyP=ekbAfpaQ$qSDjB_B*RBvD!Ff zd*b=|h*SaX$2`2yd~lVu4|iB6@-h7ZF_PrBV?Fr>eE;<tI&YdTYw0Y5$C2X9S6z^- zMy<ICj*zQQfp|0R2mI)bHeiVG;|eD%3>$a~;flkSOm#Wlt@0<?zU$a3s)4<2b1pC+ z#rtDoinFN~qDi$g221D-OdiuB*2kx9Dzk)D69y+6lP1l}jYiPOsr2u9d`miR3-Urf zvxGa#musW8Cno|N*_UfGRpKLTc%JJaWt|!jZ#+JxX1bf3hX(_5{+h|*+8SGA*OFyR zAN^~6?OcBbpR3-9P<EWglE-SNc(uXr4tk8$j1@$jK<o&GY`*M~Vf7v`;Gr<C_{mjP zy-wI1mZ<bWXUS##yC+ANFBz|Ll34+ky={@jabig-oA0+5WFm%jP`D#G<J((jtOT`~ z9Sd)1<2N`g1+0&x@LwLB8>4sXpdZ?)YiSf#V;h=N&SM&Yy_WrNMTz{qbRSDwI3BQr z2zQgy5X8a*u(LbtkEA>07fT1D!7|#jN1|FiH8R|(7J$x*GC!w~keI)yQjgvxUWP^L zjoy@Ry6z^fmcBEO&wp=qXo1PK7T>B!8>{tpkB-bdm5H`W{8T7O!*&z&PBV=pint7- zhBkPW+;CB%U*qTA*Yf6q_7)<G>!VK?%9xra>#{WX>)LR{+oOl0R)IN4by#w473O^6 z;7-nYa&5M>np30wm?;zmX+6Mz)R=YykL-Nn<j;RT45<F$;o-TtxwW;|kF(H4s;bk; zdo823$t}{FtwV*#z-{3{y5+bDH1F5~cs4A%|2<sK!t+fSsR*010=S~iTWP8jb>M%^ zS#^|*k`<W3?cANMuPXz=_gnEU%aCqvZW<aIbY-3hGqd*r0poca%nBXjLihdUMDl}$ zR)|p82*IW84`oFQ^qTh6Ew;u+;MdMX8Ib`b+eZPth0I^d=I1#iqdAWaQ$GjAV}z*_ zaM$mLXc?pwjVD97<}>g<reW&p)Eo&r>gRw#+2qjP?mb>}fwEY=O-3r+6TqnXyIev_ z0%AGk2#9Uw`&BudJgx)M07dLB&<xKu>xQ7-!9BqTL}F(*s^Mm4o?KslgH6;bS5M2s zp8<lF@#g{m&gPyKN9`L}0+iKo<UR?pc~j5Gjt(C~!)#6ZN{#EI*KXmE?ohTLrf>L! z$bjt29Y$D_2AtsRTrdqrB{eL0Vd-_1%^S6~Qwzr<-X23dlg_NRwin5!R~PP4m%AG~ zup<$29>Lf(y`lyNct>%WBfpsRqZ-Ga?*%7OM&Be)31m02l#DtFc{^6V1QOaIxIhu# z`SO(ywm0kpeIf7ouDW298}VPJjE4>Fp14uJz*s7}^JgX`d_XGEg-SiU)#gi+%#v&D z*oo5xUP-t*LVnc+U!9h;G@TCwg^!P4US6Jgr6BB2#Qd^-E|fO?yT2zNH`sjN^-LK6 z&!O2wOQ9-*DVH<GZ&Zc_Y6dr#@?K=vTAi^u_^dT8LkH-T8!*AU^EO7S)^RLaIrMT5 zSRC%czZK?S?o;mdRScFt(U#Yl??N@XCM>izFcJ*!#~~m*TRCP2@$99&yqc?cV*rY{ zyAL6<kL%vz6JMUo=>MU{w=qo#>d(A<d~QdxG~C>aYinx*1AAH=g_@7dESLI-N=R7~ zO*J(RZf?j(NN2MpadmZdiqz#A@euwRRYhm2%E?Iy2|C$WFp&OYR_4bC#1;F8D~iR# z3?`6he9$^9Km{#bRDi0LIbFqZcRUFbhxqyCsV?tZT<f=aqwTq}=%o=#ReY@J(knP@ z0Z8yrP1=NCAPei4%ql<bSa8El^RfYV_^T_&ThD;{R7CpG5xUvq04wwlSV^*zg2FFv zRuWX#6m-2E-<`C~D>GtN_tPdr@0h14_z(a4+ON3i=7*-c*e@Q}+J|FDZyh?Solg{v zF7}n?j}+mUD15WcDaz2$o=B`8LvfY+i5D@Tv3U~vT+D#ZuP$MvZ(`lSC;T^tPw4Q& zm!iC&e<0gKUtqqV3<~YYgo3J{iZb792P-jNnEcjisRm@eF^F$OGy1b5Gafoy>e$c@ zx)uLp6Z@{1{r`Z||F7s|ezR<J3=DC-um3Kt=4Hl%kuI_{?w;c4A3gle?{JIjT9f<s z&yz6}_UnIwo&R6e{hx*Z`}X0H37ctq8BVFAhtR#eE_L_0%!pNaCXD3%#vZMmn(v3N zO%S{0jl1)|I|RU9<o9Yeew4S@bho|l%f?n8w^O3(0(v;O_rDw@6H=Qz{0O)H4NKB@ zLZjDebmu#3{vmvUf4Nq8y7JysoYdjC5PMI_*m2P}{NC=TIC*0s00{53y$zoGzHCtA zoGSd+u~T7*EN8<@96%(kk?CN6BUikLWTf%^05<<5wS_AI%*kyk{!K-2qYSKjRZsf~ zcal8g&0G3C`y;)nxEf4wCMG&REgTv@L4W#}d^(>Q{oC5G7z9fpNjG2!>lm~lD9>*? z$N1zanFoleZ+oT>jRXIsC%<|}yB{prMrVu}tY*WxYZ~(J%R<!D)E1*vSju4J1iH&r z8#`-m?9SBxjO_EltkiVBAK)(UJJ@w2ouD#U;|p9cCxQJ!Gm2+%@bCnla#sqfu9;+U zg!V0DuaU9Fh=`-KSY5_l5WB_vILuv4q_10qDz$Ik+_6Z2p|mG2aKJMHd((!_UmwGT zl9F{RrzScy&;0DyhX%K)XNVp1MtZ`x-?kAYx$()bGV5t|%N#@Kl3K638;|}+Z~ZSX zi_Qs=NdI}D!80T%9qwyBVlv=>MIc%P5LUe7^_<xI-0jrY93%RKh;RpKM2dEm!!!*D zC*rzxtiL(W7h?jtd=Ui4(8LEB6Gd*<(W=xt=VLVf`#bMGxV$^3cIuG;O3SucXA7zO z_=d0Tb?Q45n4*4jkx1H~W7pFskhIS8z6<ox%)Q;qwxCKB{%|uoh?8)9TBrn*dHCey z#=0O=Q1-)O^%I39Odx>et6p+hqd+uaDWxS?C1jvST1(~5Z=R}nB3+NB@V>T@Na6HT zetG8g*R1U90_gKZQ}LL}BUpWS;0WA!?r!WA$kz>>;HtRA<0}q^Os)L^Ya&0E>ai$; zd%<XAE4O#4uBQg!FL)_RXm@qTz5Ppw@>)>H(P>8~2l<$dxL`!^eqBc*nTicj?<1PC zA*ik{tu81U%atZA_n(uVNhEuQz8T9uUJt~W41tiJxr7SQy*{G{l??+BgWVinh61u| zCcl71<OfDlR#wt~$<fp66Y(LZk5=EMURWU#P!0OMb!<9g$<7OJeoP8fj=K)HOICmx zo}cUU%4wBJ6zGiIAoQ{yT-WuvU65OIV<8J?x!QcHzP+*e_}z4u3*FNv?hs-z>hcN{ zpH*r?yHf@z{|HrZb{BWnh&n<)euY7Y^s{x+^5?sA%_p&sqsQYCf*@cpTO0!D8%20M z*t~6<!g5u>=@5o}kjoV6Rs&#cfW8yWR>#AK%diB%1ekQZ`0OR@aZ_j4NYLf;to^W; z0DW%tv9#)L7Dlvs8h^h5{$DxKfJrN$Sb>n+hf7oimj}#Z$q(E=`Bui&pv%j2W%`!J z|Fzn+GVsbWo2z3UY^tksE>9xLppp*HF@MH%CqJ!jyd<Fh<L?3t*B;sZLwWvJUtbv& zW!Hs$(;_J--67H`U4qgjNT+ne&^3ezh@=k<l1i5}LnD$SozmUiFvNHBJn#Fh^}OF& z-@W+3a29jUoY?2u*S_{17@nfAAd=)r$lf=QWQ?hE3!now4>;3jqq|p*yqbR0Se=>N zB@g>hbBVPz7*3s=&S;$w`CtK(P_Hd>v&x#fv1i-njv+NzywP;r5ORddd;xmfFX)uO zZp^J+)SG~o+afAtUnXB90P6U3anD3C^Tor0`e&iYh5ET}Hx@Q$iB_3x{}Qm|2uBJ; zI$7A_0BCHkrp+ZJVFB<mEe$3_La1!nZEblbwRy}fTp~^Qthuwe?u9$xHtAWKAp|+y zEQBKs_AWq&qyWhYt8Fhym|gEz(neF|FLBIWWG*J-VHuym!@lebkC{e98Mi`13Dv}L zP=Cq*CT8@3lCzHj>)#(Rl&jDO;T%PZpC1sO)ZX$Fu;x^qad!)#mh4*L)i0TEvW8hc zH=mmobJ*{ZNC0Sdg&m4NuN>29m8IRSD9iBdo=79LHAz?G`;)A!@-C;L(K7%es<;`A zXKJa@tOMkuV-2S14VP(0U09|KbmP6HEGxyUaXV7l=C_H7&wQ<W>&iW6(|VGZi#RCb zh$*i<J`zK79?%$@0ra(u%mk~Lc8QYepn_`CO)H+PC!f9xTgXbiX^nd6gl^wA4c3J1 z$2)GFwl(U79AyUedWF>nsNK(s$8FscC<ecLHiSCy|5(lBJ;8T*&S_@>tnZ0bF#vX^ z5wPU~d=q1`ZivBAe?pr=LIwPo;QY4Ma_z4_Z9R{kbw87hLe-KfWbshn<pYr7{6*ZV z6c%JcXc(kAAr$#6?6ra{s7O!pct+Nd6myORqa$t|7-aS*Agj4*2b@UYA;>d+t$M{o z$naQO8&DZd+DnOt3M_AC7f+w_BD{gvo~Pr6mwz#{loH69^I(mJF!H>qiTlJ@NxZ!k z<cP9?hV7qAjGX9adcfc##^7bnY2xuA2Gs|k-FE?Aq<<-CshQw6xz3rhl0u<Caqg&B zvB-|oD`i(9Z+7jNZAWtI7x|8`RO|dkJ1JV<0pwEdS!dwA(<669m>z$B>wtPHivnKg zp&JW`x2h=`5&q?a*Qa~)1lwmmgl@Y6xRP!4W#^JrWx;^SdE5H>V$O)N_C*dZ(#bsO z<mlTZ-_iP>=>g&wFG{$c$d)%zCoxl>t`qA|M*gbvWGxv*sweeT?fssaJPYBFQX;;v zha4Y#gZM~#@2u8IN}37Lc(0u-5aT&0h=4>*k0Rw}Z1>Vwt?HvgpG+;_tDZX!5>eEa zHLiFcCYVD;J1TuxN**(LkY6v4#1t&+_ztV-IXfvVD~a4`tZO7tCeyppT|=KLhL{Vw z&==69=@lP4>v_H#ScgneGN<LPFI0MyT3~Ga?AQwzoR*m+u7Yqt?SO2!VJn(sS{A$r z$Y{U-s=F#Bh;v%`t`59r%O-fYO?%b|HbH-;#()lJ<HANIkne2V8Q(U|wt-qi>O~zF zCl^CYCGN5>Uk9ofvc<z~tfQlqK-7I`{F<+78I3WvXRV9a1?J79$e?LP7&IF{fGoeJ z*<i4`?e=p00osy{UBxy8jwO7DGmZ-(bqa!i0`U;1Wr4J`&_BPcz6RM?_rKZLpaHB; z>%I?R&zKlTPA0JZKYZ$caoWFu)&Dg9I}430%SVD#xA2{MIcTbBS39xYcK7xQC&3ek ze{7JYsQvKf|KI$ze>eWSXE_vxEDoBtZ{KomgnI5yeK{9@0GJv9N~f}7^MV?VK~_VT zy41=$b5gIwRPy~EA3VUwjUZe%At3OGn!}c!J+igQ3_fh=`g}k2x>b5qL`ajEV(-@P za`{`oz?+hz{P)j~3H0k64NGnEl+$D=K?FO<H57ycpyEK?KeYlR&!z|OzX>E}>fY~V znq4S)j^sP)AD(r6`=Zb`Uo{zd&q1<QUf<|Dy!=gp<~VARo7!>urlD0S&h0v_oQOK= z?az6q{R@fETF;#3H)J%>yABiqY-yjy@ST)lwdA-?IYY`));B_Xi0EP=vswkj?MQB> z-!-#4_&G(ZBryQB?`8lgaEV8<1-nsF=nL^p-BRfh^F?#wxE^j^y<YCrCmNg|yPab5 z)(B9gP)7O(Y)RgQFt2QUr`hay6Pz>2X~g3meNfoHXTdp|G2G=Z=K4nAkMEm}_vI=i zR4;PP&Y78euTN(bw-Sgx&jw^nwwJ9_CY&q|YHaG?ONN=n<GHFa4>99dgrYZ)fu&Ev zoXl}>+|Uj$#<4X%#zRmfrKCQ@#Nh1-fJQ1bNJZ#aW*~5@n%%B-eTwY4gud=<LF-1M zA@kb{zRfY4U7gl7xY>vKE5C+TV7S#$1xZvkl3a*k>h^s78#DJ4%&WZ_R-+cmRZ=qk zDdB_pLKIn!u=3`wpl|Sd-Vcju=Ca)CE;fgx-nN(ID6T-W^ta_{tcZ|2OQd1JXcY;p zD$YP{=4S(LsAx!&PiWBV<40(p$)HznCB!a2<V1Sg<w)m;p-xNUWg9wN{W5)G;uVkg zSHiQw&)Rc+BR}#+?7%II!!z{Wr4nfCk^!u9l2p9Sv|;U!X@O0ocxqJS*vk7VafI>y z?FzvVFPB<m+rHt<-Qh6a(XcOFrH`AZ(gK+4v!(>7U7jc3&70qTF=PggV}4^RUVDvq z|J9Q&;UJ!ZCnqW`o+0)s;3!~WuSMXxiW9?oW{fuQ6GCmuCuFO?2a2gL!<U3&vQJGl z;&vzxJQ8v{Sft^UcgJ!nO{d_37IO!*{q>1F)1$)gwN9Vi<0?moY8)@Seq~J^eeb!G z?NL=fo~@2&Oimo(J&5XvTl!y=>aZGa7o<xUeY-;M0!H5b^T}4G4W!sVgZ{jNJ#PV; zz4QK%fO$^j*6`mz3Nb+P*#CCzCR_<6aKdnUkaG2h>$r{b#r~+sG?JVs)W<?=R5RPC zrk0-h_yv^viBwPA@w?1#X7qgNP01@eT6w_c%Yt0g;l{*Wh4xQZGxYST&`oXT*^y19 z@`!(9%WJscR}@JrY=G8bq9z#CMBNoDJ50OW^A2%aIr!XTAV$KIhUc4n7%1NjzmNY@ z-WPYyHt#pW&#>Eik}s#O!ZGhc+8H9*0?X3-6D{Pb0bZs_7c<|X^Z~+nfZTn{mdS#H zfKYVAb-#o2sOFz>4%BL!<XVK0)^xM)1#a_9S*l)9FP0?q>^86tur79}SZnf0=UW|R ztm+RsA&g7o+qhUgr}wqLaar6={QWtTZUk6m>c2hlKb$fm-?*S!WoEhMLpyz>hgdtz zG<J_^cH2-1ua?HTgB@NX18V!CxwZ=vFpg&`1uys>9=G4g-1NWE@u-v*3_t@JiIPqS ze44HGpV@b4^%u|WwrW%d5C`HE&w)tZgcIuLU+0^Bys-l#H}y%uv_fDz4nt+3f2f*5 zw3AAW>UKBHq1$Ppg{Z}Qt-Ucd$yfC#J-t6)zCzZ-wH*c(!83s2(Xi7SPygyB4NUh` zv%_<@XA6u^hHngXBem6tM0ZFSfpm?tahmWrz4b^HSY4x2yk7Q^<E%D{((EwWBTVv9 zBFV+?s?uB+2ZCM8Qh+c`mNzeF{&OQEBjsJj#4vMk@(Ki^cav+)FaE;k8t41b&_qzq zL63fB^X%{=LX4gEnKR|gJg7Yw3gpLCGg6$idY*?;W;Qd0c{#G*UN%Gm1adkZFgBeI z_M<>T05|kYj5=hV0n4024?i|C90v=-ZiS0`=+tF-yU8WukUO~D`Em*q=vK`T@;}Cg zI)HnR7tifuSKRjS89a&27|Mt4kCNvo>{gH&21uUVt=t6i?hyahy>LE$1Onlk6X;d! zS&A@~+P)r-Raco#kX`HE&IZOGv-{)0JQb+Z(Kfrn92^$>aecUKEFk(j@R`W5mNZ|x zAK|!nMzBHEEX)jW1I<SI{5RjwvaFZamzQ|W`{J43i%~)DT&}~l^E1C*Y&i>MjoKg? zlbdOLb_d?Q=_DdX#{cZ#G_cpRQiJeY(RFuUc{je=T;p-94`api7w!`x9yio3<tT^b zp35HqVjajg$I8Q`ZPsr1DMX1XDJ)7YSL>Coo{Z;)GlGBG0N`<5FUQpV;NF6&IseYe zj{1gzEH<V2P14{79_1KyTh<*E=@e^gyirzrg~0-}Y3|pE+roI3BV$5R-93dE|1|o+ zwT&H%$0>l9m1T=$UM%pLHdE#tDv=qaM2oUG=0BEd*1>m0_6U_AWtS0Jt73T^HRa`f zbZgdn5RLv+%m}CYjlB#R&DMBbgy@>2c-BxM4gr%sP1WKnQ<;pg80u(qo>VETg?Ww- zAAIpnFQV@ow%eMQsw8$c95lLZ#~}ezwYcfEd+P$hsmV!ybQ<W)-@l*nynEp<ok<+v zrY>22@di`>IlmRb#b9a`IR`(W7QZEa-1vu`eO1%Qko*Cg@k$hpnrS#KzcOeNrcv{1 zRq@WGs?$<--rnzB)#_*}B`lxq4Q9&<&#IVzlE0s+<j7qB=^bd@C*Rl<mFq($i`w6( z{nV&ye&=_#xzS>we~hUUFbjJ-$2xa^v6LNreGk2y0w)rWT4b2>`{YraRpdSL=5P%! z)b(N0;ka$%KW2WKr(HRs4KVP$39+O6@Yv2+W|&;-HA>(wM)T#>q4^eIR`~qO*V#ry zBPT-(r6{AE(1q1$vJ?8p%dX7GyQ|_5-o(-y`y9v4^Ee4V2mxS#K46{H&Xt1Zp8gHR zeb!@UqWs>2_n^NvkGWYYo234276xiy%@7ej78<yx0wrmlJW8#mtZ=cAYr9@4X5vp0 z!GQi~n-O)FVRCaLEMi;jZ*rHQVK6^PGUH!eejYd};^9#2Q)QEWoXBq!X<P0sw#@V^ zckQP?sGtyUAp~B><)7LPU^GFQ5SI3T{7jjKej9%D1FYxsQaWIpLRffH^-}_b2{%8k z&!>ePzKe^C9WH(?ck<owc_(bTNfX@8<)#)8+&;wlJqf}ln?Fh#=6dQQ_Ap~|hLE!- zq@=xHLL~>S`LIDB-^k48y<S(mV%9L%wa<Z;;ZJ+u<b3T}aV7X1e-?^fsjv2K+l69M zbay(Yp|dFzd(dhd82kpkB}IJ#fGxZrPX+GX|9KMCME)H_>||TeaH0=j6OQYGG%)#b z?YO7XIpj*E<j_S;s4=EQuL!D?zbs|xyId{4^;Ku9mQ8ZKur=_=4Y8XnTN89NzNBq7 zYUR9%)heDN_AmJH!`b*U8;qqxm%`3NsQZ5ZHfS)H_wy5l;(|VRz7I5Lw47Zu^U|~s zvW;WRlAvW|>3<>@Gseszhkm#x7v_Wn(AvFY`nhUdN%P*An3|dj_(;)ESBVM0vBuLv zr&J^`0TLL)c{9iOJ2P%4W=bGj4MT1_LmO%r?9k>0Y_8P;aXFvsP!%#v!mz$;hMNDH zm{{Ka>*$TTIKYt6@&)&zg^EbrS~R@5DmNc3F?tPqdqKN=GKm_#HC$6=RBol4D30_H z`{FeG5~@H|pR`iMk;q34k<Rba;vqm(TAk|Zy}%PGAp2%X6D#-!ZdcH48k8ILsIh%q zpuEX}q&wtg_5SHLd1Y;D&$6F$OZ6B1mxP^Bqfv0<oT3I0)AyVZZf;h^+`H3gOnK}U zsQhJ{#7kPZ)fwySBZ#@JDYsXtdLVucaG=OsxaPE#=LNsnUu7tVX20HN_#)vG6f>HP zK4nGswmG^GR3<=M-E2yGWnxIBTkk<#>7Z&>$E<#{x%=navFrrX_+$9Xy3iPZJdyy> zV~sb>j|&sl=ldAp8jF8Soh6t^DG63ddGGYBq@<*9Y+m$%j_3x<(33~$K~G_FrVv=M z+<zF^$M&KYXYAj#2t=%C(0FJmalf}`sfB{BlQY<zq3~W6L*}FrmRv@a7xALdStE7c zg&q3(evS<<!K_uuon?F^tkG>ca;9st%V2;p>71i9wnZw%JO9EV+CeniET4#nX6v+E zQG5TB(pzK_E>DC&HoH>qSIEw3dFG&Q>BkL3u~y4mKT6>9ty2MGc5$+AADb6u4+5|q z4p3<%d=9Lth-F!pHa1Aj${4m5M{MAZA-6ZJLy4S|Q!1e61|<P~8_@R=04Z2*W^Qgp zx{DbMG;bN1ypntSrj4LawC8Uyx%)_zGv?#FZl+(j+<xs**n%e&eikMqT)9%i3k<)r z9oQy8?Z1V5<~uU*yUI@P89#XQle0&IG^O$y-r7x(R@T$XWpVTMDJrzyTJ7|@Q!#Jg zNUR3deAhSQ#HNCT-Xt-3a^5f^DeHc3>hEvcu)XGk?b;npxfKU4+iJ+En?JG?Kn^_8 zbKjgwed*gmzJ$4WnfsI^U|j+Il?|Ehl^R^?y3c}abSHujh|LW(EU%MDe_8Yf=9Y0% zmpRk4-ueoNC*HTgZ?<xMyeMQk+e3Scj_!;6;26l~-zgx8cHdw2&t#7#l^yb0Ir4hX zl^F&o+t{hfJ`@#^3Q~!>@j(|v3bb;y0xtG963d2Bi2ThOu1^zsr~O51h+`{#2FRfw zJ|t2#>6gV;1nbFV6^b&%J%IXG(Dhv&G}Y^$qClmL2aq+HaL4mOa(%2MC9L@)E;e|H zend`BwW;nJPW@WV2JGF=y}#CUl>?wYesq8``&KdS|HF~4S)UcSy(xPXcpG>?M@LWp zH=UYar~T9>0<cy90HwEYbxp-OxK2wRT=CV;L%xFs1>I(A{gb2p3gdkRq+Q=SSF~gM zzu8Tmjq5~11)$QU{Zq(k%9{jaBKr0HRLu=!nKLKy-Iz1kAdu3OH0B7ps=>A9_4<6f zJs2-5f#|w#d~)Y;QD%gH=9RCVB(6glS9urrh9s@U9~udAe&tTh6~gD~XWjF5_XLK` zKJAutqw)0MaPAedPzEu`H<UDy+g1-I&OMNaj%#}Tzv!EuJN<cSvTgq7ntffjO^O`I zc;%fi!u!)jqR#NHX8*cue8;nte}d<#5l`<C0EM9<zo!R&R6LPfoOVK7Um5#VdVyf; z90d^HJ&yhzupFboIjBnw3%K=ZMM4pcp;8WtQUikOp8!X2Pl_h4_I6&p>4{Q(ZTF>W zo6*fi@W5tZf(*-<aKzYFWRF4SyqWFyg|H3&*0RCDu-CM#0y`nYt2?xDy=+}NKFTe5 z>esfLq&OX$JBhW`=0TF`Wu`K5gPUlNJK=ZnZ4LWc(}}{b9~^L$w)RUrJc@240o6PC z3NVZ<8drXu@8%2Rz>*A2MSA-9O>P1~N>1o`&(qJswFY!?<5nX-LjGdp>2wv`(@FdC z7iLOCad2|<nbpsKJp1AsDl41#xToILH!kIEcMd)=hINjVonX11;{#vepy-mlKEs)a z_o@;FhXw6QyB|_md5YPzKK?f1k-8Y4l=udZtZ~9nlNgup?Lb>FdKJSFVFW=3o;uwg z`4wLv&~znCy(zx=B?l`6sa(CV`uPzvFMhFY>0%+^VsmJrmH6+Dutjql%NVHo^{TC9 zB)(h~{K_bAJ{b@>_}I(~$wCH1r57-Lt@`388|z=qp01F-r^a)<b|cTy&d;|hK6BT( z<h1gBC%?f#DIXveqNjUQ;`LHih@yM%9>Ha2qMJxbOqS}iM*^=X^@*ww3<ir7^|%s) z^c#c29L#lNASm6px(02LV5rK~WMh90rO6?CP^`sa^oSe=WJMXjw41;a!P~ugucf0i zHLHnXY8J!!2n&2>oW;j=)V8nET|0h)k0rF3w+6qr`<|GH|H9ejEsi_y1>VK8=?0k4 z%wq&q%i!3LL*s$to=7x@KW@z<G`g0vdns6WN_t)<BQYCvu4j_%snmFP33|vh7w0wd z3r0=G$bnH){x_2|AvN9Vc`w3N1QS<u05&@=5^VJ5_n?brBXGB*gIjZ}#{`;{$8JW? zeO72bmd)y*#(f!_g$saWv=BC70FUT!uCbM>yuaJ!=Vw+op=WA9(nY2=Qqh!Hgg|CB z4kqH@hWW4fxQIFf83=7`d9jT({VgId7+N>CD#)=dP}i=kZK2)xFnGbB=-rh%6bc0% zf6<#CyYdMzc~^f`M~TYrE>4UA$KH}lW;&c>qQ@QC1@?haq89+8kT$O_iA!xaF#@Kz zqeI*cVS|%lvjNRPFG;Z3?1px50KU_Y&;RD$#*)6Dh}@@$HaP|I22$~^tB{CSgkb?s zsCy!#&|(Q(uV$|VfqIW_$YnQ(hA8*#G#r%hJ>8I`es)!(;R|k!;{U!CiLR)}A1c9I zDs3wA?$gcqMDU)l{2sefwbgCywPnS-M}Q4xVc^cx`8o2Z59rm9z+*k(nKH$1Ipn0U zPN5CnH+zQ8+`{EFS4J7X8-sIdFS|}TyDPiyb%2srpsw)Lr#UDWAKXA0IH_+=W~-`_ zP=<B@$rq??@rYY2cHj-605RSSt%e?EN!pk&NA}<D)e7Wo2}%|V%LFDn8|o^wMew_8 z(k4%)Z6cGa+1D~u4nyIXW{=g$(l5#im-B%c?~(kk@B#;b?)41Z`U-^HlJtRAmCt(r zG->OKk;)ELvu$ffDc=Zp%;xFd+)Ad#hL8I}AA~KY`x{CEzLfRruy@i}(m1S&MTTq3 zD;R;pPlXX4n?utY9Bs`jtplkwi(XN#ZUFiFbfU+4XOv?Tx`**qqOWp>%Q5(etw$8G zrP@k02^ZUYS51L%?funPL_@CuyL=>$P*;I>?LlSH8IH;dE&~>yL(!+kxd-0sf_oDD ziGKMbG-Iyet5Cp~m&s-3Ajx`lG5l%Zq)n@b^Fk%E()+n7KnDb>VN0?E+T@Y|_9)N& z_}|u<B6_J?1TjGXW>pP0N&fv|oAdjl5Yt7OAS!%dLP}qf?WvBz!|~=>b##@<>;IFF zOyg_=14U3tX)y<=!0;+_bLt7wr|H_7g_Odbc`4KuX-?wZr~D3vN#w&qUTEhFAcK<3 zZPo@^)QMixN!*!+eG7W|RS@!1rYs931zbs_GI8+I6FQz9<|T`g0S$1i{^&YV)diz7 z1#zPT*^d{c(;*GjQ&W63`^;8L8T+(FlQy5L8?IM})@GZ@k_>H@rfcjtXM2T+ld3?a zKu(TSf<i+6J4-7oD@*a&3bXE(L+PcrTi}+Biiycz`2yxYXf(HM+q~XjY$I08bq|Pi zi9^FgG+bUD0yL{b%?ZjyhCTKUbE&Z8I-1KuOYiA)`q+t+-XIV~yC!tgsiyHe%r&^* zHFwq59Mm~2+#MI&uRd<EYpm`;fg;Y&j*hY)I=NF;-KZ<;aqax+I9^<p5cz9fo}<8F zsr75_d+HoeLToqZiVcS(>@(!Qc-YVTHpM=m_L+@}*oBG7JDunbu1m(hQm-<;_H+%j zm%Jj`Z;A1b&CSw_2E{>B^fzt4iuUR~&fiiBvc!Ud7u%@def)GYmKa}|3nc50b8?vI z|5i-=n~DFo`ucy0#r;b*O^c(}oEcg2j^#f*y(zk|yuAFF-2+$e&2cCg{mtm1&fEX+ z{{N=tdo*y}a&mGC;2<!<Kel(@ovMgtMpG@fen3jGOl3wL9H-{y4=<X2{AXnUXtw_w zW8lL_-bQ|CA2S*Gi85HUU22S*4@&%x)w7JB`qzT*EhQ~&bI|k^aRHM7hrbG2T3dUQ zeu%C5vD(vU{T9pQ7pp@%ieMlHRX49#_~0cO1x8@^O8bqQIBsq@H9Pz+!0|08M)8IX z#m(9r#9Dn?({UDcrTGaF1r{MdcThKE@kj?(6n8ObrEMh$rA^Eyk?HSQOIN_$qf{3O z4q_ExL-_#=3L>L8uM@LjWN_;+;}}zMV?BHj;RJ$dkyT@CH^Jy`q!%-zd8}_K+IZ2K z^XS|Ckoua=zf^(*{)Vwcd`c5EpfbIi-z8z_mCU1bg+f9y`}@&(?<EOiHh2n$RDulc zSIEaazQ2}Ih_!qW*18$LA!iJ-ZnX_CWd+6J{Zb*v@aVlWEy$KWVxm^#XKKrQ>9xlu zR*R9%rT2?}hB7iwI~W^efpjS7%%w`Re$-aMCHo@JtW8i*gQ!u|G?8g7JZjV4)e|pW z)VnxsW(SXoWC53AsP)tVb|Wlif;cPR-=lQfZpw)W$SwT}<=sB1m546MW2V?`BXk)b zgMV*b5NSOiYK5?G;xnw~iY3@qRz=Xp&#*EKF55PVBd((f8-}z+<f-VPP^>~#1kc_4 zlVN_h>ikukv-^l@PqMrKD^^<^O&m5jZ&Y`(teIdm3R98-gJ|^dHlOf{1xvJ5i))`> zLXiuR(ble+>v&?NXbN!Miz+-LCMw0Giq5rO6FxILhlIT?A*ucQbbHJutr78SZ0z_- zH*f(=4tYT+#GlB27RU1WfaB)*$^dXdL?FH0`O8y+tuIWoyDs&f<at8d*h>m9Ks#Pj zw0GYdiJbG?7||j-x+2k&pjkyIWwa?7Ca-rVGjp}nCD1%zMP<v0sMFWHS$sXEPr@%Q zcSEwZqb~=YP9h^azb<?mLbaSfbk8|EUx=~pLfjp@mJ%{&e!r}xQ*w$~^Bp&-EONvA zWbdsgu3uWaSW}a|(yQL!8P5)lvpn4{(d2Sz&EKXOj`k{Aj;1cTY&a}K-t3GPVfh=$ zlSaIo3ZXdEWoFgF?BC2j4;sLZ^%N9B*z)S%Xg3Ts3<}=;Tu}=B>qM<H%)cP5zTTo> zrz7Ry7pEiD;exi3XEKCB+b@4xZ-=UU+Fo3HjP19po|WBxbnY&gu89G!%r$20;`|jE zLB0_-SpVhLkT+<3e-AN`<04<==bJr$0U2YCkfXz>*2+t@8&v0RW>!oHiJ9cOotxYh zIgjb_pD{*e_2)cY)+g0DhX}N;Yp9IZYPWi3OtciFt}%O*6pZIpy&cG58me#?>@t@O ze+IA2Q_!vbZmY-wR#CSr6dU6Hu`bk+*S%P6y|Ql6p&|DBhN-Y1JgvE&1RVv#S#)#? zTbpb!-f{^-5lLLGkeS=j?vls^N|O+EW%ag7^#K8c(Uj;8;VQ-BcBF=oqZC%{=d-QG zFD=H^OMtmx1H)N)bhXn{w1xS+d<;55xAjwsZe0Vo=S5v&@Iql6UDiv^b{7v&Vb<=& z@^U5ep0y8-;^N|>sKZL088}g^#is8Pa5ZKEGvG*qTR93E|FkU4z;C*CN#ust;ArGK z)^}CfPha75z2>bmu!I-K-b!J@E8jp|!+zf)Ru2eQU0?<+HwUlHej@S+J}~uXgk<DA z#wnf+wH;lMXr<M0)X&AAaG|weuV7#Js~WB!N-~O*;wxVI$s*$Jy1-13i*<_GYyE&F zaixvXcviCztVf*n!f`(~CE&J3k0Xh*HBq}IF3R@uuDsH7YWh6dA)&crqSmv1`uh9! zd|{rMF8^L7bF+c?S!$6V^>iv?$h7yFNbP2Otv9*4q9EMiMZ-&8ue^%GoO*WYJjb^Q z?v14(D1#$fNg|e(X|+G!6?P`Rv#oN_b^6Me!2AAZEG=(<b_LN`LqJqg88#c-<!gHz zsm_GSV#&umfQz^8@VFntinkg)!)+G0zX-c-l^DC96F2Jbyb*8K>nB+r9Z2Q<Q4-`N zVw1c8XtxBJHS7DRP;N_@72Ka{i>7^!LaSthCrqeIj~&?~Q<`-Omud}iHJHkDbG@u7 zzd<b1p_t4~2NU)Ht1TDX=}*jfYV&haunk~x-N$-h{Y?FznrVUf$IGa~n#BB+Tqh?P zt*s+{kcoTTytKReB~PD|B#f)8i|Bxhnce$F!(Ecu(f9k>VG%;nqjOg_=LhZSX^<@p zeVkOW`-zSljC`zx01G>H2#k)^Vnfhy__nH;DN>NkgMH~|o&d4ZR6dB?5jttFs=BEg z65^_y)CV&(Q?+vOBS6#esWb6AwcS}C;`ZDa-W%X-y?Ohplqk=68HxIK3D57ed#&|e zM5zx_CMc5YQpO^d#o7>XUdOD+qq^`J+8AO;iMWT&ihzS@<{97GSh=7QSNe2Ylrm*X zt;Ysa?<O)7_pFlBRwfrTlyZ~8>;`#IR`v8-!%p4Z^W)N@>b_$w64p{x#Sy$(Qf}Xy zJAEOcfYxzRE6$BED4rIkn_%J^HhSWkPB0Q%cUR{|B2XJOmxt#t+zP7+S`lRBV7gtR zzW+s~!uC|&B0UvzrONFGfu}VyFUjK8j(x;m^``{Bc!RX!E{2xZ)K5~-?XHGYqOjSl z76lV66z#m#g9ZrGBAehdzKel(*UP4q-^RH+eL`&xwyu0f^H$>GSYxJ;z6KiWsoa$r z>%1sQ`vh})ndOXySEn6c9?9E0qS>0r+a*c_YF&+b6t#2Bu8pV<6t`OMCu0SSXD<Jw zF~ud;Xw<ve>$>^vlwY{+qkOIXh(pFpm>H7M?_0XkPuX}l?pbP2aFL1RygJF4ls${a zH^^by{Cd6hj>XCf%^vB8n5A+|m&s#&<R7MgPVMdiW99v2OSDreZn6a~`>QTZ=3l1Q z*F>fjj2Go0C}87~MQ08?KE~IN$b}nnC#WsU+16W8Q5yBhV(OFyM!>1Lg+yEnOd%$3 zYNOaLPU#IAY?FPNu120L_TOLVWw8Uq#BDCr4KTeIx~n?bX38L(pKhyU!&r$W(P^>y z1(&Kz6JUq+6`i6g>bIw|l=><Xa8e?*q|SEqKi=eb=4%<N95?7G?l3oB;Uhb7brj_K zlOjQB8H&+}V0jIyP#RgON*d#R=@ls`77KqoL5b~s9sVUHb=`<ZfN2A+Wa0{uzrJl0 zE{lqI2^2~_+3ZIOl(HRkf#vcVc%4~~xANswf$ODqk92KXssjHCbGceB)%Pi#$QrNp z__46I*RR>EmhhL(*DreUWa&pMB6$3r;q$lC?Oz5j_MS`mPYa|yPOweqk$#r`ol^jK z*RL0?(Gi<&lr#Fzk&NDS25;Muz@>Xmfg|e|{C89-MbUTtFx~F7kwn^NVT3eV^a@4e z?E?PI`DFIOBzu6_jI{_z`_s|5^(1q5gsBQamUq7=j*L{YnQsVY$(k{PQG<b-sCV&6 zC;{9Hf<1wK4#j$(I#18of0-(}ZA-Pi`&5xsEgU@xDRSx5?6;`E2&Cd)mfgJHus?97 zz>q^-o7dZyj=0szHj9cmE-ecalC<&B%qh*D>1Qb~vSj_8FacvEAjbqoC$_3zMt&I+ z&gp=3v3~j*WTA^<WdepIutTnV?_o9j>Sai=LVvF79Jni73AI@r>^~Qwas{p=H<828 zC4~!;l9=l4Dil!cBGJ^;OZwrQk+2i4Z4VD|IGN5wn@esDUx}jj3IQP)TPk|E;ahk( zxFH6n%Qf*&gUcBBRfRaXD@^r*o~c!P$(U~1$(M($WmH!fH~g`3(FY?Lke$4=RszFI zM(@i-kq&8%JKxYX!BKXr@v?+zW%3Wf5eK141CzP~Dv!K_P||lB1@<iqqRL+e{#5b1 zzlNBce_t|u+R$XJK?J$KXcZOQIP=DkUf9~}f*6dd+y>2IqMajwk3W^Vziv=sB}!mf z2`RXeQTiD4KJ!bP_UXbl9Y2LOX;~JEib8ahj2EQXYJWAu@lEEJtQor@o-vNXVMAGY zrYdYsxKE!J7Q-zHF%Ao|f4kOtrh07Sm0URlR7bCj{UNnAd<nHKT>VU`PvoZ~SBQcS z-Ds&4T={+4VoW-t){&=as5z&V%u?#ANYN|;7()@=DVq@iP1CMMx$^}Fxvar9>qL=B zDNTCyXLj#5IG)X<mEl#Wr#xCD*taZ3qkGa;N1#(Nn_Djm;6_gjts3;2=_W#BH6I0X z{^*m3hbs&hoGn(F=>A~S)>8~_bbHB9yQE5;S%Hb!g_<y*_@vI(<J!&L;<#BVHFLjk za8i=)i5$bCATECyhDsW`J6lOe{}8OyDCK?NYnmmRnpp52LN;#b6TN^QsN#|uduG-w z?cw6`<O?*INu|lK-gJdTornk=p6$s8C_6u*zz+?nBW{}O^RoJU5?CDIPbpZ^zX1f6 z$1pXMn>27w=KCh>irlQ`PSObC`kUx#joDs?>iW)ajk92r2;_>qv%i8P5k0;F33VT0 z(?Uiq<<N`;t~y`NOfF!vW$DzZzf_0F(To_Iio2xWGgzCkv?ey9bQ*<yYQ#LoLwn$) z(o<<IX0HYrK&Mui9ve2Lt}F@huPPd=Sky^e(^aq;<zxHp<ieSGAJ&f5lHsyRV+Wh* zPqVZsW_Lh?gXYRrv7|}H_)g<&jrg1IpRiJ0-kn*Nywxw9hNJ=Uqh4Wxf>d5S7;i8H z@^KxaWC2%3x|b@e(>0K9wTAlFHjiJjnX7P6mhjS1na>Xk*F2>^Qc3*0<|R3i{t<=0 zMOtqPXWI?~(6iX3%&pMO%Y^y3cp4sUYl0%Scko2^`*dGqW-N<rw)otpk`lJUcY5xy zjNzxYBy#2+Jo10&(0Ni&eWGMIzi3`$35$JufBK<lXD6A`gb&RpXv_s!@t=KbJ4F<( zq$Q5l!G$kp>!W1sE@sl3!fOS}Gj2ZYQbveb7UHod8Q66v*1ST2r>QB|Y3pj9XpL1c zlHt(D$pf<n5*}^YLmwrWdbTS9gaQR_yW;@8I_H<SH(s#8qA?kBru7b!9<7AU$fIyc z6V4Bna)X4Qp3-UQelL&DJ^eO-iF!`QN^+{;@TcmpDDJ0$^&+Ie#Ba>P={yn7eYf4I zBb%trv9tH6360^EYD9ffx>N!Yof5ynuw$u?-g|aqwuBEWf`_^4{$~MCjyu&0r=$wq zf8&12tzF)}Tdschw`u&I=TMj|#YQxFeBtaab||-SKR7yHF=du`J>=56+~AR_!%}KV zSj3#&SCm?pqryJCpuail9<il-VLX5vrxo|@`qr++&BCuIN~nt4<E>3K3y#U1rVDPM zN|H7*u4FjBHU<@o6*IXVvvM!*ozh3<w^w>p%-dc~l3^SePoy%QUEkUC+^YKK2QB+T z)1Thk1j&>KmsCW&Q`^f}-ah=6k(*SewtxO&^e|FLeF<WsXhwz`ld*<LseM22kW40u zbb31)i^x1z3ASLYto5ucbLSjyz<{qKX@`pmf?UPgkr!9YLOkxEDCobt84N%C6Efv7 zYRf%H9!w#K0r-b*aF!xReZ57UDF#pDa4FhWAoezxqAQ$wLB6MKsw~@C54^*&-;+42 zse6!I0E>G4iP~Hnam@=CqKM&DsbX#hEUwoEWCxCaBU66<gGoEsm#dgmK$wx8+WMbv z+M0d;;QY{hD8p}ruU=TKU2Zgnhja2;&UeG&kz2;7)^INC-)zTf*bkM#BHPq|O7tAB zB2zZFJtWTjx2%6g9XNA_e~T$YaNH`Zs{SjcTpWG`l0yHRW&b}s&%a5a|NEr?|DT+k l|Ij-BNz6CGzYhS$cyLx-OO<@UFH8XB->AGUlQQ}6e*p9u^J@SA literal 0 HcmV?d00001 diff --git a/docs/intro/_images/admin05t.png b/docs/intro/_images/admin05t.png new file mode 100644 index 0000000000000000000000000000000000000000..a5da9504f3cd09a796b6159322c8d5f0eace55b4 GIT binary patch literal 22754 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 literal 0 HcmV?d00001 diff --git a/docs/intro/_images/admin06.png b/docs/intro/_images/admin06.png new file mode 100644 index 0000000000000000000000000000000000000000..5f24d4e3a4025546c3c61feb241daf2533846dcf GIT binary patch literal 22780 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 literal 0 HcmV?d00001 diff --git a/docs/intro/_images/admin06t.png b/docs/intro/_images/admin06t.png new file mode 100644 index 0000000000000000000000000000000000000000..fb65e0aead1f4c9c9828ce0f1f51b7c39e27bf73 GIT binary patch literal 18156 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 XR1#s*r=_Pp00000NkvXXu0mjfCmA(< literal 0 HcmV?d00001 diff --git a/docs/intro/_images/admin07.png b/docs/intro/_images/admin07.png new file mode 100644 index 0000000000000000000000000000000000000000..b21022f55d0fabb67d84705a496962ff5c571940 GIT binary patch literal 19804 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 P!3`MbptMUhox=YP3*c4o literal 0 HcmV?d00001 diff --git a/docs/intro/_images/admin08.png b/docs/intro/_images/admin08.png new file mode 100644 index 0000000000000000000000000000000000000000..ddac57e4ae94533554b361a0b12dd9065bbace78 GIT binary patch literal 31552 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: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 F{{bJr;E(_S literal 0 HcmV?d00001 diff --git a/docs/intro/_images/admin08t.png b/docs/intro/_images/admin08t.png new file mode 100644 index 0000000000000000000000000000000000000000..83773bb833c4b93f40656eaa75e60910f7949504 GIT binary patch literal 23883 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 LNkvXXu0mjf?DWVB literal 0 HcmV?d00001 diff --git a/docs/intro/_images/admin09.png b/docs/intro/_images/admin09.png new file mode 100644 index 0000000000000000000000000000000000000000..ba7de1b9d2318ef29893833a6ea66ef1f08e1856 GIT binary patch literal 16318 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 literal 0 HcmV?d00001 diff --git a/docs/intro/_images/admin10.png b/docs/intro/_images/admin10.png new file mode 100644 index 0000000000000000000000000000000000000000..20b085b5b4ae6894d877b496b5e998e00cb1ca6c GIT binary patch literal 5486 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 literal 0 HcmV?d00001 diff --git a/docs/intro/_images/admin11.png b/docs/intro/_images/admin11.png new file mode 100644 index 0000000000000000000000000000000000000000..6c583fd2dca679e96bcfa6f0844a8911a501d82e GIT binary patch literal 33563 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 literal 0 HcmV?d00001 diff --git a/docs/intro/_images/admin11t.png b/docs/intro/_images/admin11t.png new file mode 100644 index 0000000000000000000000000000000000000000..af792b899daaf4f155eeb0f3ada75eacd31c885d GIT binary patch literal 26365 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 literal 0 HcmV?d00001 diff --git a/docs/intro/_images/admin12.png b/docs/intro/_images/admin12.png new file mode 100644 index 0000000000000000000000000000000000000000..aac5c0d6b5fd299b23a6c1ee368cd67a7179c444 GIT binary patch literal 12682 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�M~~b>3PN2<`}DAGD)AXF(Tt<<YZ#Z#zqTnSE~u;a@rSoF{P%)hpL>Ulyy> zVt^~oFDELfGH7w7<>zlfM$9?<<`^~t3e~DS`jB@aGG~W8zspuW<J;G1xv<y~7stdU z{(8YOYW66RiK}7Aa|H>+DxgI9{G!TnS88Ki$6v2t7R?au<+=;X*7C`)X9S^;2QjMY z3pl#LObEZ5CG9-cs|g@CTv7?tlk`&V?D_57H}~=S`X5mDUs7q$&|*StZb-1)NGK?A zG4`(b3pJg~+~KYjq0BBk1v7J$pui<By;Am{szu01cLF|EfZ>~e0^)z;BmY^}zW|Vb zrz8Jl$psMo<72j2(PM4NpN3xfC|7C8ur&w5h?47|+tJU0kLNoiKK}!3w#k2a<x8GX z|B*N<{7CF>=~Ny*yaXddfiAW!e8)cWpP1%f!1T12uTK#93T5bBWkm(cQLFGW3q0fV zs%BB5(iwDohB!VA8$5UY7ryiV`Tl=Lqq@5Pu>8y0Pl71_`~DRU2c_hjJiKEI8F${d z846za$dUYK|3F6nS>%Km{=uaPT~fq9hY*fQ%8NH)D6#$FPk&T+N728*qklo|0mW(8 z*Dc<UG|i-!$`aBF>s5<WBOLLQ$iVT9#DmHkFLW5uQR~C`XS@G#%KqQ*{$Jo!#~ch2 zbvXumjpZ^&%3vWLZX!|{=&k>rYVX0gqn=VgAd{M%>Q3O_kk-E(0JzL~hF}T&#LrPr z2?nBHJH|5@TmJap=~st5dG7f$C;K~gU0vP3Ay$}oCFg&MrT+Wrf)Y{Gt1P^G4koPH zV+qNF=b-HGZ2q_N2tO}O|4G}@MMM&5E}ci=;{V|w3>+$xkIDUYSWRC@8%bVV5<F|w zUrB$p^*<K=zyA0;kIQ!#ErAaLym(lbl!SuZ|9hVLITS1i+<C$PmRy{)VsKefp3i## NvQkQtRpKVW{|5zIv4H>p literal 0 HcmV?d00001 diff --git a/docs/intro/_images/admin13.png b/docs/intro/_images/admin13.png new file mode 100644 index 0000000000000000000000000000000000000000..49a5950409d29943fd19d147659470e4e6907ec8 GIT binary patch literal 22062 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 literal 0 HcmV?d00001 diff --git a/docs/intro/_images/admin13t.png b/docs/intro/_images/admin13t.png new file mode 100644 index 0000000000000000000000000000000000000000..7dc01e186ae760b2cc4c0497434a117946f14369 GIT binary patch literal 18690 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 NKw8+E6U@Am{{|IoI%WU> literal 0 HcmV?d00001 diff --git a/docs/intro/_images/admin14.png b/docs/intro/_images/admin14.png new file mode 100644 index 0000000000000000000000000000000000000000..b1f4a5420a2978ac126d647ef01cee52047ecbd3 GIT binary patch literal 28987 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 literal 0 HcmV?d00001 diff --git a/docs/intro/_images/admin14t.png b/docs/intro/_images/admin14t.png new file mode 100644 index 0000000000000000000000000000000000000000..86c3accbbd6f70ac1f6ece54c34ea4cc56fbb2c0 GIT binary patch literal 23460 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 DJRE%? literal 0 HcmV?d00001 diff --git a/docs/intro/index.txt b/docs/intro/index.txt new file mode 100644 index 0000000000..2135bc7fe9 --- /dev/null +++ b/docs/intro/index.txt @@ -0,0 +1,38 @@ +.. _intro-index: + +Getting started +=============== + +New to Django? Or to web development in general? Well, you came to the right +place: read this material to quickly get up and running. + +.. toctree:: + :maxdepth: 1 + + overview + install + tutorial01 + tutorial02 + tutorial03 + tutorial04 + whatsnext + +.. seealso:: + + If you're new to Python_, you might want to start by getting an idea of what + the language is like. Django is 100% Python, so if you've got minimal + comfort with Python you'll probably get a lot more out of Django. + + If you're new to programming entirely, you might want to start with this + `list of Python resources for non-programmers`_ + + If you already know a few other languages and want to get up to speed with + Python quickly, we recommend `Dive Into Python`_ (also available in a + `dead-tree version`_). If that's not quite your style, there are quite + a few other `books about Python`_. + + .. _python: http://python.org/ + .. _list of Python resources for non-programmers: http://wiki.python.org/moin/BeginnersGuide/NonProgrammers + .. _dive into python: http://diveintopython.org/ + .. _dead-tree version: http://www.amazon.com/exec/obidos/ASIN/1590593561/ref=nosim/jacobian20 + .. _books about Python: http://wiki.python.org/moin/PythonBooks \ No newline at end of file diff --git a/docs/intro/install.txt b/docs/intro/install.txt new file mode 100644 index 0000000000..bb361d52b6 --- /dev/null +++ b/docs/intro/install.txt @@ -0,0 +1,75 @@ +.. _intro-install: + +Quick install guide +=================== + +Before you can use Django, you'll need to get it installed. We have a +:ref:`complete installation guide <topics-install>` that covers all the +possibilities; this guide will guide you to a simple, minimal installation +that'll work while you walk through the introduction. + +Install Python +-------------- + +Being a Python Web framework, Django requires Python. It works with any Python +version 2.3 and higher, but we recommend installing Python 2.5 or later. If you do so, you won't need to set up a database just yet: Python 2.5 or later includes a lightweight database called SQLite_. + +.. _sqlite: http://sqlite.org/ + +Get Python at http://www.python.org. If you're running Linux or Mac OS X, you +probably already have it installed. + +You can verify that Python's installed py typing ``python`` from your shell; you should see something like:: + + Python 2.5.1 (r251:54863, Jan 17 2008, 19:35:17) + [GCC 4.0.1 (Apple Inc. build 5465)] on darwin + Type "help", "copyright", "credits" or "license" for more information. + >>> + +Set up a database +----------------- + +If you installed Python 2.5 or later, you can skip this step for now. + +If not, or if you'd like to work with a "large" database engine like PostgreSQL, +MySQL, or Oracle, consult the :ref:`database installation information +<database-installation>`. + +Remove any old versions of Django +--------------------------------- + +If you are upgrading your installation of Django from a previous version, you +will need to :ref:`uninstall the old Django version before installing the new +version <removing-old-versions-of-django>`. + +Install Django +-------------- + +You've got three easy options to install Django: + + * Install a version of Django :ref:`provided by your operating system + distribution <misc-distributions>`. This is the quickest option for those + who have operating systems that distribute Django. + + * :ref:`Install an official release <installing-official-release>`. This + is the best approach for users who want a stable version number and aren't + concerned about running a slightly older version of Django. + + * :ref:`Install the latest development version + <installing-development-version>`. This is best for users who want the + latest-and-greatest features and aren't afraid of running brand-new code. + +.. warning:: + + If do either of the first two steps, keep an eye out for parts of the + documentation marked **new in development version**. That phrase flags + features that are only available in development versions of Django; if you + try to use them with an official release they won't work. + +That's it! +---------- + +That's it -- you can now :ref:`move onto the tutorial <intro-tutorial01>`. + + + diff --git a/docs/overview.txt b/docs/intro/overview.txt similarity index 81% rename from docs/overview.txt rename to docs/intro/overview.txt index dae0ffbd76..79ce653106 100644 --- a/docs/overview.txt +++ b/docs/intro/overview.txt @@ -1,3 +1,5 @@ +.. _intro-overview: + ================== Django at a glance ================== @@ -8,10 +10,9 @@ overview of how to write a database-driven Web app with Django. The goal of this document is to give you enough technical specifics to understand how Django works, but this isn't intended to be a tutorial or -reference. Please see our more-detailed Django documentation_ when you're ready -to start a project. - -.. _documentation: ../ +reference -- but we've got both! When you're ready to start a project, you can +:ref:`start with the tutorial <intro-tutorial01>` or :ref:`dive right into more +detailed documentation <topics-index>`. Design your model ================= @@ -20,9 +21,9 @@ Although you can use Django without a database, it comes with an object-relational mapper in which you describe your database layout in Python code. -The data-model syntax offers many rich ways of representing your models -- so -far, it's been solving two years' worth of database-schema problems. Here's a -quick example:: +The :ref:`data-model syntax <topics-db-models>` offers many rich ways of +representing your models -- so far, it's been solving two years' worth of +database-schema problems. Here's a quick example:: class Reporter(models.Model): full_name = models.CharField(max_length=70) @@ -43,18 +44,20 @@ Install it ========== Next, run the Django command-line utility to create the database tables -automatically:: +automatically: + +.. code-block:: bash manage.py syncdb -The ``syncdb`` command looks at all your available models and creates tables -in your database for whichever tables don't already exist. +The :djadmin:`syncdb` command looks at all your available models and creates +tables in your database for whichever tables don't already exist. Enjoy the free API ================== -With that, you've got a free, and rich, Python API to access your data. The API -is created on the fly, no code generation necessary:: +With that, you've got a free, and rich, :ref:`Python API <topics-db-queries>` to +access your data. The API is created on the fly, no code generation necessary:: >>> from mysite.models import Reporter, Article @@ -128,15 +131,16 @@ A dynamic admin interface: it's not just scaffolding -- it's the whole house ============================================================================ Once your models are defined, Django can automatically create a professional, -production ready administrative interface -- a Web site that lets authenticated -users add, change and delete objects. It's as easy as adding a line of code to -your model classes:: +production ready :ref:`administrative interface <ref-contrib-admin>` -- a Web +site that lets authenticated users add, change and delete objects. It's as easy +as adding a line of code to your model classes:: class Article(models.Model): pub_date = models.DateTimeField() headline = models.CharField(max_length=200) content = models.TextField() reporter = models.ForeignKey(Reporter) + class Admin: pass The philosophy here is that your site is edited by a staff, or a client, or @@ -154,10 +158,10 @@ A clean, elegant URL scheme is an important detail in a high-quality Web application. Django encourages beautiful URL design and doesn't put any cruft in URLs, like ``.php`` or ``.asp``. -To design URLs for an app, you create a Python module called a URLconf. A table -of contents for your app, it contains a simple mapping between URL patterns and -Python callback functions. URLconfs also serve to decouple URLs from Python -code. +To design URLs for an app, you create a Python module called a :ref:`URLconf +<topics-http-urls>`. A table of contents for your app, it contains a simple mapping +between URL patterns and Python callback functions. URLconfs also serve to +decouple URLs from Python code. Here's what a URLconf might look like for the ``Reporter``/``Article`` example above:: @@ -190,8 +194,9 @@ Write your views ================ Each view is responsible for doing one of two things: Returning an -``HttpResponse`` object containing the content for the requested page, or -raising an exception such as ``Http404``. The rest is up to you. +:class:`~django.http.HttpResponse` object containing the content for the +requested page, or raising an exception such as :class:`~django.http.Http404`. +The rest is up to you. Generally, a view retrieves data according to the parameters, loads a template and renders the template with the retrieved data. Here's an example view for @@ -201,8 +206,9 @@ and renders the template with the retrieved data. Here's an example view for a_list = Article.objects.filter(pub_date__year=year) return render_to_response('news/year_archive.html', {'year': year, 'article_list': a_list}) -This example uses Django's template system, which has several powerful -features but strives to stay simple enough for non-programmers to use. +This example uses Django's :ref:`template system <topics-templates>`, which has +several powerful features but strives to stay simple enough for non-programmers +to use. Design your templates ===================== @@ -215,7 +221,9 @@ for templates. If a template doesn't exist in the first directory, it checks the second, and so on. Let's say the ``news/article_detail.html`` template was found. Here's what that -might look like:: +might look like: + +.. code-block:: html+django {% extends "base.html" %} @@ -252,7 +260,9 @@ Finally, Django uses the concept of "template inheritance": That's what the following blocks." In short, that lets you dramatically cut down on redundancy in templates: each template has to define only what's unique to that template. -Here's what the "base.html" template might look like:: +Here's what the "base.html" template might look like: + +.. code-block:: html+django <html> <head> @@ -287,17 +297,18 @@ This is just the surface This has been only a quick overview of Django's functionality. Some more useful features: - * A caching framework that integrates with memcached or other backends. - * A `syndication framework`_ that makes creating RSS and Atom feeds as easy as - writing a small Python class. + * A :ref:`caching framework <topics-cache>` that integrates with memcached + or other backends. + + * A :ref:`syndication framework <ref-contrib-syndication>` that makes + creating RSS and Atom feeds as easy as writing a small Python class. + * More sexy automatically-generated admin features -- this overview barely scratched the surface. -.. _syndication framework: ../syndication_feeds/ - -The next obvious steps are for you to `download Django`_, read `the tutorial`_ -and join `the community`_. Thanks for your interest! +The next obvious steps are for you to `download Django`_, read :ref:`the +tutorial <intro-tutorial01>` and join `the community`_. Thanks for your +interest! .. _download Django: http://www.djangoproject.com/download/ -.. _the tutorial: ../tutorial01/ .. _the community: http://www.djangoproject.com/community/ diff --git a/docs/tutorial01.txt b/docs/intro/tutorial01.txt similarity index 51% rename from docs/tutorial01.txt rename to docs/intro/tutorial01.txt index 6d7b10a053..08ebe1adbb 100644 --- a/docs/tutorial01.txt +++ b/docs/intro/tutorial01.txt @@ -1,3 +1,5 @@ +.. _intro-tutorial01: + ===================================== Writing your first Django app, part 1 ===================================== @@ -12,71 +14,70 @@ It'll consist of two parts: * A public site that lets people view polls and vote in them. * An admin site that lets you add, change and delete polls. -We'll assume you have `Django installed`_ already. You can tell Django is -installed by running the Python interactive interpreter and typing -``import django``. If that command runs successfully, with no errors, Django is -installed. - -.. _`Django installed`: ../install/ +We'll assume you have :ref:`Django installed <intro-install>` already. You can +tell Django is installed by running the Python interactive interpreter and +typing ``import django``. If that command runs successfully, with no errors, +Django is installed. .. admonition:: Where to get help: If you're having trouble going through this tutorial, please post a message - to `django-users`_ or drop by `#django`_ on ``irc.freenode.net`` to chat + to `django-users`__ or drop by `#django on irc.freenode.net`__ to chat with other Django users who might be able to help. -.. _django-users: http://groups.google.com/group/django-users -.. _#django: irc://irc.freenode.net/django +__ http://groups.google.com/group/django-users +__ irc://irc.freenode.net/django Creating a project ================== If this is your first time using Django, you'll have to take care of some -initial setup. Namely, you'll need to auto-generate some code that establishes -a Django *project* -- a collection of settings for an instance of Django, +initial setup. Namely, you'll need to auto-generate some code that establishes a +Django :term:`project` -- a collection of settings for an instance of Django, including database configuration, Django-specific options and application-specific settings. From the command line, ``cd`` into a directory where you'd like to store your -code, then run the command ``django-admin.py startproject mysite``. This -will create a ``mysite`` directory in your current directory. +code, then run the command ``django-admin.py startproject mysite``. This will +create a ``mysite`` directory in your current directory. .. admonition:: Mac OS X permissions - If you're using Mac OS X, you may see the message "permission - denied" when you try to run ``django-admin.py startproject``. This - is because, on Unix-based systems like OS X, a file must be marked - as "executable" before it can be run as a program. To do this, open - Terminal.app and navigate (using the ``cd`` command) to the directory - where ``django-admin.py`` is installed, then run the command + If you're using Mac OS X, you may see the message "permission denied" when + you try to run ``django-admin.py startproject``. This is because, on + Unix-based systems like OS X, a file must be marked as "executable" before it + can be run as a program. To do this, open Terminal.app and navigate (using + the ``cd`` command) to the directory where :ref:`django-admin.py + <ref-django-admin>` is installed, then run the command ``chmod +x django-admin.py``. .. note:: You'll need to avoid naming projects after built-in Python or Django components. In particular, this means you should avoid using names like - ``django`` (which will conflict with Django itself) or ``site`` (which + ``django`` (which will conflict with Django itself) or ``test`` (which conflicts with a built-in Python package). -(``django-admin.py`` should be on your system path if you installed Django via -``python setup.py``. If it's not on your path, you can find it in -``site-packages/django/bin``, where ``site-packages`` is a directory within -your Python installation. Consider symlinking to ``django-admin.py`` from some -place on your path, such as ``/usr/local/bin``.) +:ref:`django-admin.py <ref-django-admin>` should be on your system path if you +installed Django via ``python setup.py``. If it's not on your path, you can find +it in ``site-packages/django/bin``, where ```site-packages``` is a directory +within your Python installation. Consider symlinking to :ref:`django-admin.py +<ref-django-admin>` from some place on your path, such as +:file:`/usr/local/bin`. .. admonition:: Where should this code live? If your background is in PHP, you're probably used to putting code under the Web server's document root (in a place such as ``/var/www``). With Django, - you don't do that. It's not a good idea to put any of this Python code within - your Web server's document root, because it risks the possibility that - people may be able to view your code over the Web. That's not good for + you don't do that. It's not a good idea to put any of this Python code + within your Web server's document root, because it risks the possibility + that people may be able to view your code over the Web. That's not good for security. Put your code in some directory **outside** of the document root, such as - ``/home/mycode``. + :file:`/home/mycode`. -Let's look at what ``startproject`` created:: +Let's look at what :djadmin:`startproject` created:: mysite/ __init__.py @@ -86,28 +87,34 @@ Let's look at what ``startproject`` created:: These files are: - * ``__init__.py``: An empty file that tells Python that this directory + * :file:`__init__.py`: An empty file that tells Python that this directory should be considered a Python package. (Read `more about packages`_ in the official Python docs if you're a Python beginner.) - * ``manage.py``: A command-line utility that lets you interact with this - Django project in various ways. - * ``settings.py``: Settings/configuration for this Django project. - * ``urls.py``: The URL declarations for this Django project; a "table of - contents" of your Django-powered site. + + * :file:`manage.py`: A command-line utility that lets you interact with this + Django project in various ways. You can read all the details about + :file:`manage.py` in :ref:`ref-django-admin`. + + * :file:`settings.py`: Settings/configuration for this Django project. + :ref:`topics-settings` will tell you all about how settings work. + + * :file:`urls.py`: The URL declarations for this Django project; a "table of + contents" of your Django-powered site. You can read more about URLs in + :ref:`topics-http-urls`. .. _more about packages: http://docs.python.org/tut/node8.html#packages The development server ---------------------- -Let's verify this worked. Change into the ``mysite`` directory, if you +Let's verify this worked. Change into the :file:`mysite` directory, if you haven't already, and run the command ``python manage.py runserver``. You'll see the following output on the command line:: Validating models... 0 errors found. - Django version 0.95, using settings 'mysite.settings' + Django version 0.96, using settings 'mysite.settings' Development server is running at http://127.0.0.1:8000/ Quit the server with CONTROL-C (Unix) or CTRL-BREAK (Windows). @@ -126,40 +133,49 @@ It worked! .. admonition:: Changing the port - By default, the ``runserver`` command starts the development server on port - 8000. If you want to change the server's port, pass it as a command-line - argument. For instance, this command starts the server on port 8080:: + By default, the :djadmin:`runserver` command starts the development server + on port 8000. If you want to change the server's port, pass it as a + command-line argument. For instance, this command starts the server on port + 8080: + + .. code-block:: bash python manage.py runserver 8080 - Full docs for the development server are at `django-admin documentation`_. + Full docs for the development server can be found in the + :djadmin:`runserver` reference. -.. _django-admin documentation: ../django-admin/ Database setup -------------- -Now, edit ``settings.py``. It's a normal Python module with module-level +Now, edit :file:`settings.py`. It's a normal Python module with module-level variables representing Django settings. Change these settings to match your database's connection parameters: - * ``DATABASE_ENGINE`` -- Either 'postgresql_psycopg2', 'mysql' or 'sqlite3'. - Other backends are `also available`_. - * ``DATABASE_NAME`` -- The name of your database. If you're using - SQLite, the database will be a file on your computer; in that - case, ``DATABASE_NAME`` should be the full absolute path, - including filename, of that file. If the file doesn't exist, it - will automatically be created when you synchronize the database - for the first time (see below). - * ``DATABASE_USER`` -- Your database username (not used for SQLite). - * ``DATABASE_PASSWORD`` -- Your database password (not used for SQLite). - * ``DATABASE_HOST`` -- The host your database is on. Leave this as an - empty string if your database server is on the same physical machine - (not used for SQLite). + * :setting:`DATABASE_ENGINE` -- Either 'postgresql_psycopg2', 'mysql' or + 'sqlite3'. Other backends are :setting:`also available <DATABASE_ENGINE>`. + + * :setting:`DATABASE_NAME` -- The name of your database. If you're using + SQLite, the database will be a file on your computer; in that case, + ``DATABASE_NAME`` should be the full absolute path, including filename, of + that file. If the file doesn't exist, it will automatically be created + when you synchronize the database for the first time (see below). + + * :setting:`DATABASE_USER` -- Your database username (not used for SQLite). + + * :setting:`DATABASE_PASSWORD` -- Your database password (not used for + SQLite). + + * :setting:`DATABASE_HOST` -- The host your database is on. Leave this as an + empty string if your database server is on the same physical machine (not + used for SQLite). -.. _also available: ../settings/ +If you're new to databases, we recommend simply using SQLite (by setting +:setting:`DATABASE_ENGINE` to ``'sqlite3'``). SQLite is included as part of +Python 2.5 and later, so you won't need to install anything else. -.. admonition:: Note +.. note:: If you're using PostgreSQL or MySQL, make sure you've created a database by this point. Do that with "``CREATE DATABASE database_name;``" within your @@ -168,35 +184,39 @@ database's connection parameters: If you're using SQLite, you don't need to create anything beforehand - the database file will be created automatically when it is needed. -While you're editing ``settings.py``, take note of the ``INSTALLED_APPS`` -setting towards the bottom of the file. That variable holds the names of all -Django applications that are activated in this Django instance. Apps can be -used in multiple projects, and you can package and distribute them for use -by others in their projects. +While you're editing :file:`settings.py`, take note of the +:setting:`INSTALLED_APPS` setting towards the bottom of the file. That variable +holds the names of all Django applications that are activated in this Django +instance. Apps can be used in multiple projects, and you can package and +distribute them for use by others in their projects. -By default, ``INSTALLED_APPS`` contains the following apps, all of which come -with Django: +By default, :setting:`INSTALLED_APPS` contains the following apps, all of which +come with Django: - * ``django.contrib.auth`` -- An authentication system. - * ``django.contrib.contenttypes`` -- A framework for content types. - * ``django.contrib.sessions`` -- A session framework. - * ``django.contrib.sites`` -- A framework for managing multiple sites + * :mod:`django.contrib.auth` -- An authentication system. + + * :mod:`django.contrib.contenttypes` -- A framework for content types. + + * :mod:`django.contrib.sessions` -- A session framework. + + * :mod:`django.contrib.sites` -- A framework for managing multiple sites with one Django installation. -These applications are included by default as a convenience for the common -case. +These applications are included by default as a convenience for the common case. Each of these applications makes use of at least one database table, though, so we need to create the tables in the database before we can use them. To do -that, run the following command:: +that, run the following command: + +.. code-block:: bash python manage.py syncdb -The ``syncdb`` command looks at the ``INSTALLED_APPS`` setting and creates any -necessary database tables according to the database settings in your -``settings.py`` file. You'll see a message for each database table it creates, -and you'll get a prompt asking you if you'd like to create a superuser account -for the authentication system. Go ahead and do that. +The :djadmin:`syncdb` command looks at the :setting:`INSTALLED_APPS` setting and +creates any necessary database tables according to the database settings in your +:file:`settings.py` file. You'll see a message for each database table it +creates, and you'll get a prompt asking you if you'd like to create a superuser +account for the authentication system. Go ahead and do that. If you're interested, run the command-line client for your database and type ``\dt`` (PostgreSQL), ``SHOW TABLES;`` (MySQL), or ``.schema`` (SQLite) to @@ -207,8 +227,11 @@ display the tables Django created. Like we said above, the default applications are included for the common case, but not everybody needs them. If you don't need any or all of them, feel free to comment-out or delete the appropriate line(s) from - ``INSTALLED_APPS`` before running ``syncdb``. The ``syncdb`` command will - only create tables for apps in ``INSTALLED_APPS``. + :setting:`INSTALLED_APPS` before running :djadmin:`syncdb`. The + :djadmin:`syncdb` command will only create tables for apps in + :setting:`INSTALLED_APPS`. + +.. _creating-models: Creating models =============== @@ -229,17 +252,19 @@ so you can focus on writing code rather than creating directories. configuration and apps for a particular Web site. A project can contain multiple apps. An app can be in multiple projects. -In this tutorial, we'll create our poll app in the ``mysite`` directory, +In this tutorial, we'll create our poll app in the :file:`mysite` directory, for simplicity. As a consequence, the app will be coupled to the project -- that is, Python code within the poll app will refer to ``mysite.polls``. Later in this tutorial, we'll discuss decoupling your apps for distribution. -To create your app, make sure you're in the ``mysite`` directory and type -this command:: +To create your app, make sure you're in the :file:`mysite` directory and type +this command: + +.. code-block:: bash python manage.py startapp polls -That'll create a directory ``polls``, which is laid out like this:: +That'll create a directory :file:`polls`, which is laid out like this:: polls/ __init__.py @@ -253,17 +278,17 @@ The first step in writing a database Web app in Django is to define your models .. admonition:: Philosophy - A model is the single, definitive source of data about your - data. It contains the essential fields and behaviors of the data you're - storing. Django follows the `DRY Principle`_. The goal is to define your - data model in one place and automatically derive things from it. + A model is the single, definitive source of data about your data. It contains + the essential fields and behaviors of the data you're storing. Django follows + the :ref:`DRY Principle <dry>`. The goal is to define your data model in one + place and automatically derive things from it. In our simple poll app, we'll create two models: polls and choices. A poll has a question and a publication date. A choice has two fields: the text of the choice and a vote tally. Each choice is associated with a poll. These concepts are represented by simple Python classes. Edit the -``polls/models.py`` file so it looks like this:: +:file:`polls/models.py` file so it looks like this:: from django.db import models @@ -276,51 +301,54 @@ These concepts are represented by simple Python classes. Edit the choice = models.CharField(max_length=200) votes = models.IntegerField() -.. admonition:: Errors about ``max_length`` +.. admonition:: Errors about :attr:`~django.db.models.Field.max_length` - If Django gives you an error message saying that ``max_length`` is - not a valid argument, you're most likely using an old version of - Django. (This version of the tutorial is written for the latest - development version of Django.) If you're using a Subversion checkout - of Django's development version (see `the installation docs`_ for - more information), you shouldn't have any problems. + If Django gives you an error message saying that + :attr:`~django.db.models.Field.max_length` is not a valid argument, you're + most likely using an old version of Django. (This version of the tutorial is + written for the latest development version of Django.) If you're using a + Subversion checkout of Django's development version (see :ref:`the + installation docs <topics-install>` for more information), you shouldn't have + any problems. - If you want to stick with an older version of Django, you'll want to - switch to `the Django 0.96 tutorial`_, because this tutorial covers - several features that only exist in the Django development version. + If you want to stick with an older version of Django, you'll want to switch + to `the Django 0.96 tutorial`_, because this tutorial covers several features + that only exist in the Django development version. -.. _the installation docs: ../install/ -.. _the Django 0.96 tutorial: ../0.96/tutorial01/ +.. _the Django 0.96 tutorial: http://www.djangoproject.com/documentation/0.96/tutorial01/ The code is straightforward. Each model is represented by a class that -subclasses ``django.db.models.Model``. Each model has a number of class +subclasses :class:`django.db.models.Model`. Each model has a number of class variables, each of which represents a database field in the model. -Each field is represented by an instance of a ``models.*Field`` class -- e.g., -``models.CharField`` for character fields and ``models.DateTimeField`` for -datetimes. This tells Django what type of data each field holds. +Each field is represented by an instance of a :class:`~django.db.models.Field` +class -- e.g., :class:`~django.db.models.CharField` for character fields and +:class:`~django.db.models.DateTimeField` for datetimes. This tells Django what +type of data each field holds. -The name of each ``models.*Field`` instance (e.g. ``question`` or ``pub_date`` ) -is the field's name, in machine-friendly format. You'll use this value in your -Python code, and your database will use it as the column name. +The name of each :class:`~django.db.models.Field` instance (e.g. ``question`` or +``pub_date`` ) is the field's name, in machine-friendly format. You'll use this +value in your Python code, and your database will use it as the column name. -You can use an optional first positional argument to a ``Field`` to designate a -human-readable name. That's used in a couple of introspective parts of Django, -and it doubles as documentation. If this field isn't provided, Django will use -the machine-readable name. In this example, we've only defined a human-readable -name for ``Poll.pub_date``. For all other fields in this model, the field's -machine-readable name will suffice as its human-readable name. +You can use an optional first positional argument to a +:class:`~django.db.models.Field` to designate a human-readable name. That's used +in a couple of introspective parts of Django, and it doubles as documentation. +If this field isn't provided, Django will use the machine-readable name. In this +example, we've only defined a human-readable name for ``Poll.pub_date``. For all +other fields in this model, the field's machine-readable name will suffice as +its human-readable name. -Some ``Field`` classes have required elements. ``CharField``, for example, -requires that you give it a ``max_length``. That's used not only in the database +Some :class:`~django.db.models.Field` classes have required elements. +:class:`~django.db.models.CharField`, for example, requires that you give it a +:attr:`~django.db.models.Field.max_length`. That's used not only in the database schema, but in validation, as we'll soon see. -Finally, note a relationship is defined, using ``models.ForeignKey``. That tells -Django each Choice is related to a single Poll. Django supports all the common -database relationships: many-to-ones, many-to-manys and one-to-ones. +Finally, note a relationship is defined, using +:class:`~django.db.models.ForeignKey`. That tells Django each Choice is related +to a single Poll. Django supports all the common database relationships: +many-to-ones, many-to-manys and one-to-ones. .. _`Python path`: http://docs.python.org/tut/node8.html#SECTION008110000000000000000 -.. _DRY Principle: http://c2.com/cgi/wiki?DontRepeatYourself Activating models ================= @@ -339,8 +367,9 @@ But first we need to tell our project that the ``polls`` app is installed. you can distribute apps, because they don't have to be tied to a given Django installation. -Edit the ``settings.py`` file again, and change the ``INSTALLED_APPS`` setting -to include the string ``'mysite.polls'``. So it'll look like this:: +Edit the :file:`settings.py` file again, and change the +:setting:`INSTALLED_APPS` setting to include the string ``'mysite.polls'``. So +it'll look like this:: INSTALLED_APPS = ( 'django.contrib.auth', @@ -350,12 +379,17 @@ to include the string ``'mysite.polls'``. So it'll look like this:: 'mysite.polls' ) -Now Django knows ``mysite`` includes the ``polls`` app. Let's run another command:: +Now Django knows ``mysite`` includes the ``polls`` app. Let's run another +command: + +.. code-block:: bash python manage.py sql polls -You should see something similar to the following (the CREATE TABLE SQL statements -for the polls app):: +You should see something similar to the following (the ``CREATE TABLE`` SQL +statements for the polls app): + +.. code-block:: sql BEGIN; CREATE TABLE "polls_poll" ( @@ -384,7 +418,8 @@ Note the following: * By convention, Django appends ``"_id"`` to the foreign key field name. Yes, you can override this, as well. - * The foreign key relationship is made explicit by a ``REFERENCES`` statement. + * The foreign key relationship is made explicit by a ``REFERENCES`` + statement. * It's tailored to the database you're using, so database-specific field types such as ``auto_increment`` (MySQL), ``serial`` (PostgreSQL), or @@ -393,53 +428,58 @@ Note the following: quotes. The author of this tutorial runs PostgreSQL, so the example output is in PostgreSQL syntax. - * The ``sql`` command doesn't actually run the SQL in your database - it just - prints it to the screen so that you can see what SQL Django thinks is required. - If you wanted to, you could copy and paste this SQL into your database prompt. - However, as we will see shortly, Django provides an easier way of committing - the SQL to the database. + * The :djadmin:`sql` command doesn't actually run the SQL in your database - + it just prints it to the screen so that you can see what SQL Django thinks + is required. If you wanted to, you could copy and paste this SQL into your + database prompt. However, as we will see shortly, Django provides an + easier way of committing the SQL to the database. If you're interested, also run the following commands: - * ``python manage.py validate`` -- Checks for any errors in the - construction of your models. - * ``python manage.py sqlcustom polls`` -- Outputs any custom SQL statements - (such as table modifications or constraints) that are defined for the - application. + * :djadmin:`python manage.py validate <validate>` -- Checks for any errors + in the construction of your models. - * ``python manage.py sqlclear polls`` -- Outputs the necessary ``DROP - TABLE`` statements for this app, according to which tables already exist - in your database (if any). + * :djadmin:`python manage.py sqlcustom polls <sqlcustom>` -- Outputs any + :ref:`custom SQL statements <initial-sql>` (such as table modifications or + constraints) that are defined for the application. - * ``python manage.py sqlindexes polls`` -- Outputs the ``CREATE INDEX`` - statements for this app. + * :djadmin:`python manage.py sqlclear polls <sqlclear>` -- Outputs the + necessary ``DROP TABLE`` statements for this app, according to which + tables already exist in your database (if any). - * ``python manage.py sqlall polls`` -- A combination of all the SQL from - the 'sql', 'sqlcustom', and 'sqlindexes' commands. + * :djadmin:`python manage.py sqlindexes polls <sqlindexes>` -- Outputs the + ``CREATE INDEX`` statements for this app. + + * :djadmin:`python manage.py sqlall polls <sqlall>` -- A combination of all + the SQL from the :djadmin:`sql`, :djadmin:`sqlcustom`, and + :djadmin:`sqlindexes` commands. Looking at the output of those commands can help you understand what's actually happening under the hood. -Now, run ``syncdb`` again to create those model tables in your database:: +Now, run :djadmin:`syncdb` again to create those model tables in your database: + +.. code-block:: bash python manage.py syncdb -The ``syncdb`` command runs the sql from 'sqlall' on your database for all apps -in ``INSTALLED_APPS`` that don't already exist in your database. This creates -all the tables, initial data and indexes for any apps you have added to your -project since the last time you ran syncdb. ``syncdb`` can be called as often -as you like, and it will only ever create the tables that don't exist. +The :djadmin:`syncdb` command runs the sql from 'sqlall' on your database for +all apps in :setting:`INSTALLED_APPS` that don't already exist in your database. +This creates all the tables, initial data and indexes for any apps you have +added to your project since the last time you ran syncdb. :djadmin:`syncdb` can +be called as often as you like, and it will only ever create the tables that +don't exist. -Read the `django-admin.py documentation`_ for full information on what the -``manage.py`` utility can do. - -.. _django-admin.py documentation: ../django-admin/ +Read the :ref:`django-admin.py documentation <ref-django-admin>` for full +information on what the ``manage.py`` utility can do. Playing with the API ==================== Now, let's hop into the interactive Python shell and play around with the free -API Django gives you. To invoke the Python shell, use this command:: +API Django gives you. To invoke the Python shell, use this command: + +.. code-block:: bash python manage.py shell @@ -449,28 +489,28 @@ things: * Putting ``mysite`` on ``sys.path``. For flexibility, several pieces of Django refer to projects in Python dotted-path notation (e.g. - ``'mysite.polls.models'``). In order for this to work, the - ``mysite`` package has to be on ``sys.path``. + ``'mysite.polls.models'``). In order for this to work, the ``mysite`` + package has to be on ``sys.path``. - We've already seen one example of this: the ``INSTALLED_APPS`` setting is - a list of packages in dotted-path notation. + We've already seen one example of this: the :setting:`INSTALLED_APPS` + setting is a list of packages in dotted-path notation. * Setting the ``DJANGO_SETTINGS_MODULE`` environment variable, which gives Django the path to your ``settings.py`` file. .. admonition:: Bypassing manage.py - If you'd rather not use ``manage.py``, no problem. Just make sure - ``mysite`` is at the root level on the Python path (i.e., - ``import mysite`` works) and set the ``DJANGO_SETTINGS_MODULE`` - environment variable to ``mysite.settings``. + If you'd rather not use ``manage.py``, no problem. Just make sure ``mysite`` + is at the root level on the Python path (i.e., ``import mysite`` works) and + set the ``DJANGO_SETTINGS_MODULE`` environment variable to + ``mysite.settings``. - For more information on all of this, see the `django-admin.py documentation`_. + For more information on all of this, see the :ref:`django-admin.py + documentation <ref-django-admin>`. -Once you're in the shell, explore the database API:: +Once you're in the shell, explore the :ref:`database API <topics-db-queries>`:: - # Import the model classes we just wrote. - >>> from mysite.polls.models import Poll, Choice + >>> from mysite.polls.models import Poll, Choice # Import the model classes we just wrote. # No polls are in the system yet. >>> Poll.objects.all() @@ -505,10 +545,11 @@ Once you're in the shell, explore the database API:: [<Poll: Poll object>] -Wait a minute. ``<Poll: Poll object>`` is, utterly, an unhelpful -representation of this object. Let's fix that by editing the polls model (in -the ``polls/models.py`` file) and adding a ``__unicode__()`` method to both -``Poll`` and ``Choice``:: +Wait a minute. ``<Poll: Poll object>`` is, utterly, an unhelpful representation +of this object. Let's fix that by editing the polls model (in the +``polls/models.py`` file) and adding a +:meth:`~django.db.models.Model.__unicode__` method to both ``Poll`` and +``Choice``:: class Poll(models.Model): # ... @@ -520,43 +561,46 @@ the ``polls/models.py`` file) and adding a ``__unicode__()`` method to both def __unicode__(self): return self.choice -.. admonition:: If ``__unicode__()`` doesn't seem to work +.. admonition:: If :meth:`~django.db.models.Model.__unicode__` doesn't seem to work - If you add the ``__unicode__()`` method to your models and don't - see any change in how they're represented, you're most likely using - an old version of Django. (This version of the tutorial is written - for the latest development version of Django.) If you're using a - Subversion checkout of of Django's development version (see `the - installation docs`_ for more information), you shouldn't have any - problems. + If you add the :meth:`~django.db.models.Model.__unicode__` method to your + models and don't see any change in how they're represented, you're most + likely using an old version of Django. (This version of the tutorial is + written for the latest development version of Django.) If you're using a + Subversion checkout of of Django's development version (see :ref:`the + installation docs <topics-install>` for more information), you shouldn't have + any problems. - If you want to stick with an older version of Django, you'll want to - switch to `the Django 0.96 tutorial`_, because this tutorial covers - several features that only exist in the Django development version. + If you want to stick with an older version of Django, you'll want to switch + to `the Django 0.96 tutorial`_, because this tutorial covers several features + that only exist in the Django development version. -.. _the installation docs: ../install/ -.. _the Django 0.96 tutorial: ../0.96/tutorial01/ +.. _the Django 0.96 tutorial: http://www.djangoproject.com/documentation/0.96/tutorial01/ -It's important to add ``__unicode__()`` methods to your models, not only for -your own sanity when dealing with the interactive prompt, but also because -objects' representations are used throughout Django's automatically-generated -admin. +It's important to add :meth:`~django.db.models.Model.__unicode__` methods to +your models, not only for your own sanity when dealing with the interactive +prompt, but also because objects' representations are used throughout Django's +automatically-generated admin. -.. admonition:: Why ``__unicode__()`` and not ``__str__()``? +.. admonition:: Why :meth:`~django.db.models.Model.__unicode__` and not + :meth:`django.db.models.Model.__str__`? If you're familiar with Python, you might be in the habit of adding - ``__str__()`` methods to your classes, not ``__unicode__()`` methods. - We use ``__unicode__()`` here because Django models deal with Unicode by - default. All data stored in your database is converted to Unicode when it's - returned. + :meth:`django.db.models.Model.__str__` methods to your classes, not + :meth:`~django.db.models.Model.__unicode__` methods. We use + :meth:`~django.db.models.Model.__unicode__` here because Django models deal + with Unicode by default. All data stored in your database is converted to + Unicode when it's returned. - Django models have a default ``__str__()`` method that calls - ``__unicode__()`` and converts the result to a UTF-8 bytestring. This means - that ``unicode(p)`` will return a Unicode string, and ``str(p)`` will return - a normal string, with characters encoded as UTF-8. + Django models have a default :meth:`django.db.models.Model.__str__` method + that calls :meth:`~django.db.models.Model.__unicode__` and converts the + result to a UTF-8 bytestring. This means that ``unicode(p)`` will return a + Unicode string, and ``str(p)`` will return a normal string, with characters + encoded as UTF-8. - If all of this is jibberish to you, just remember to add ``__unicode__()`` - methods to your models. With any luck, things should Just Work for you. + If all of this is jibberish to you, just remember to add + :meth:`~django.db.models.Model.__unicode__` methods to your models. With any + luck, things should Just Work for you. Note these are normal Python methods. Let's add a custom method, just for demonstration:: @@ -639,10 +683,8 @@ Let's jump back into the Python interactive shell by running >>> c = p.choice_set.filter(choice__startswith='Just hacking') >>> c.delete() -For full details on the database API, see our `Database API reference`_. +For full details on the database API, see our :ref:`Database API reference +<topics-db-queries>`. -When you're comfortable with the API, read `part 2 of this tutorial`_ to get -Django's automatic admin working. - -.. _Database API reference: ../db-api/ -.. _part 2 of this tutorial: ../tutorial02/ +When you're comfortable with the API, read :ref:`part 2 of this tutorial +<intro-tutorial02>` to get Django's automatic admin working. diff --git a/docs/tutorial02.txt b/docs/intro/tutorial02.txt similarity index 72% rename from docs/tutorial02.txt rename to docs/intro/tutorial02.txt index 0b17593165..4af08c48af 100644 --- a/docs/tutorial02.txt +++ b/docs/intro/tutorial02.txt @@ -1,26 +1,27 @@ +.. _intro-tutorial02: + ===================================== Writing your first Django app, part 2 ===================================== -This tutorial begins where `Tutorial 1`_ left off. We're continuing the Web-poll -application and will focus on Django's automatically-generated admin site. - -.. _Tutorial 1: ../tutorial01/ +This tutorial begins where :ref:`Tutorial 1 <intro-tutorial01>` left off. We're +continuing the Web-poll application and will focus on Django's +automatically-generated admin site. .. admonition:: Philosophy Generating admin sites for your staff or clients to add, change and delete - content is tedious work that doesn't require much creativity. For that reason, - Django entirely automates creation of admin interfaces for models. - + content is tedious work that doesn't require much creativity. For that + reason, Django entirely automates creation of admin interfaces for models. + Django was written in a newsroom environment, with a very clear separation between "content publishers" and the "public" site. Site managers use the system to add news stories, events, sports scores, etc., and that content is - displayed on the public site. Django solves the problem of creating a unified - interface for site administrators to edit content. - - The admin isn't necessarily intended to be used by site visitors; it's for site - managers. + displayed on the public site. Django solves the problem of creating a + unified interface for site administrators to edit content. + + The admin isn't necessarily intended to be used by site visitors; it's for + site managers. Activate the admin site ======================= @@ -28,10 +29,10 @@ Activate the admin site The Django admin site is not activated by default -- it's an opt-in thing. To activate the admin site for your installation, do these three things: - * Add ``"django.contrib.admin"`` to your ``INSTALLED_APPS`` setting. + * Add ``"django.contrib.admin"`` to your :setting:`INSTALLED_APPS` setting. * Run ``python manage.py syncdb``. Since you have added a new application - to ``INSTALLED_APPS``, the database tables need to be updated. + to :setting:`INSTALLED_APPS`, the database tables need to be updated. * Edit your ``mysite/urls.py`` file and uncomment the lines below the "Uncomment this for admin:" comments. This file is a URLconf; we'll dig @@ -65,14 +66,16 @@ Start the development server Let's start the development server and explore the admin site. -Recall from Tutorial 1 that you start the development server like so:: +Recall from Tutorial 1 that you start the development server like so: + +.. code-block:: bash python manage.py runserver Now, open a Web browser and go to "/admin/" on your local domain -- e.g., http://127.0.0.1:8000/admin/. You should see the admin's login screen: -.. image:: http://media.djangoproject.com/img/doc/tutorial-trunk/admin01.png +.. image:: _images/admin01.png :alt: Django admin login screen Enter the admin site @@ -81,24 +84,22 @@ Enter the admin site Now, try logging in. (You created a superuser account in the first part of this tutorial, remember?) You should see the Django admin index page: -.. image:: http://media.djangoproject.com/img/doc/tutorial-trunk/admin02t.png +.. image:: _images/admin02t.png :alt: Django admin index page - :target: http://media.djangoproject.com/img/doc/tutorial-trunk/admin02.png You should see a few other types of editable content, including groups, users and sites. These are core features Django ships with by default. -.. _"I can't log in" questions: ../faq/#the-admin-site - Make the poll app modifiable in the admin ========================================= But where's our poll app? It's not displayed on the admin index page. Just one thing to do: We need to tell the admin that ``Poll`` -objects have an admin interface. Edit the ``mysite/polls/models.py`` file and +objects have an admin interface. Edit the ``mysite/polls/admin.py`` file and add the following to the bottom of the file:: + from mysite.polls.models import Poll from django.contrib import admin admin.site.register(Poll) @@ -113,52 +114,54 @@ Explore the free admin functionality Now that we've registered ``Poll``, Django knows that it should be displayed on the admin index page: -.. image:: http://media.djangoproject.com/img/doc/tutorial-trunk/admin03t.png +.. image:: _images/admin03t.png :alt: Django admin index page, now with polls displayed - :target: http://media.djangoproject.com/img/doc/tutorial-trunk/admin03.png Click "Polls." Now you're at the "change list" page for polls. This page displays all the polls in the database and lets you choose one to change it. There's the "What's up?" poll we created in the first tutorial: -.. image:: http://media.djangoproject.com/img/doc/tutorial-trunk/admin04t.png +.. image:: _images/admin04t.png :alt: Polls change list page - :target: http://media.djangoproject.com/img/doc/tutorial-trunk/admin04.png Click the "What's up?" poll to edit it: -.. image:: http://media.djangoproject.com/img/doc/tutorial-trunk/admin05t.png +.. image:: _images/admin05t.png :alt: Editing form for poll object - :target: http://media.djangoproject.com/img/doc/tutorial-trunk/admin05.png Things to note here: -* The form is automatically generated from the Poll model. -* The different model field types (``models.DateTimeField``, ``models.CharField``) - correspond to the appropriate HTML input widget. Each type of field knows - how to display itself in the Django admin. -* Each ``DateTimeField`` gets free JavaScript shortcuts. Dates get a "Today" - shortcut and calendar popup, and times get a "Now" shortcut and a convenient - popup that lists commonly entered times. + * The form is automatically generated from the Poll model. + + * The different model field types (:class:`~django.db.models.DateTimeField`, + :class:`~django.db.models.CharField`) correspond to the appropriate HTML + input widget. Each type of field knows how to display itself in the Django + admin. + + * Each :class:`~django.db.models.DateTimeField` gets free JavaScript + shortcuts. Dates get a "Today" shortcut and calendar popup, and times get + a "Now" shortcut and a convenient popup that lists commonly entered times. The bottom part of the page gives you a couple of options: -* Save -- Saves changes and returns to the change-list page for this type of - object. -* Save and continue editing -- Saves changes and reloads the admin page for - this object. -* Save and add another -- Saves changes and loads a new, blank form for this - type of object. -* Delete -- Displays a delete confirmation page. + * Save -- Saves changes and returns to the change-list page for this type of + object. + + * Save and continue editing -- Saves changes and reloads the admin page for + this object. + + * Save and add another -- Saves changes and loads a new, blank form for this + type of object. + + * Delete -- Displays a delete confirmation page. Change the "Date published" by clicking the "Today" and "Now" shortcuts. Then click "Save and continue editing." Then click "History" in the upper right. You'll see a page listing all changes made to this object via the Django admin, with the timestamp and username of the person who made the change: -.. image:: http://media.djangoproject.com/img/doc/tutorial-trunk/admin06t.png +.. image:: _images/admin06t.png :alt: History page for poll object - :target: http://media.djangoproject.com/img/doc/tutorial-trunk/admin06.png Customize the admin form ======================== @@ -184,7 +187,7 @@ admin options for an object. This particular change above makes the "Publication date" come before the "Question" field: -.. image:: http://media.djangoproject.com/img/doc/tutorial-trunk/admin07.png +.. image:: _images/admin07.png :alt: Fields have been reordered This isn't impressive with only two fields, but for admin forms with dozens @@ -204,9 +207,8 @@ up into fieldsets:: The first element of each tuple in ``fieldsets`` is the title of the fieldset. Here's what our form looks like now: -.. image:: http://media.djangoproject.com/img/doc/tutorial-trunk/admin08t.png +.. image:: _images/admin08t.png :alt: Form has fieldsets now - :target: http://media.djangoproject.com/img/doc/tutorial-trunk/admin08.png You can assign arbitrary HTML classes to each fieldset. Django provides a ``"collapse"`` class that displays a particular fieldset initially collapsed. @@ -219,7 +221,7 @@ aren't commonly used:: ('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}), ] -.. image:: http://media.djangoproject.com/img/doc/tutorial-trunk/admin09.png +.. image:: _images/admin09.png :alt: Fieldset is initially collapsed Adding related objects @@ -232,18 +234,21 @@ Yet. There are two ways to solve this problem. The first register ``Choice`` with the admin just as we did with ``Poll``. That's easy:: - + + from mysite.polls.models import Choice + admin.site.register(Choice) Now "Choices" is an available option in the Django admin. The "Add choice" form looks like this: -.. image:: http://media.djangoproject.com/img/doc/tutorial-trunk/admin10.png +.. image:: _images/admin10.png :alt: Choice admin page In that form, the "Poll" field is a select box containing every poll in the -database. Django knows that a ``ForeignKey`` should be represented in the admin -as a ``<select>`` box. In our case, only one poll exists at this point. +database. Django knows that a :class:`~django.db.models.ForeignKey` should be +represented in the admin as a ``<select>`` box. In our case, only one poll +exists at this point. Also note the "Add Another" link next to "Poll." Every object with a ``ForeignKey`` relationship to another gets this for free. When you click "Add @@ -259,6 +264,7 @@ Poll object. Let's make that happen. Remove the ``register()`` call for the Choice model. Then, edit the ``Poll`` registration code to read:: + poll = models.ForeignKey(Poll, edit_inline=models.STACKED, num_in_admin=3) class ChoiceInline(admin.StackedInline): model = Choice extra = 3 @@ -277,16 +283,15 @@ default, provide enough fields for 3 choices." Load the "Add poll" page to see how that looks: -.. image:: http://media.djangoproject.com/img/doc/tutorial-trunk/admin11t.png +.. image:: _images/admin11t.png :alt: Add poll page now has choices on it - :target: http://media.djangoproject.com/img/doc/tutorial-trunk/admin11.png It works like this: There are three slots for related Choices -- as specified by ``extra`` -- and each time you come back to the "Change" page for an already-created object, you get another three extra slots. One small problem, though. It takes a lot of screen space to display all the -fields for entering related Choice objects. For that reason, Django offers an +fields for entering related Choice objects. For that reason, Django offers a tabular way of displaying inline related objects; you just need to change the ``ChoiceInline`` declaration to read:: @@ -296,7 +301,7 @@ the ``ChoiceInline`` declaration to read:: With that ``TabularInline`` (instead of ``StackedInline``), the related objects are displayed in a more compact, table-based format: -.. image:: http://media.djangoproject.com/img/doc/tutorial-trunk/admin12.png +.. image:: _images/admin12.png :alt: Add poll page now has more compact choices Customize the admin change list @@ -307,9 +312,8 @@ Now that the Poll admin page is looking good, let's make some tweaks to the Here's what it looks like at this point: -.. image:: http://media.djangoproject.com/img/doc/tutorial-trunk/admin04t.png +.. image:: _images/admin04t.png :alt: Polls change list page - :target: http://media.djangoproject.com/img/doc/tutorial-trunk/admin04.png By default, Django displays the ``str()`` of each object. But sometimes it'd be more helpful if we could display individual fields. To do that, use the @@ -329,9 +333,8 @@ method from Tutorial 1:: Now the poll change list page looks like this: -.. image:: http://media.djangoproject.com/img/doc/tutorial-trunk/admin13t.png +.. image:: _images/admin13t.png :alt: Polls change list page, updated - :target: http://media.djangoproject.com/img/doc/tutorial-trunk/admin13.png You can click on the column headers to sort by those values -- except in the case of the ``was_published_today`` header, because sorting by the output of @@ -352,9 +355,8 @@ following line to ``PollAdmin``:: That adds a "Filter" sidebar that lets people filter the change list by the ``pub_date`` field: -.. image:: http://media.djangoproject.com/img/doc/tutorial-trunk/admin14t.png +.. image:: _images/admin14t.png :alt: Polls change list page, updated - :target: http://media.djangoproject.com/img/doc/tutorial-trunk/admin14.png The type of filter displayed depends on the type of field you're filtering on. Because ``pub_date`` is a DateTimeField, Django knows to give the default @@ -395,11 +397,12 @@ is powered by Django itself, and its interfaces use Django's own template system. (How meta!) Open your settings file (``mysite/settings.py``, remember) and look at the -``TEMPLATE_DIRS`` setting. ``TEMPLATE_DIRS`` is a tuple of filesystem -directories to check when loading Django templates. It's a search path. +:setting:`TEMPLATE_DIRS` setting. :setting:`TEMPLATE_DIRS` is a tuple of +filesystem directories to check when loading Django templates. It's a search +path. -By default, ``TEMPLATE_DIRS`` is empty. So, let's add a line to it, to tell -Django where our templates live:: +By default, :setting:`TEMPLATE_DIRS` is empty. So, let's add a line to it, to +tell Django where our templates live:: TEMPLATE_DIRS = ( "/home/my_username/mytemplates", # Change this to your own directory. @@ -407,9 +410,10 @@ Django where our templates live:: Now copy the template ``admin/base_site.html`` from within the default Django admin template directory (``django/contrib/admin/templates``) into an ``admin`` -subdirectory of whichever directory you're using in ``TEMPLATE_DIRS``. For -example, if your ``TEMPLATE_DIRS`` includes ``"/home/my_username/mytemplates"``, -as above, then copy ``django/contrib/admin/templates/admin/base_site.html`` to +subdirectory of whichever directory you're using in :setting:`TEMPLATE_DIRS`. +For example, if your :setting:`TEMPLATE_DIRS` includes +``"/home/my_username/mytemplates"``, as above, then copy +``django/contrib/admin/templates/admin/base_site.html`` to ``/home/my_username/mytemplates/admin/base_site.html``. Don't forget that ``admin`` subdirectory. @@ -421,13 +425,11 @@ override a template, just do the same thing you did with ``base_site.html`` -- copy it from the default directory into your custom directory, and make changes. -Astute readers will ask: But if ``TEMPLATE_DIRS`` was empty by default, how was -Django finding the default admin templates? The answer is that, by default, -Django automatically looks for a ``templates/`` subdirectory within each app -package, for use as a fallback. See the `loader types documentation`_ for full -information. - -.. _loader types documentation: ../templates_python/#loader-types +Astute readers will ask: But if :setting:`TEMPLATE_DIRS` was empty by default, +how was Django finding the default admin templates? The answer is that, by +default, Django automatically looks for a ``templates/`` subdirectory within +each app package, for use as a fallback. See the :ref:`template loader +documentation <template-loaders>` for full information. Customize the admin index page ============================== @@ -435,10 +437,10 @@ Customize the admin index page On a similar note, you might want to customize the look and feel of the Django admin index page. -By default, it displays all the apps in your ``INSTALLED_APPS`` setting that -have been registered with the admin application, in alphabetical order. You -may want to make significant changes to the layout. After all, the index is -probably the most important page of the admin, and it should be easy to use. +By default, it displays all the apps in :setting:`INSTALLED_APPS` that have been +registered with the admin application, in alphabetical order. You may want to +make significant changes to the layout. After all, the index is probably the +most important page of the admin, and it should be easy to use. The template to customize is ``admin/index.html``. (Do the same as with ``admin/base_site.html`` in the previous section -- copy it from the default @@ -447,15 +449,9 @@ uses a template variable called ``app_list``. That variable contains every installed Django app. Instead of using that, you can hard-code links to object-specific admin pages in whatever way you think is best. -Django offers another shortcut in this department. Run the command -``python manage.py adminindex polls`` to get a chunk of template code for -inclusion in the admin index template. It's a useful starting point. +Django offers another shortcut in this department. Run the command ``python +manage.py adminindex polls`` to get a chunk of template code for inclusion in +the admin index template. It's a useful starting point. -For full details on customizing the look and feel of the Django admin site in -general, see the `Django admin CSS guide`_. - -When you're comfortable with the admin site, read `part 3 of this tutorial`_ to -start working on public poll views. - -.. _Django admin CSS guide: ../admin_css/ -.. _part 3 of this tutorial: ../tutorial03/ +When you're comfortable with the admin site, read :ref:`part 3 of this tutorial +<intro-tutorial03>` to start working on public poll views. diff --git a/docs/tutorial03.txt b/docs/intro/tutorial03.txt similarity index 65% rename from docs/tutorial03.txt rename to docs/intro/tutorial03.txt index 2ac106229f..6d40a5bfcb 100644 --- a/docs/tutorial03.txt +++ b/docs/intro/tutorial03.txt @@ -1,11 +1,12 @@ +.. _intro-tutorial03: + ===================================== Writing your first Django app, part 3 ===================================== -This tutorial begins where `Tutorial 2`_ left off. We're continuing the Web-poll -application and will focus on creating the public interface -- "views." - -.. _Tutorial 2: ../tutorial02/ +This tutorial begins where :ref:`Tutorial 2 <intro-tutorial02>` left off. We're +continuing the Web-poll application and will focus on creating the public +interface -- "views." Philosophy ========== @@ -15,20 +16,28 @@ a specific function and has a specific template. For example, in a weblog application, you might have the following views: * Blog homepage -- displays the latest few entries. + * Entry "detail" page -- permalink page for a single entry. + * Year-based archive page -- displays all months with entries in the given year. + * Month-based archive page -- displays all days with entries in the given month. + * Day-based archive page -- displays all entries in the given day. + * Comment action -- handles posting comments to a given entry. In our poll application, we'll have the following four views: * Poll "archive" page -- displays the latest few polls. + * Poll "detail" page -- displays a poll question, with no results but with a form to vote. + * Poll "results" page -- displays results for a particular poll. + * Vote action -- handles voting for a particular choice in a particular poll. @@ -42,8 +51,8 @@ creating a Python module, called a URLconf. URLconfs are how Django associates a given URL with given Python code. When a user requests a Django-powered page, the system looks at the -``ROOT_URLCONF`` setting, which contains a string in Python dotted syntax. -Django loads that module and looks for a module-level variable called +:setting:`ROOT_URLCONF` setting, which contains a string in Python dotted +syntax. Django loads that module and looks for a module-level variable called ``urlpatterns``, which is a sequence of tuples in the following format:: (regular expression, Python callback function [, optional dictionary]) @@ -53,17 +62,19 @@ comparing the requested URL against each regular expression until it finds one that matches. When it finds a match, Django calls the Python callback function, with an -``HTTPRequest`` object as the first argument, any "captured" values from the -regular expression as keyword arguments, and, optionally, arbitrary keyword -arguments from the dictionary (an optional third item in the tuple). +:class:`~django.http.HttpRequest` object as the first argument, any "captured" +values from the regular expression as keyword arguments, and, optionally, +arbitrary keyword arguments from the dictionary (an optional third item in the +tuple). -For more on ``HTTPRequest`` objects, see the `request and response documentation`_. -For more details on URLconfs, see the `URLconf documentation`_. +For more on :class:`~django.http.HttpRequest` objects, see the +:ref:`ref-request-response`. For more details on URLconfs, see the +:ref:`topics-http-urls`. When you ran ``python django-admin.py startproject mysite`` at the beginning of Tutorial 1, it created a default URLconf in ``mysite/urls.py``. It also -automatically set your ``ROOT_URLCONF`` setting (in ``settings.py``) to point -at that file:: +automatically set your :setting:`ROOT_URLCONF` setting (in ``settings.py``) to +point at that file:: ROOT_URLCONF = 'mysite.urls' @@ -78,27 +89,27 @@ Time for an example. Edit ``mysite/urls.py`` so it looks like this:: (r'^polls/(?P<poll_id>\d+)/vote/$', 'mysite.polls.views.vote'), ) -This is worth a review. When somebody requests a page from your Web site -- -say, "/polls/23/", Django will load this Python module, because it's pointed to -by the ``ROOT_URLCONF`` setting. It finds the variable named ``urlpatterns`` +This is worth a review. When somebody requests a page from your Web site -- say, +"/polls/23/", Django will load this Python module, because it's pointed to by +the :setting:`ROOT_URLCONF` setting. It finds the variable named ``urlpatterns`` and traverses the regular expressions in order. When it finds a regular expression that matches -- ``r'^polls/(?P<poll_id>\d+)/$'`` -- it loads the associated Python package/module: ``mysite.polls.views.detail``. That -corresponds to the function ``detail()`` in ``mysite/polls/views.py``. -Finally, it calls that ``detail()`` function like so:: +corresponds to the function ``detail()`` in ``mysite/polls/views.py``. Finally, +it calls that ``detail()`` function like so:: detail(request=<HttpRequest object>, poll_id='23') -The ``poll_id='23'`` part comes from ``(?P<poll_id>\d+)``. Using parenthesis around a -pattern "captures" the text matched by that pattern and sends it as an argument -to the view function; the ``?P<poll_id>`` defines the name that will be used to -identify the matched pattern; and ``\d+`` is a regular expression to match a sequence of -digits (i.e., a number). +The ``poll_id='23'`` part comes from ``(?P<poll_id>\d+)``. Using parenthesis +around a pattern "captures" the text matched by that pattern and sends it as an +argument to the view function; the ``?P<poll_id>`` defines the name that will be +used to identify the matched pattern; and ``\d+`` is a regular expression to +match a sequence of digits (i.e., a number). Because the URL patterns are regular expressions, there really is no limit on -what you can do with them. And there's no need to add URL cruft such as -``.php`` -- unless you have a sick sense of humor, in which case you can do -something like this:: +what you can do with them. And there's no need to add URL cruft such as ``.php`` +-- unless you have a sick sense of humor, in which case you can do something +like this:: (r'^polls/latest\.php$', 'mysite.polls.views.index'), @@ -110,16 +121,14 @@ the URLconf will look for ``/myapp/``. In a request to ``http://www.example.com/myapp/?page=3``, the URLconf will look for ``/myapp/``. If you need help with regular expressions, see `Wikipedia's entry`_ and the -`Python documentation`_. Also, the O'Reilly book "Mastering Regular -Expressions" by Jeffrey Friedl is fantastic. +`Python documentation`_. Also, the O'Reilly book "Mastering Regular Expressions" +by Jeffrey Friedl is fantastic. Finally, a performance note: these regular expressions are compiled the first time the URLconf module is loaded. They're super fast. .. _Wikipedia's entry: http://en.wikipedia.org/wiki/Regular_expression .. _Python documentation: http://www.python.org/doc/current/lib/module-re.html -.. _request and response documentation: ../request_response/ -.. _URLconf documentation: ../url_dispatch/ Write your first view ===================== @@ -127,7 +136,9 @@ Write your first view Well, we haven't created any views yet -- we just have the URLconf. But let's make sure Django is following the URLconf properly. -Fire up the Django development Web server:: +Fire up the Django development Web server: + +.. code-block:: bash python manage.py runserver @@ -170,21 +181,22 @@ provide in the URL. Write views that actually do something ====================================== -Each view is responsible for doing one of two things: Returning an ``HttpResponse`` -object containing the content for the requested page, or raising an exception -such as ``Http404``. The rest is up to you. +Each view is responsible for doing one of two things: Returning an +:class:`~django.http.HttpResponse` object containing the content for the +requested page, or raising an exception such as :exc:`~django.http.Http404`. The +rest is up to you. Your view can read records from a database, or not. It can use a template system such as Django's -- or a third-party Python template system -- 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. -All Django wants is that ``HttpResponse``. Or an exception. +All Django wants is that :class:`~django.http.HttpResponse`. Or an exception. Because it's convenient, let's use Django's own database API, which we covered -in Tutorial 1. Here's one stab at the ``index()`` view, which displays the -latest 5 poll questions in the system, separated by commas, according to -publication date:: +in :ref:`Tutorial 1 <intro-tutorial01>`. Here's one stab at the ``index()`` +view, which displays the latest 5 poll questions in the system, separated by +commas, according to publication date:: from mysite.polls.models import Poll from django.http import HttpResponse @@ -210,8 +222,8 @@ So let's use Django's template system to separate the design from Python:: }) return HttpResponse(t.render(c)) -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. +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. Reload the page. Now you'll see an error:: @@ -219,20 +231,21 @@ Reload the page. Now you'll see an error:: polls/index.html Ah. There'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't put them under your document root, though. You -probably shouldn't make them public, just for security's sake. - -Then edit ``TEMPLATE_DIRS`` in your ``settings.py`` to tell Django where it can -find templates -- just as you did in the "Customize the admin look and feel" -section of Tutorial 2. +filesystem, whose contents Django can access. (Django runs as whatever user your +server runs.) Don't put them under your document root, though. You probably +shouldn't make them public, just for security's sake. +Then edit :setting:`TEMPLATE_DIRS` in your ``settings.py`` to tell Django where +it can find templates -- just as you did in the "Customize the admin look and +feel" section of Tutorial 2. When you've done that, create a directory ``polls`` in your template directory. Within that, create a file called ``index.html``. Note that our ``loader.get_template('polls/index.html')`` code from above maps to "[template_directory]/polls/index.html" on the filesystem. -Put the following code in that template:: +Put the following code in that template: + +.. code-block:: html+django {% if latest_poll_list %} <ul> @@ -251,8 +264,9 @@ A shortcut: render_to_response() -------------------------------- It's a very common idiom to load a template, fill a context and return an -``HttpResponse`` object with the result of the rendered template. Django -provides a shortcut. Here's the full ``index()`` view, rewritten:: +:class:`~django.http.HttpResponse` object with the result of the rendered +template. Django provides a shortcut. Here's the full ``index()`` view, +rewritten:: from django.shortcuts import render_to_response from mysite.polls.models import Poll @@ -261,11 +275,14 @@ provides a shortcut. Here's the full ``index()`` view, rewritten:: latest_poll_list = Poll.objects.all().order_by('-pub_date')[:5] return render_to_response('polls/index.html', {'latest_poll_list': latest_poll_list}) -Note that once we've done this in all these views, we no longer need to import ``loader``, ``Context`` and ``HttpResponse``. +Note that once we've done this in all these views, we no longer need to import +:mod:`~django.template.loader`, :class:`~django.template.Context` and +:class:`~django.http.HttpResponse`. -The ``render_to_response()`` function takes a template name as its first -argument and a dictionary as its optional second argument. It returns an -``HttpResponse`` object of the given template rendered with the given context. +The :func:`~django.shortcuts.render_to_response` function takes a template name +as its first argument and a dictionary as its optional second argument. It +returns an :class:`~django.http.HttpResponse` object of the given template +rendered with the given context. Raising 404 =========== @@ -282,15 +299,15 @@ for a given poll. Here's the view:: raise Http404 return render_to_response('polls/detail.html', {'poll': p}) -The new concept here: The view raises the ``django.http.Http404`` -exception if a poll with the requested ID doesn't exist. +The new concept here: The view raises the :exc:`~django.http.Http404` exception +if a poll with the requested ID doesn't exist. A shortcut: get_object_or_404() ------------------------------- -It's a very common idiom to use ``get()`` and raise ``Http404`` if the -object doesn't exist. Django provides a shortcut. Here's the ``detail()`` view, -rewritten:: +It's a very common idiom to use :meth:`~django.db.models.QuerySet.get` and raise +:exc:`~django.http.Http404` if the object doesn't exist. Django provides a +shortcut. Here's the ``detail()`` view, rewritten:: from django.shortcuts import render_to_response, get_object_or_404 # ... @@ -298,32 +315,36 @@ rewritten:: p = get_object_or_404(Poll, pk=poll_id) return render_to_response('polls/detail.html', {'poll': p}) -The ``get_object_or_404()`` function takes a Django model module as its first -argument and an arbitrary number of keyword arguments, which it passes to the -module's ``get()`` function. It raises ``Http404`` if the object doesn't -exist. +The :func:`~django.shortcuts.get_object_or_404` function takes a Django model +module as its first argument and an arbitrary number of keyword arguments, which +it passes to the module's :meth:`~django.db.models.QuerySet.get` function. It +raises :exc:`~django.http.Http404` if the object doesn't exist. .. admonition:: Philosophy - Why do we use a helper function ``get_object_or_404()`` instead of - automatically catching the ``DoesNotExist`` exceptions at a higher level, - or having the model API raise ``Http404`` instead of ``DoesNotExist``? + Why do we use a helper function :func:`~django.shortcuts.get_object_or_404` + instead of automatically catching the + :exc:`~django.core.exceptions.ObjectDoesNotExist` exceptions at a higher + level, or having the model API raise :exc:`~django.http.Http404` instead of + :exc:`~django.core.exceptions.ObjectDoesNotExist`? Because that would couple the model layer to the view layer. One of the foremost design goals of Django is to maintain loose coupling. -There's also a ``get_list_or_404()`` function, which works just as -``get_object_or_404()`` -- except using ``filter()`` instead of -``get()``. It raises ``Http404`` if the list is empty. +There's also a :func:`~django.shortcuts.get_list_or_404` function, which works +just as :func:`~django.shortcuts.get_object_or_404` -- except using +:meth:`~django.db.models.QuerySet.filter` instead of +:meth:`~django.db.models.QuerySet.get`. It raises :exc:`~django.http.Http404` if +the list is empty. Write a 404 (page not found) view ================================= -When you raise ``Http404`` from within a view, Django will load a special view -devoted to handling 404 errors. It finds it by looking for the variable -``handler404``, which is a string in Python dotted syntax -- the same format -the normal URLconf callbacks use. A 404 view itself has nothing special: It's -just a normal view. +When you raise :exc:`~django.http.Http404` from within a view, Django will load +a special view devoted to handling 404 errors. It finds it by looking for the +variable ``handler404``, which is a string in Python dotted syntax -- the same +format the normal URLconf callbacks use. A 404 view itself has nothing special: +It's just a normal view. You normally won't have to bother with writing 404 views. By default, URLconfs have the following line up top:: @@ -332,18 +353,20 @@ have the following line up top:: That takes care of setting ``handler404`` in the current module. As you can see in ``django/conf/urls/defaults.py``, ``handler404`` is set to -``'django.views.defaults.page_not_found'`` by default. +:func:`django.views.defaults.page_not_found` by default. Three more things to note about 404 views: * The 404 view is also called if Django doesn't find a match after checking every regular expression in the URLconf. - * If you don't define your own 404 view -- and simply use the default, - which is recommended -- you still have one obligation: To create a - ``404.html`` template in the root of your template directory. The default - 404 view will use that template for all 404 errors. - * If ``DEBUG`` is set to ``True`` (in your settings module) then your 404 - view will never be used, and the traceback will be displayed instead. + + * If you don't define your own 404 view -- and simply use the default, which + is recommended -- you still have one obligation: To create a ``404.html`` + template in the root of your template directory. The default 404 view will + use that template for all 404 errors. + + * If :setting:`DEBUG` is set to ``True`` (in your settings module) then your + 404 view will never be used, and the traceback will be displayed instead. Write a 500 (server error) view =============================== @@ -355,9 +378,11 @@ view code. Use the template system ======================= -Back to the ``detail()`` view for our poll application. Given the context +Back to the ``detail()`` view for our poll application. Given the context variable ``poll``, here's what the "polls/detail.html" template might look -like:: +like: + +.. code-block:: html+django <h1>{{ poll.question }}</h1> <ul> @@ -376,9 +401,7 @@ Method-calling happens in the ``{% for %}`` loop: ``poll.choice_set.all`` is interpreted as the Python code ``poll.choice_set.all()``, which returns an iterable of Choice objects and is suitable for use in the ``{% for %}`` tag. -See the `template guide`_ for full details on how templates work. - -.. _template guide: ../templates/ +See the :ref:`template guide <topics-templates>` for more about templates. Simplifying the URLconfs ======================== @@ -397,7 +420,7 @@ Namely, ``mysite.polls.views`` is in every callback. 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 ``patterns()``, like so:: +first argument to :func:`~django.conf.urls.defaults.patterns`, like so:: urlpatterns = patterns('mysite.polls.views', (r'^polls/$', 'index'), @@ -414,7 +437,7 @@ Decoupling the URLconfs While we'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 -- that -is, each particular app should be transferrable to another Django installation +is, each particular app should be transferable to another Django installation with minimal fuss. Our poll app is pretty decoupled at this point, thanks to the strict directory @@ -425,28 +448,29 @@ We've been editing the URLs in ``mysite/urls.py``, but the URL design of an app is specific to the app, not to the Django installation -- so let's move the URLs within the app directory. -Copy the file ``mysite/urls.py`` to ``mysite/polls/urls.py``. Then, -change ``mysite/urls.py`` to remove the poll-specific URLs and insert an -``include()``:: +Copy the file ``mysite/urls.py`` to ``mysite/polls/urls.py``. Then, change +``mysite/urls.py`` to remove the poll-specific URLs and insert an +:func:`~django.conf.urls.defaults.include`:: (r'^polls/', include('mysite.polls.urls')), -``include()``, simply, references another URLconf. Note that the regular -expression doesn't have a ``$`` (end-of-string match character) but has the -trailing slash. Whenever Django encounters ``include()``, 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. +:func:`~django.conf.urls.defaults.include`, simply, references another URLconf. +Note that the regular expression doesn't have a ``$`` (end-of-string match +character) but has the trailing slash. Whenever Django encounters +:func:`~django.conf.urls.defaults.include`, 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. Here's what happens if a user goes to "/polls/34/" in this system: -* Django will find the match at ``'^polls/'`` -* It will strip off the matching text (``"polls/"``) and send the remaining - text -- ``"34/"`` -- to the 'mysite.polls.urls' URLconf for - further processing. + * Django will find the match at ``'^polls/'`` -Now that we've decoupled that, we need to decouple the -'mysite.polls.urls' URLconf by removing the leading "polls/" from each -line:: + * Then, Django will strip off the matching text (``"polls/"``) and send the + remaining text -- ``"34/"`` -- to the 'mysite.polls.urls' URLconf for + further processing. + +Now that we've decoupled that, we need to decouple the 'mysite.polls.urls' +URLconf by removing the leading "polls/" from each line:: urlpatterns = patterns('mysite.polls.views', (r'^$', 'index'), @@ -455,14 +479,12 @@ line:: (r'^(?P<poll_id>\d+)/vote/$', 'vote'), ) -The idea behind ``include()`` 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 "/polls/", or under "/fun_polls/", or under "/content/polls/", or any -other URL root, and the app will still work. +The idea behind :func:`~django.conf.urls.defaults.include` 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 "/polls/", or under "/fun_polls/", or +under "/content/polls/", or any other URL root, and the app will still work. All the poll app cares about is its relative URLs, not its absolute URLs. -When you're comfortable with writing views, read `part 4 of this tutorial`_ to -learn about simple form processing and generic views. - -.. _part 4 of this tutorial: ../tutorial04/ +When you're comfortable with writing views, read :ref:`part 4 of this tutorial +<intro-tutorial04>` to learn about simple form processing and generic views. diff --git a/docs/tutorial04.txt b/docs/intro/tutorial04.txt similarity index 52% rename from docs/tutorial04.txt rename to docs/intro/tutorial04.txt index 78f954d632..fb0b206326 100644 --- a/docs/tutorial04.txt +++ b/docs/intro/tutorial04.txt @@ -1,15 +1,20 @@ +.. _intro-tutorial04: + ===================================== Writing your first Django app, part 4 ===================================== -This tutorial begins where `Tutorial 3`_ left off. We're continuing the Web-poll -application and will focus on simple form processing and cutting down our code. +This tutorial begins where :ref:`Tutorial 3 <intro-tutorial03>` left off. We're +continuing the Web-poll application and will focus on simple form processing and +cutting down our code. Write a simple form =================== Let's update our poll detail template ("polls/detail.html") from the last -tutorial, so that the template contains an HTML ``<form>`` element:: +tutorial, so that the template contains an HTML ``<form>`` element: + +.. code-block:: html+django <h1>{{ poll.question }}</h1> @@ -38,15 +43,12 @@ A quick rundown: data server-side, use ``method="post"``. This tip isn't specific to Django; it's just good Web development practice. - * ``forloop.counter`` indicates how many times the ``for`` tag has - gone through its loop. For more information, see `the - documentation for the "for" tag`_. - -.. _the documentation for the "for" tag: ../templates/#for + * ``forloop.counter`` indicates how many times the ;ttag:`for` tag has gone + through its loop Now, let's create a Django view that handles the submitted data and does -something with it. Remember, in `Tutorial 3`_, we created a URLconf for the -polls application that includes this line:: +something with it. Remember, in :ref:`Tutorial 3 <intro-tutorial03>`, we created +a URLconf for the polls application that includes this line:: (r'^(?P<poll_id>\d+)/vote/$', 'mysite.polls.views.vote'), @@ -77,47 +79,52 @@ So let's create a ``vote()`` function in ``mysite/polls/views.py``:: This code includes a few things we haven't covered yet in this tutorial: - * ``request.POST`` is a dictionary-like object that lets you access - submitted data by key name. In this case, ``request.POST['choice']`` - returns the ID of the selected choice, as a string. ``request.POST`` - values are always strings. + * :attr:`request.POST <django.http.HttpRequest.POST>` is a dictionary-like + object that lets you access submitted data by key name. In this case, + ``request.POST['choice']`` returns the ID of the selected choice, as a + string. :attr:`request.POST <django.http.HttpRequest.POST>` values are + always strings. - Note that Django also provides ``request.GET`` for accessing GET data - in the same way -- but we're explicitly using ``request.POST`` in our - code, to ensure that data is only altered via a POST call. + Note that Django also provides :attr:`request.GET + <django.http.HttpRequest.GET>` for accessing GET data in the same way -- + but we're explicitly using :attr:`request.POST + <django.http.HttpRequest.POST>` in our code, to ensure that data is only + altered via a POST call. - * ``request.POST['choice']`` will raise ``KeyError`` if ``choice`` wasn't - provided in POST data. The above code checks for ``KeyError`` and + * ``request.POST['choice']`` will raise :exc:`KeyError` if ``choice`` wasn't + provided in POST data. The above code checks for :exc:`KeyError` and redisplays the poll form with an error message if ``choice`` isn't given. * After incrementing the choice count, the code returns an - ``HttpResponseRedirect`` rather than a normal ``HttpResponse``. - ``HttpResponseRedirect`` takes a single argument: the URL to which the - user will be redirected (see the following point for how we construct - the URL in this case). + :class:`~django.http.HttpResponseRedirect` rather than a normal + :class:`~django.http.HttpResponse`. + :class:`~django.http.HttpResponseRedirect` takes a single argument: the + URL to which the user will be redirected (see the following point for how + we construct the URL in this case). As the Python comment above points out, you should always return an - ``HttpResponseRedirect`` after successfully dealing with POST data. This - tip isn't specific to Django; it's just good Web development practice. + :class:`~django.http.HttpResponseRedirect` after successfully dealing with + POST data. This tip isn't specific to Django; it's just good Web + development practice. - * We are using the ``reverse()`` function in the ``HttpResponseRedirect`` - constructor in this example. This function helps avoid having to - hardcode a URL in the view function. It is given the name of the view - that we want to pass control to and the variable portion of the URL - pattern that points to that view. In this case, using the URLConf we set - up in Tutorial 3, this ``reverse()`` call will return a string like :: + * We are using the :func:`~django.core.urlresolvers.reverse` function in the + :class:`~django.http.HttpResponseRedirect` constructor in this example. + This function helps avoid having to hardcode a URL in the view function. + It is given the name of the view that we want to pass control to and the + variable portion of the URL pattern that points to that view. In this + case, using the URLConf we set up in Tutorial 3, this + :func:`~django.core.urlresolvers.reverse` call will return a string like + :: '/polls/3/results/' ... where the ``3`` is the value of ``p.id``. This redirected URL will - then call the ``'results'`` view to display the final page. Note that - you need to use the full name of the view here (including the prefix). + then call the ``'results'`` view to display the final page. Note that you + need to use the full name of the view here (including the prefix). - For more information about ``reverse()``, see the `URL dispatcher`_ - documentation. - -As mentioned in Tutorial 3, ``request`` is a ``HTTPRequest`` object. For more -on ``HTTPRequest`` objects, see the `request and response documentation`_. +As mentioned in Tutorial 3, ``request`` is a :class:`~django.http.HttpRequest` +object. For more on :class:`~django.http.HttpRequest` objects, see the +:ref:`request and response documentation <ref-request-response>`. After somebody votes in a poll, the ``vote()`` view redirects to the results page for the poll. Let's write that view:: @@ -126,10 +133,13 @@ page for the poll. Let's write that view:: p = get_object_or_404(Poll, pk=poll_id) return render_to_response('polls/results.html', {'poll': p}) -This is almost exactly the same as the ``detail()`` view from `Tutorial 3`_. -The only difference is the template name. We'll fix this redundancy later. +This is almost exactly the same as the ``detail()`` view from :ref:`Tutorial 3 +<intro-tutorial03>`. The only difference is the template name. We'll fix this +redundancy later. -Now, create a ``results.html`` template:: +Now, create a ``results.html`` template: + +.. code-block:: html+django <h1>{{ poll.question }}</h1> @@ -143,15 +153,12 @@ 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 without having chosen a choice, you should see the error message. -.. _request and response documentation: ../request_response/ -.. _URL dispatcher: ../url_dispatch#reverse - Use generic views: Less code is better ====================================== -The ``detail()`` (from `Tutorial 3`_) and ``results()`` views are stupidly -simple -- and, as mentioned above, redundant. The ``index()`` view (also from -Tutorial 3), which displays a list of polls, is similar. +The ``detail()`` (from :ref:`Tutorial 3 <intro-tutorial03>`) and ``results()`` +views are stupidly simple -- and, as mentioned above, redundant. The ``index()`` +view (also from Tutorial 3), which displays a list of polls, is similar. These views represent a common case of basic Web development: getting data from the database according to a parameter passed in the URL, loading a template and @@ -175,7 +182,7 @@ conversion. You should know basic math before you start using a calculator. -First, open the polls/urls.py URLconf. It looks like this, according to the +First, open the ``polls/urls.py`` URLconf. It looks like this, according to the tutorial so far:: from django.conf.urls.defaults import * @@ -203,92 +210,95 @@ Change it like so:: (r'^(?P<poll_id>\d+)/vote/$', 'mysite.polls.views.vote'), ) -We're using two generic views here: ``object_list`` and ``object_detail``. -Respectively, those two views abstract the concepts of "display a list of -objects" and "display a detail page for a particular type of object." +We're using two generic views here: +:func:`~django.views.generic.list_detail.object_list` and +:func:`~django.views.generic.list_detail.object_detail`. Respectively, those two +views abstract the concepts of "display a list of objects" and "display a detail +page for a particular type of object." * Each generic view needs to know what data it will be acting upon. This data is provided in a dictionary. The ``queryset`` key in this dictionary points to the list of objects to be manipulated by the generic view. - * The ``object_detail`` generic view expects the ID value captured - from the URL to be called ``"object_id"``, so we've changed ``poll_id`` to - ``object_id`` for the generic views. + * The :func:`~django.views.generic.list_detail.object_detail` generic view + expects the ID value captured from the URL to be called ``"object_id"``, + so we've changed ``poll_id`` to ``object_id`` for the generic views. - * 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 documentation about - `naming URL patterns`_ for information). We're also using the `url()`_ - function from ``django.conf.urls.defaults`` here. It's a good habit to - use ``url()`` when you are providing a pattern name like this. + * 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 documentation about + :ref:`naming URL patterns <naming-url-patterns>` for information). We're + also using the :func:`~django.conf.urls.default.url` function from + :mod:`django.conf.urls.defaults` here. It's a good habit to use + :func:`~django.conf.urls.defaults.url` when you are providing a pattern + name like this. -.. _naming URL patterns: ../url_dispatch/#naming-url-patterns -.. _url(): ../url_dispatch/#url +By default, the :func:`~django.views.generic.list_detail.object_detail` generic +view uses a template called ``<app name>/<model name>_detail.html``. In our +case, it'll use the template ``"polls/poll_detail.html"``. Thus, rename your +``polls/detail.html`` template to ``polls/poll_detail.html``, and change the +:func:`~django.shortcuts.render_to_response` line in ``vote()``. -By default, the ``object_detail`` generic view uses a template called -``<app name>/<model name>_detail.html``. In our case, it'll use the template -``"polls/poll_detail.html"``. Thus, rename your ``polls/detail.html`` template to -``polls/poll_detail.html``, and change the ``render_to_response()`` line in -``vote()``. +Similarly, the :func:`~django.views.generic.list_detail.object_list` generic +view uses a template called ``<app name>/<model name>_list.html``. Thus, rename +``polls/index.html`` to ``polls/poll_list.html``. -Similarly, the ``object_list`` generic view uses a template called -``<app name>/<model name>_list.html``. Thus, rename ``polls/index.html`` to -``polls/poll_list.html``. - -Because we have more than one entry in the URLconf that uses ``object_detail`` -for the polls app, we manually specify a template name for the results view: +Because we have more than one entry in the URLconf that uses +:func:`~django.views.generic.list_detail.object_detail` for the polls app, we +manually specify a template name for the results view: ``template_name='polls/results.html'``. Otherwise, both views would use the same template. Note that we use ``dict()`` to return an altered dictionary in place. -.. note:: ``all()`` is lazy +.. note:: :meth:`django.db.models.QuerySet.all` is lazy It might look a little frightening to see ``Poll.objects.all()`` being used in a detail view which only needs one ``Poll`` object, but don't worry; - ``Poll.objects.all()`` is actually a special object called a ``QuerySet``, - which is "lazy" and doesn't hit your database until it absolutely has to. By - the time the database query happens, the ``object_detail`` generic view will - have narrowed its scope down to a single object, so the eventual query will - only select one row from the database. + ``Poll.objects.all()`` is actually a special object called a + :class:`~django.db.models.QuerySet`, which is "lazy" and doesn't hit your + database until it absolutely has to. By the time the database query happens, + the :func:`~django.views.generic.list_detail.object_detail` generic view + will have narrowed its scope down to a single object, so the eventual query + will only select one row from the database. If you'd like to know more about how that works, The Django database API - documentation `explains the lazy nature of QuerySet objects`_. + documentation :ref:`explains the lazy nature of QuerySet objects + <querysets-are-lazy>`. -.. _explains the lazy nature of QuerySet objects: ../db-api/#querysets-are-lazy - -In previous parts of the tutorial, the templates have been provided with a context -that contains the ``poll`` and ``latest_poll_list`` context variables. However, -the generic views provide the variables ``object`` and ``object_list`` as context. -Therefore, you need to change your templates to match the new context variables. -Go through your templates, and modify any reference to ``latest_poll_list`` to -``object_list``, and change any reference to ``poll`` to ``object``. +In previous parts of the tutorial, the templates have been provided with a +context that contains the ``poll`` and ``latest_poll_list`` context variables. +However, the generic views provide the variables ``object`` and ``object_list`` +as context. Therefore, you need to change your templates to match the new +context variables. Go through your templates, and modify any reference to +``latest_poll_list`` to :func:`~django.views.generic.list_detail.object_list`, +and change any reference to ``poll`` to ``object``. You can now delete the ``index()``, ``detail()`` and ``results()`` views from ``polls/views.py``. We don't need them anymore -- they have been replaced by generic views. -The ``vote()`` view is still required. However, it must be modified to match -the new context variables. In the ``render_to_response()`` call, rename the -``poll`` context variable to ``object``. +The ``vote()`` view is still required. However, it must be modified to match the +new context variables. In the :func:`~django.shortcuts.render_to_response` call, +rename the ``poll`` context variable to ``object``. The last thing to do is fix the URL handling to account for the use of generic -views. In the vote view above, we used the ``reverse()`` function to avoid -hard-coding our URLs. Now that we've switched to a generic view, we'll need to -change the ``reverse()`` call to point back to our new generic view. We can't -simply use the view function anymore -- generic views can be (and are) used -multiple times -- but we can use the name we've given:: +views. In the vote view above, we used the +:func:`~django.core.urlresolvers.reverse` function to avoid hard-coding our +URLs. Now that we've switched to a generic view, we'll need to change the +:func:`~django.core.urlresolvers.reverse` call to point back to our new generic +view. We can't simply use the view function anymore -- generic views can be (and +are) used multiple times -- but we can use the name we've given:: return HttpResponseRedirect(reverse('poll_results', args=(p.id,))) Run the server, and use your new polling app based on generic views. -For full details on generic views, see the `generic views documentation`_. - -.. _generic views documentation: ../generic_views/ +For full details on generic views, see the :ref:`generic views documentation +<topics-http-generic-views>`. Coming soon =========== -The tutorial ends here for the time being. But check back soon for the next -installments: +The tutorial ends here for the time being. Future installments of the tutorial +will cover: * Advanced form processing * Using the RSS framework @@ -297,8 +307,5 @@ installments: * Advanced admin features: Permissions * Advanced admin features: Custom JavaScript -In the meantime, you can read through the rest of the `Django documentation`_ -and start writing your own applications. - -.. _Tutorial 3: ../tutorial03/ -.. _Django documentation: http://www.djangoproject.com/documentation/ +In the meantime, you might want to check out some pointers on :ref:`where to go +from here <intro-whatsnext>` diff --git a/docs/intro/whatsnext.txt b/docs/intro/whatsnext.txt new file mode 100644 index 0000000000..ae67220f58 --- /dev/null +++ b/docs/intro/whatsnext.txt @@ -0,0 +1,235 @@ +.. _intro-whatsnext: + +================= +What to read next +================= + +So you've read all the :ref:`introductory material <intro-index>` and have +decided you'd like to keep using Django. We've only just scratched the surface +with this intro (in fact, if you've read every single word you've still read +less than 10% of the overall documentation). + +So what's next? + +Well, we've always been big fans of learning by doing. At this point you should +know enough to start a project of your own and start fooling around. As you need +to learn new tricks, come back to the documentation. + +We've put a lot of effort into making Django's documentation useful, easy to +read and as complete as possible. The rest of this document explains more about +how the documentation works so that you can get the most out of it. + +(Yes, this is documentation about documentation. Rest assured we have no plans +to write a document about how to read the document about documentation.) + +Finding documentation +===================== + +Django's got a *lot* of documentation -- almost 200,000 words -- so finding what +you need can sometimes be tricky. A few good places to start the :ref:`search` +and the :ref:`genindex`. + +Or you can just browse around! + +How the documentation is organized +================================== + +Django's main documentation is broken up into "chunks" designed to fill +different needs: + + * The :ref:`introductory material <intro-index>` is designed for people new + to Django -- or to web development in general. It doesn't cover anything + in depth, but instead gives a high-level overview of how developing in + Django "feels". + + * The :ref:`topic guides <topics-index>`, on the other hand, dive deep into + individual parts of Django. There are complete guides to Django's + :ref:`model system <topics-db-index>`, :ref:`template engine + <topics-templates>`, :ref:`forms framework <topics-forms-index>`, and much + more.` + + This is probably where you'll want to spent most of your time; if you work + your way through these guides you should come out knowing pretty much + everything there is to know about Django. + + * Web development is often broad, not deep -- problems span many domains. + We've written a set of :ref:`how-to guides <howto-index>` that answer + common "How do I ...?" questions. Here you'll find information about + :ref:`generating PDFs with Django <howto-outputting-pdf>`, :ref:`writing + custom template tags <howto-custom-template-tags>`, and more. + + Answers to really common questions can also be found in the :ref:`FAQ + <faq-index>`. + + * The guides and how-to's don't cover every single class, function, and + method available in Django -- that would be overwhelming when you're + trying to learn. Instead, details about individual classes, functions, + methods, and modules are kept in the :ref:`reference <ref-index>`. This is + where you'll turn to find the details of a particular function or + whathaveyou. + + * Finally, there's some "specialized" documentation not usually relevant to + most developers. This includes the :ref:`release notes <releases-index>`, + :ref:`documentation of obsolete features <obsolete-index>`, + :ref:`internals documentation <internals-index>` for those who want to add + code to Django itself, and a :ref:`few other things that simply don't fit + elsewhere <misc-index>`. + + +How documentation is updated +============================ + +Just as the Django code base is developed and improved on a daily basis, our +documentation is consistently improving. We improve documentation for several +reasons: + + * To make content fixes, such as grammar/typo corrections. + + * To add information and/or examples to existing sections that need to be + expanded. + + * To document Django features that aren't yet documented. (The list of + such features is shrinking but exists nonetheless.) + + * To add documentation for new features as new features get added, or as + Django APIs or behaviors change. + +Django's documentation is kept in the same source control system as its code. It +lives in the `django/trunk/docs`_ directory of our Subversion repository. Each +document online is a separate text file in the repository. + +.. _django/trunk/docs: http://code.djangoproject.com/browser/django/trunk/docs + +Where to get it +=============== + +You can read Django documentation in several ways. They are, in order of +preference: + +On the Web +---------- + +The most recent version of the Django documentation lives at +http://www.djangoproject.com/documentation/ . These HTML pages are generated +automatically from the text files in source control. That means they reflect the +"latest and greatest" in Django -- they include the very latest corrections and +additions, and they discuss the latest Django features, which may only be +available to users of the Django development version. (See "Differences between +versions" below.) + +We encourage you to help improve the docs by submitting changes, corrections and +suggestions in the `ticket system`_. The Django developers actively monitor the +ticket system and use your feedback to improve the documentation for everybody. + +Note, however, that tickets should explicitly relate to the documentation, +rather than asking broad tech-support questions. If you need help with your +particular Django setup, try the `django-users mailing list`_ or the `#django +IRC channel`_ instead. + +.. _ticket system: http://code.djangoproject.com/simpleticket?component=Documentation +.. _django-users mailing list: http://groups.google.com/group/django-users +.. _#django IRC channel: irc://irc.freenode.net/django + +In plain text +------------- + +For offline reading, or just for convenience, you can read the Django +documentation in plain text. + +If you're using an official release of Django, note that the zipped package +(tarball) of the code includes a ``docs/`` directory, which contains all the +documentation for that release. + +If you're using the development version of Django (aka the Subversion "trunk"), +note that the ``docs/`` directory contains all of the documentation. You can +``svn update`` it, just as you ``svn update`` the Python code, in order to get +the latest changes. + +You can check out the latest Django documentation from Subversion using this +shell command: + +.. code-block:: bash + + $ svn co http://code.djangoproject.com/svn/django/trunk/docs/ django_docs + +One low-tech way of taking advantage of the text documentation is by using the +Unix ``grep`` utility to search for a phrase in all of the documentation. For +example, this will show you each mention of the phrase "edit_inline" in any +Django document: + +.. code-block:: bash + + $ grep edit_inline /path/to/django/docs/*.txt + +As HTML, locally +---------------- + +You can get a local copy of the HTML documentation following a few easy steps: + + * Django's documentation uses a system called Sphinx__ to convert from + plain text to HTML. You'll need to install Sphinx by either downloading + and installing the package from the Sphinx website, or by Python's + ``easy_install``: + + .. code-block:: bash + + $ easy_install Sphinx + + * Then, just use the included ``Makefile`` to turn the documentation into + HTML: + + .. code-block:: bash + + $ cd path/to/django/docs + $ make html + + You'll need `GNU Make`__ installed for this. + + * The HTML documentation will be placed in ``docs/_build/html``. + +.. warning:: + + At the time of this writing, Django's using a version of Sphinx not + yet released, so you'll currently need to install Sphinx from the + source. We'll fix this shortly. + +__ http://sphinx.pocoo.org/ +__ http://www.gnu.org/software/make/ + +Differences between versions +============================ + +As previously mentioned, the text documentation in our Subversion repository +contains the "latest and greatest" changes and additions. These changes often +include documentation of new features added in the Django development version +-- the Subversion ("trunk") version of Django. For that reason, it's worth +pointing out our policy on keeping straight the documentation for various +versions of the framework. + +We follow this policy: + + * The primary documentation on djangoproject.com is an HTML version of the + latest docs in Subversion. These docs always correspond to the latest + official Django release, plus whatever features we've added/changed in + the framework *since* the latest release. + + * As we add features to Django's development version, we try to update the + documentation in the same Subversion commit transaction. + + * To distinguish feature changes/additions in the docs, we use the phrase + **New in Django development version**. In practice, this means that the + current documentation on djangoproject.com can be used by users of either + the latest release *or* the development version. + + * Documentation for a particular Django release is frozen once the version + has been released officially. It remains a snapshot of the docs as of the + moment of the release. We will make exceptions to this rule in + the case of retroactive security updates or other such retroactive + changes. Once documentation is frozen, we add a note to the top of each + frozen document that says "These docs are frozen for Django version XXX" + and links to the current version of that document. + + * The `main documentation Web page`_ includes links to documentation for + all previous versions. + +.. _main documentation Web page: http://www.djangoproject.com/documentation/ diff --git a/docs/legacy_databases.txt b/docs/legacy_databases.txt deleted file mode 100644 index b87a661f90..0000000000 --- a/docs/legacy_databases.txt +++ /dev/null @@ -1,69 +0,0 @@ -================================== -Integrating with a legacy database -================================== - -While Django is best suited for developing new applications, it's quite -possible to integrate it into legacy databases. Django includes a couple of -utilities to automate as much of this process as possible. - -This document assumes you know the Django basics, as covered in the -`official tutorial`_. - -.. _official tutorial: ../tutorial01/ - -Give Django your database parameters -==================================== - -You'll need to tell Django what your database connection parameters are, and -what the name of the database is. Do that by editing these settings in your -`settings file`_: - - * `DATABASE_NAME`_ - * `DATABASE_ENGINE`_ - * `DATABASE_USER`_ - * `DATABASE_PASSWORD`_ - * `DATABASE_HOST`_ - * `DATABASE_PORT`_ - -.. _settings file: ../settings/ -.. _DATABASE_NAME: ../settings/#database-name -.. _DATABASE_ENGINE: ../settings/#database-engine -.. _DATABASE_USER: ../settings/#database-user -.. _DATABASE_PASSWORD: ../settings/#database-password -.. _DATABASE_HOST: ../settings/#database-host -.. _DATABASE_PORT: ../settings/#database-port - -Auto-generate the models -======================== - -Django comes with a utility that can create models by introspecting an existing -database. You can view the output by running this command:: - - python manage.py inspectdb - -Save this as a file by using standard Unix output redirection:: - - python manage.py inspectdb > models.py - -This feature is meant as a shortcut, not as definitive model generation. See -the `django-admin.py documentation`_ for more information. - -Once you've cleaned up your models, name the file ``models.py`` and put it in -the Python package that holds your app. Then add the app to your -``INSTALLED_APPS`` setting. - -.. _django-admin.py documentation: ../django-admin/ - -Install the core Django tables -============================== - -Next, run the ``manage.py syncdb`` command to install any extra needed database -records such as admin permissions and content types:: - - python manage.py syncdb - -See whether it worked -===================== - -That's it. Try accessing your data via the Django database API, and try editing -objects via Django's admin site. diff --git a/docs/localflavor.txt b/docs/localflavor.txt deleted file mode 100644 index 71e353c5d8..0000000000 --- a/docs/localflavor.txt +++ /dev/null @@ -1,733 +0,0 @@ -========================== -The "local flavor" add-ons -========================== - -Following its "batteries included" philosophy, Django comes with assorted -pieces of code that are useful for particular countries or cultures. These are -called the "local flavor" add-ons and live in the ``django.contrib.localflavor`` -package. - -Inside that package, country- or culture-specific code is organized into -subpackages, named using `ISO 3166 country codes`_. - -Most of the ``localflavor`` add-ons are localized form components deriving from -the forms_ framework -- for example, a ``USStateField`` that knows how to -validate U.S. state abbreviations, and a ``FISocialSecurityNumber`` that knows -how to validate Finnish social security numbers. - -To use one of these localized components, just import the relevant subpackage. -For example, here's how you can create a form with a field representing a -French telephone number:: - - from django import forms - from django.contrib.localflavor import fr - - class MyForm(forms.Form): - my_french_phone_no = fr.forms.FRPhoneNumberField() - -Supported countries -=================== - -Countries currently supported by ``localflavor`` are: - - * Argentina_ - * Australia_ - * Austria_ - * Brazil_ - * Canada_ - * Chile_ - * Finland_ - * France_ - * Germany_ - * Holland_ - * Iceland_ - * India_ - * Italy_ - * Japan_ - * Mexico_ - * Norway_ - * Peru_ - * Poland_ - * Romania_ - * Slovakia_ - * `South Africa`_ - * Spain_ - * Switzerland_ - * `United Kingdom`_ - * `United States of America`_ - -The ``localflavor`` package also includes a ``generic`` subpackage, containing -useful code that is not specific to one particular country or culture. -Currently, it defines date and datetime input fields based on those from -forms_, but with non-US default formats. Here's an example of how to use -them:: - - from django import forms - from django.contrib.localflavor import generic - - class MyForm(forms.Form): - my_date_field = generic.forms.DateField() - -.. _ISO 3166 country codes: http://www.iso.org/iso/country_codes/iso_3166_code_lists/english_country_names_and_code_elements.htm -.. _Argentina: `Argentina (django.contrib.localflavor.ar)`_ -.. _Australia: `Australia (django.contrib.localflavor.au)`_ -.. _Austria: `Austria (django.contrib.localflavor.at)`_ -.. _Brazil: `Brazil (django.contrib.localflavor.br)`_ -.. _Canada: `Canada (django.contrib.localflavor.ca)`_ -.. _Chile: `Chile (django.contrib.localflavor.cl)`_ -.. _Finland: `Finland (django.contrib.localflavor.fi)`_ -.. _France: `France (django.contrib.localflavor.fr)`_ -.. _Germany: `Germany (django.contrib.localflavor.de)`_ -.. _Holland: `Holland (django.contrib.localflavor.nl)`_ -.. _Iceland: `Iceland (django.contrib.localflavor.is\_)`_ -.. _India: `India (django.contrib.localflavor.in\_)`_ -.. _Italy: `Italy (django.contrib.localflavor.it)`_ -.. _Japan: `Japan (django.contrib.localflavor.jp)`_ -.. _Mexico: `Mexico (django.contrib.localflavor.mx)`_ -.. _Norway: `Norway (django.contrib.localflavor.no)`_ -.. _Peru: `Peru (django.contrib.localflavor.pe)`_ -.. _Poland: `Poland (django.contrib.localflavor.pl)`_ -.. _Romania: `Romania (django.contrib.localflavor.ro)`_ -.. _Slovakia: `Slovakia (django.contrib.localflavor.sk)`_ -.. _South Africa: `South Africa (django.contrib.localflavor.za)`_ -.. _Spain: `Spain (django.contrib.localflavor.es)`_ -.. _Switzerland: `Switzerland (django.contrib.localflavor.ch)`_ -.. _United Kingdom: `United Kingdom (django.contrib.localflavor.uk)`_ -.. _United States of America: `United States of America (django.contrib.localflavor.us)`_ -.. _forms: ../forms/ - -Adding flavors -============== - -We'd love to add more of these to Django, so please `create a ticket`_ with -any code you'd like to contribute. One thing we ask is that you please use -Unicode objects (``u'mystring'``) for strings, rather than setting the encoding -in the file. See any of the existing flavors for examples. - -.. _create a ticket: http://code.djangoproject.com/simpleticket - -Argentina (``django.contrib.localflavor.ar``) -============================================= - -ARPostalCodeField ------------------ - -A form field that validates input as either a classic four-digit Argentinian -postal code or a CPA_. - -.. _CPA: http://www.correoargentino.com.ar/consulta_cpa/home.php - -ARDNIField ----------- - -A form field that validates input as a Documento Nacional de Identidad (DNI) -number. - -ARCUITField ------------ - -A form field that validates input as a Código Único de Identificación -Tributaria (CUIT) number. - -ARProvinceSelect ----------------- - -A ``Select`` widget that uses a list of Argentina's provinces and autonomous -cities as its choices. - -Australia (``django.contrib.localflavor.au``) -============================================= - -AUPostCodeField ---------------- - -A form field that validates input as an Australian postcode. - -AUPhoneNumberField ------------------- - -A form field that validates input as an Australian phone number. Valid numbers -have ten digits. - -AUStateSelect -------------- - -A ``Select`` widget that uses a list of Australian states/territories as its -choices. - -Austria (``django.contrib.localflavor.at``) -============================================= - -ATZipCodeField ---------------- - -A form field that validates its input as an Austrian zip code. - -ATStateSelect -------------- - -A ``Select`` widget that uses a list of Austrian states as its choices. - -ATSocialSecurityNumberField ---------------------------- - -A form field that validates its input as an Austrian social security number. - -Brazil (``django.contrib.localflavor.br``) -========================================== - -BRPhoneNumberField ------------------- - -A form field that validates input as a Brazilian phone number, with the format -XX-XXXX-XXXX. - -BRZipCodeField --------------- - -A form field that validates input as a Brazilian zip code, with the format -XXXXX-XXX. - -BRStateSelect -------------- - -A ``Select`` widget that uses a list of Brazilian states/territories as its -choices. - -Canada (``django.contrib.localflavor.ca``) -========================================== - -CAPhoneNumberField ------------------- - -A form field that validates input as a Canadian phone number, with the format -XXX-XXX-XXXX. - -CAPostalCodeField ------------------ - -A form field that validates input as a Canadian postal code, with the format -XXX XXX. - -CAProvinceField ---------------- - -A form field that validates input as a Canadian province name or abbreviation. - -CASocialInsuranceNumberField ----------------------------- - -A form field that validates input as a Canadian Social Insurance Number (SIN). -A valid number must have the format XXX-XXX-XXX and pass a `Luhn mod-10 -checksum`_. - -.. _Luhn mod-10 checksum: http://en.wikipedia.org/wiki/Luhn_algorithm - -CAProvinceSelect ----------------- - -A ``Select`` widget that uses a list of Canadian provinces and territories as -its choices. - -Chile (``django.contrib.localflavor.cl``) -========================================= - -CLRutField ----------- - -A form field that validates input as a Chilean national identification number -('Rol Unico Tributario' or RUT). The valid format is XX.XXX.XXX-X. - -CLRegionSelect --------------- - -A ``Select`` widget that uses a list of Chilean regions (Regiones) as its -choices. - -Finland (``django.contrib.localflavor.fi``) -=========================================== - -FISocialSecurityNumber ----------------------- - -A form field that validates input as a Finnish social security number. - -FIZipCodeField --------------- - -A form field that validates input as a Finnish zip code. Valid codes -consist of five digits. - -FIMunicipalitySelect --------------------- - -A ``Select`` widget that uses a list of Finnish municipalities as its -choices. - -France (``django.contrib.localflavor.fr``) -========================================== - -FRPhoneNumberField ------------------- - -A form field that validates input as a French local phone number. The -correct format is 0X XX XX XX XX. 0X.XX.XX.XX.XX and 0XXXXXXXXX validate -but are corrected to 0X XX XX XX XX. - -FRZipCodeField --------------- - -A form field that validates input as a French zip code. Valid codes -consist of five digits. - -FRDepartmentSelect ------------------- - -A ``Select`` widget that uses a list of French departments as its choices. - -Germany (``django.contrib.localflavor.de``) -=========================================== - -DEIdentityCardNumberField -------------------------- - -A form field that validates input as a German identity card number -(Personalausweis_). Valid numbers have the format -XXXXXXXXXXX-XXXXXXX-XXXXXXX-X, with no group consisting entirely of zeroes. - -.. _Personalausweis: http://de.wikipedia.org/wiki/Personalausweis - -DEZipCodeField --------------- - -A form field that validates input as a German zip code. Valid codes -consist of five digits. - -DEStateSelect -------------- - -A ``Select`` widget that uses a list of German states as its choices. - -Holland (``django.contrib.localflavor.nl``) -=========================================== - -NLPhoneNumberField ------------------- - -A form field that validates input as a Dutch telephone number. - -NLSofiNumberField ------------------ - -A form field that validates input as a Dutch social security number -(SoFI/BSN). - -NLZipCodeField --------------- - -A form field that validates input as a Dutch zip code. - -NLProvinceSelect ----------------- - -A ``Select`` widget that uses a list of Dutch provinces as its list of -choices. - -Iceland (``django.contrib.localflavor.is_``) -============================================ - -ISIdNumberField ---------------- - -A form field that validates input as an Icelandic identification number -(kennitala). The format is XXXXXX-XXXX. - -ISPhoneNumberField ------------------- - -A form field that validates input as an Icelandtic phone number (seven -digits with an optional hyphen or space after the first three digits). - -ISPostalCodeSelect ------------------- - -A ``Select`` widget that uses a list of Icelandic postal codes as its -choices. - -India (``django.contrib.localflavor.in_``) -========================================== - -INStateField ------------- - -A form field that validates input as an Indian state/territory name or -abbreviation. Input is normalized to the standard two-letter vehicle -registration abbreviation for the given state or territory. - -INZipCodeField --------------- - -A form field that validates input as an Indian zip code, with the -format XXXXXXX. - -INStateSelect -------------- - -A ``Select`` widget that uses a list of Indian states/territories as its -choices. - -Italy (``django.contrib.localflavor.it``) -========================================= - -ITSocialSecurityNumberField ---------------------------- - -A form field that validates input as an Italian social security number -(`codice fiscale`_). - -.. _codice fiscale: http://www.agenziaentrate.it/ilwwcm/connect/Nsi/Servizi/Codice+fiscale+-+tessera+sanitaria/Codice+fiscale/NSI+Informazioni+sulla+codificazione+delle+persone+fisiche - -ITVatNumberField ----------------- - -A form field that validates Italian VAT numbers (partita IVA). - -ITZipCodeField --------------- - -A form field that validates input as an Italian zip code. Valid codes -must have five digits. - -ITProvinceSelect ----------------- - -A ``Select`` widget that uses a list of Italian provinces as its choices. - -ITRegionSelect --------------- - -A ``Select`` widget that uses a list of Italian regions as its choices. - -Japan (``django.contrib.localflavor.jp``) -========================================= - -JPPostalCodeField ------------------ - -A form field that validates input as a Japanese postcode. It accepts seven -digits, with or without a hyphen. - -JPPrefectureSelect ------------------- - -A ``Select`` widget that uses a list of Japanese prefectures as its choices. - -Mexico (``django.contrib.localflavor.mx``) -========================================== - -MXStateSelect -------------- - -A ``Select`` widget that uses a list of Mexican states as its choices. - -Norway (``django.contrib.localflavor.no``) -========================================== - -NOSocialSecurityNumber ----------------------- - -A form field that validates input as a Norwegian social security number -(personnummer_). - -.. _personnummer: http://no.wikipedia.org/wiki/Personnummer - -NOZipCodeField --------------- - -A form field that validates input as a Norwegian zip code. Valid codes -have four digits. - -NOMunicipalitySelect --------------------- - -A ``Select`` widget that uses a list of Norwegian municipalities (fylker) as -its choices. - -Peru (``django.contrib.localflavor.pe``) -======================================== - -PEDNIField ----------- - -A form field that validates input as a DNI (Peruvian national identity) -number. - -PERUCField ----------- - -A form field that validates input as an RUC (Registro Unico de -Contribuyentes) number. Valid RUC numbers have 11 digits. - -PEDepartmentSelect ------------------- - -A ``Select`` widget that uses a list of Peruvian Departments as its choices. - -Poland (``django.contrib.localflavor.pl``) -========================================== - -PLNationalIdentificationNumberField ------------------------------------ - -A form field that validates input as a Polish national identification number -(PESEL_). - -.. _PESEL: http://en.wikipedia.org/wiki/PESEL - -PLNationalBusinessRegisterField -------------------------------- - -A form field that validates input as a Polish National Official Business -Register Number (REGON_), having either seven or nine digits. The checksum -algorithm used for REGONs is documented at -http://wipos.p.lodz.pl/zylla/ut/nip-rego.html. - -.. _REGON: http://www.stat.gov.pl/bip/regon_ENG_HTML.htm - -PLPostalCodeField ------------------ - -A form field that validates input as a Polish postal code. The valid format -is XX-XXX, where X is a digit. - -PLTaxNumberField ----------------- - -A form field that validates input as a Polish Tax Number (NIP). Valid -formats are XXX-XXX-XX-XX or XX-XX-XXX-XXX. The checksum algorithm used -for NIPs is documented at http://wipos.p.lodz.pl/zylla/ut/nip-rego.html. - -PLAdministrativeUnitSelect --------------------------- - -A ``Select`` widget that uses a list of Polish administrative units as its -choices. - -PLVoivodeshipSelect -------------------- - -A ``Select`` widget that uses a list of Polish voivodeships (administrative -provinces) as its choices. - -Romania (``django.contrib.localflavor.ro``) -============================================ - -ROCIFField ----------- - -A form field that validates Romanian fiscal identification codes (CIF). The -return value strips the leading RO, if given. - -ROCNPField ----------- - -A form field that validates Romanian personal numeric codes (CNP). - -ROCountyField -------------- - -A form field that validates its input as a Romanian county (judet) name or -abbreviation. It normalizes the input to the standard vehicle registration -abbreviation for the given county. This field will only accept names written -with diacritics; consider using ROCountySelect as an alternative. - -ROCountySelect --------------- - -A ``Select`` widget that uses a list of Romanian counties (judete) as its -choices. - -ROIBANField ------------ - -A form field that validates its input as a Romanian International Bank -Account Number (IBAN). The valid format is ROXX-XXXX-XXXX-XXXX-XXXX-XXXX, -with or without hyphens. - -ROPhoneNumberField ------------------- - -A form field that validates Romanian phone numbers, short special numbers -excluded. - -ROPostalCodeField ------------------ - -A form field that validates Romanian postal codes. - -Slovakia (``django.contrib.localflavor.sk``) -============================================ - -SKPostalCodeField ------------------ - -A form field that validates input as a Slovak postal code. Valid formats -are XXXXX or XXX XX, where X is a digit. - -SKDistrictSelect ----------------- - -A ``Select`` widget that uses a list of Slovak districts as its choices. - -SKRegionSelect --------------- - -A ``Select`` widget that uses a list of Slovak regions as its choices. - -South Africa (``django.contrib.localflavor.za``) -================================================ - -ZAIDField ---------- - -A form field that validates input as a South African ID number. Validation -uses the Luhn checksum and a simplistic (i.e., not entirely accurate) check -for birth date. - -ZAPostCodeField ---------------- - -A form field that validates input as a South African postcode. Valid -postcodes must have four digits. - -Spain (``django.contrib.localflavor.es``) -========================================= - -ESIdentityCardNumberField -------------------------- - -A form field that validates input as a Spanish NIF/NIE/CIF (Fiscal -Identification Number) code. - -ESCCCField ----------- - -A form field that validates input as a Spanish bank account number (Codigo -Cuenta Cliente or CCC). A valid CCC number has the format -EEEE-OOOO-CC-AAAAAAAAAA, where the E, O, C and A digits denote the entity, -office, checksum and account, respectively. The first checksum digit -validates the entity and office. The second checksum digit validates the -account. It is also valid to use a space as a delimiter, or to use no -delimiter. - -ESPhoneNumberField ------------------- - -A form field that validates input as a Spanish phone number. Valid numbers -have nine digits, the first of which is 6, 8 or 9. - -ESPostalCodeField ------------------ - -A form field that validates input as a Spanish postal code. Valid codes -have five digits, the first two being in the range 01 to 52, representing -the province. - -ESProvinceSelect ----------------- - -A ``Select`` widget that uses a list of Spanish provinces as its choices. - -ESRegionSelect --------------- - -A ``Select`` widget that uses a list of Spanish regions as its choices. - -Switzerland (``django.contrib.localflavor.ch``) -=============================================== - -CHIdentityCardNumberField -------------------------- - -A form field that validates input as a Swiss identity card number. -A valid number must confirm to the X1234567<0 or 1234567890 format and -have the correct checksums -- see http://adi.kousz.ch/artikel/IDCHE.htm. - -CHPhoneNumberField ------------------- - -A form field that validates input as a Swiss phone number. The correct -format is 0XX XXX XX XX. 0XX.XXX.XX.XX and 0XXXXXXXXX validate but are -corrected to 0XX XXX XX XX. - -CHZipCodeField --------------- - -A form field that validates input as a Swiss zip code. Valid codes -consist of four digits. - -CHStateSelect -------------- - -A ``Select`` widget that uses a list of Swiss states as its choices. - -United Kingdom (``django.contrib.localflavor.uk``) -================================================== - -UKPostcodeField ---------------- - -A form field that validates input as a UK postcode. The regular -expression used is sourced from the schema for British Standard BS7666 -address types at http://www.govtalk.gov.uk/gdsc/schemas/bs7666-v2-0.xsd. - -UKCountySelect --------------- - -A ``Select`` widget that uses a list of UK counties/regions as its choices. - -UKNationSelect --------------- - -A ``Select`` widget that uses a list of UK nations as its choices. - -United States of America (``django.contrib.localflavor.us``) -============================================================ - -USPhoneNumberField ------------------- - -A form field that validates input as a U.S. phone number. - -USSocialSecurityNumberField ---------------------------- - -A form field that validates input as a U.S. Social Security Number (SSN). -A valid SSN must obey the following rules: - - * Format of XXX-XX-XXXX - * No group of digits consisting entirely of zeroes - * Leading group of digits cannot be 666 - * Number not in promotional block 987-65-4320 through 987-65-4329 - * Number not one known to be invalid due to widespread promotional - use or distribution (e.g., the Woolworth's number or the 1962 - promotional number) - -USStateField ------------- - -A form field that validates input as a U.S. state name or abbreviation. It -normalizes the input to the standard two-letter postal service abbreviation -for the given state. - -USZipCodeField --------------- - -A form field that validates input as a U.S. ZIP code. Valid formats are -XXXXX or XXXXX-XXXX. - -USStateSelect -------------- - -A form ``Select`` widget that uses a list of U.S. states/territories as its -choices. diff --git a/docs/man/django-admin.1 b/docs/man/django-admin.1 index 2f4b5a02d8..6b58c9183b 100644 --- a/docs/man/django-admin.1 +++ b/docs/man/django-admin.1 @@ -159,8 +159,7 @@ The file extension(s) to examine (default: ".html", separate multiple extensions with commas, or use -e multiple times). .TP .I \-a, \-\-all -Process all available locales when using makemessages. -.SH "ENVIRONMENT" +Process all available locales when using makemessages..SH "ENVIRONMENT" .TP .I DJANGO_SETTINGS_MODULE In the absence of the diff --git a/docs/middleware.txt b/docs/middleware.txt deleted file mode 100644 index c61bd7c5cc..0000000000 --- a/docs/middleware.txt +++ /dev/null @@ -1,288 +0,0 @@ -========== -Middleware -========== - -Middleware is a framework of hooks into Django's request/response processing. -It's a light, low-level "plugin" system for globally altering Django's input -and/or output. - -Each middleware component is responsible for doing some specific function. For -example, Django includes a middleware component, ``XViewMiddleware``, that adds -an ``"X-View"`` HTTP header to every response to a ``HEAD`` request. - -This document explains all middleware components that come with Django, how to -use them, and how to write your own middleware. - -Activating middleware -===================== - -To activate a middleware component, add it to the ``MIDDLEWARE_CLASSES`` list -in your Django settings. In ``MIDDLEWARE_CLASSES``, each middleware component -is represented by a string: the full Python path to the middleware's class -name. For example, here's the default ``MIDDLEWARE_CLASSES`` created by -``django-admin.py startproject``:: - - MIDDLEWARE_CLASSES = ( - 'django.middleware.common.CommonMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.middleware.doc.XViewMiddleware', - ) - -Django applies middleware in the order it's defined in ``MIDDLEWARE_CLASSES``, -except in the case of response and exception middleware, which is applied in -reverse order. - -A Django installation doesn't require any middleware -- e.g., -``MIDDLEWARE_CLASSES`` can be empty, if you'd like -- but it's strongly -suggested that you use ``CommonMiddleware``. - -Available middleware -==================== - -django.middleware.cache.CacheMiddleware ---------------------------------------- - -Enables site-wide cache. If this is enabled, each Django-powered page will be -cached for as long as the ``CACHE_MIDDLEWARE_SECONDS`` setting defines. See -the `cache documentation`_. - -.. _`cache documentation`: ../cache/#the-per-site-cache - -django.middleware.common.CommonMiddleware ------------------------------------------ - -Adds a few conveniences for perfectionists: - -* Forbids access to user agents in the ``DISALLOWED_USER_AGENTS`` setting, - which should be a list of strings. - -* Performs URL rewriting based on the ``APPEND_SLASH`` and ``PREPEND_WWW`` - settings. - - If ``APPEND_SLASH`` is ``True`` and the initial URL doesn't end with a slash, - and it is not found in the URLconf, then a new URL is formed by appending a - slash at the end. If this new URL is found in the URLconf, then Django - redirects the request to this new URL. Otherwise, the initial URL is - processed as usual. - - For example, ``foo.com/bar`` will be redirected to ``foo.com/bar/`` if you - don't have a valid URL pattern for ``foo.com/bar`` but *do* have a valid - pattern for ``foo.com/bar/``. - - **New in Django development version:** The behavior of ``APPEND_SLASH`` has - changed slightly in the development version. It didn't used to check whether - the pattern was matched in the URLconf. - - If ``PREPEND_WWW`` is ``True``, URLs that lack a leading "www." will be - redirected to the same URL with a leading "www." - - Both of these options are meant to normalize URLs. The philosophy is that - each URL should exist in one, and only one, place. Technically a URL - ``foo.com/bar`` is distinct from ``foo.com/bar/`` -- a search-engine - indexer would treat them as separate URLs -- so it's best practice to - normalize URLs. - -* Handles ETags based on the ``USE_ETAGS`` setting. If ``USE_ETAGS`` is set - to ``True``, Django will calculate an ETag for each request by - MD5-hashing the page content, and it'll take care of sending - ``Not Modified`` responses, if appropriate. - -django.middleware.doc.XViewMiddleware -------------------------------------- - -Sends custom ``X-View`` HTTP headers to HEAD requests that come from IP -addresses defined in the ``INTERNAL_IPS`` setting. This is used by Django's -automatic documentation system. - -django.middleware.gzip.GZipMiddleware -------------------------------------- - -Compresses content for browsers that understand gzip compression (all modern -browsers). - -It is suggested to place this first in the middleware list, so that the -compression of the response content is the last thing that happens. Will not -compress content bodies less than 200 bytes long, when the response code is -something other than 200, JavaScript files (for IE compatibitility), or -responses that have the ``Content-Encoding`` header already specified. - -django.middleware.http.ConditionalGetMiddleware ------------------------------------------------ - -Handles conditional GET operations. If the response has a ``ETag`` or -``Last-Modified`` header, and the request has ``If-None-Match`` or -``If-Modified-Since``, the response is replaced by an HttpNotModified. - -Also sets the ``Date`` and ``Content-Length`` response-headers. - -django.middleware.http.SetRemoteAddrFromForwardedFor ----------------------------------------------------- - -Sets ``request.META['REMOTE_ADDR']`` based on -``request.META['HTTP_X_FORWARDED_FOR']``, if the latter is set. This is useful -if you're sitting behind a reverse proxy that causes each request's -``REMOTE_ADDR`` to be set to ``127.0.0.1``. - -**Important note:** This does NOT validate ``HTTP_X_FORWARDED_FOR``. If you're -not behind a reverse proxy that sets ``HTTP_X_FORWARDED_FOR`` automatically, do -not use this middleware. Anybody can spoof the value of -``HTTP_X_FORWARDED_FOR``, and because this sets ``REMOTE_ADDR`` based on -``HTTP_X_FORWARDED_FOR``, that means anybody can "fake" their IP address. Only -use this when you can absolutely trust the value of ``HTTP_X_FORWARDED_FOR``. - -django.middleware.locale.LocaleMiddleware ------------------------------------------ - -Enables language selection based on data from the request. It customizes content -for each user. See the `internationalization documentation`_. - -.. _`internationalization documentation`: ../i18n/ - -django.contrib.sessions.middleware.SessionMiddleware ----------------------------------------------------- - -Enables session support. See the `session documentation`_. - -.. _`session documentation`: ../sessions/ - -django.contrib.auth.middleware.AuthenticationMiddleware -------------------------------------------------------- - -Adds the ``user`` attribute, representing the currently-logged-in user, to -every incoming ``HttpRequest`` object. See `Authentication in Web requests`_. - -.. _Authentication in Web requests: ../authentication/#authentication-in-web-requests - -django.contrib.csrf.middleware.CsrfMiddleware ---------------------------------------------- - -**New in Django development version** - -Adds protection against Cross Site Request Forgeries by adding hidden form -fields to POST forms and checking requests for the correct value. See the -`Cross Site Request Forgery protection documentation`_. - -.. _`Cross Site Request Forgery protection documentation`: ../csrf/ - -django.middleware.transaction.TransactionMiddleware ---------------------------------------------------- - -Binds commit and rollback to the request/response phase. If a view function runs -successfully, a commit is done. If it fails with an exception, a rollback is -done. - -The order of this middleware in the stack is important: middleware modules -running outside of it run with commit-on-save - the default Django behavior. -Middleware modules running inside it (coming later in the stack) will be under -the same transaction control as the view functions. - -See the `transaction management documentation`_. - -.. _`transaction management documentation`: ../transactions/ - -Writing your own middleware -=========================== - -Writing your own middleware is easy. Each middleware component is a single -Python class that defines one or more of the following methods: - -``process_request`` -------------------- - -Interface: ``process_request(self, request)`` - -``request`` is an ``HttpRequest`` object. This method is called on each -request, before Django decides which view to execute. - -``process_request()`` should return either ``None`` or an ``HttpResponse`` -object. If it returns ``None``, Django will continue processing this request, -executing any other middleware and, then, the appropriate view. If it returns -an ``HttpResponse`` object, Django won't bother calling ANY other request, -view or exception middleware, or the appropriate view; it'll return that -``HttpResponse``. Response middleware is always called on every response. - -``process_view`` ----------------- - -Interface: ``process_view(self, request, view_func, view_args, view_kwargs)`` - -``request`` is an ``HttpRequest`` object. ``view_func`` is the Python function -that Django is about to use. (It's the actual function object, not the name of -the function as a string.) ``view_args`` is a list of positional arguments that -will be passed to the view, and ``view_kwargs`` is a dictionary of keyword -arguments that will be passed to the view. Neither ``view_args`` nor -``view_kwargs`` include the first view argument (``request``). - -``process_view()`` is called just before Django calls the view. It should -return either ``None`` or an ``HttpResponse`` object. If it returns ``None``, -Django will continue processing this request, executing any other -``process_view()`` middleware and, then, the appropriate view. If it returns an -``HttpResponse`` object, Django won't bother calling ANY other request, view -or exception middleware, or the appropriate view; it'll return that -``HttpResponse``. Response middleware is always called on every response. - -``process_response`` --------------------- - -Interface: ``process_response(self, request, response)`` - -``request`` is an ``HttpRequest`` object. ``response`` is the ``HttpResponse`` -object returned by a Django view. - -``process_response()`` should return an ``HttpResponse`` object. It could alter -the given ``response``, or it could create and return a brand-new -``HttpResponse``. - -``process_exception`` ---------------------- - -Interface: ``process_exception(self, request, exception)`` - -``request`` is an ``HttpRequest`` object. ``exception`` is an ``Exception`` -object raised by the view function. - -Django calls ``process_exception()`` when a view raises an exception. -``process_exception()`` should return either ``None`` or an ``HttpResponse`` -object. If it returns an ``HttpResponse`` object, the response will be returned -to the browser. Otherwise, default exception handling kicks in. - -``__init__`` ------------- - -Most middleware classes won't need an initializer since middleware classes are -essentially placeholders for the ``process_*`` methods. If you do need some -global state you may use ``__init__`` to set up. However, keep in mind a couple -of caveats: - - * Django initializes your middleware without any arguments, so you can't - define ``__init__`` as requiring any arguments. - - * Unlike the ``process_*`` methods which get called once per request, - ``__init__`` gets called only *once*, when the web server starts up. - -Marking middleware as unused -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -It's sometimes useful to determine at run-time whether a piece of middleware -should be used. In these cases, your middleware's ``__init__`` method may raise -``django.core.exceptions.MiddlewareNotUsed``. Django will then remove that piece -of middleware from the middleware process. - -Guidelines ----------- - - * Middleware classes don't have to subclass anything. - - * The middleware class can live anywhere on your Python path. All Django - cares about is that the ``MIDDLEWARE_CLASSES`` setting includes the path - to it. - - * Feel free to look at Django's available middleware for examples. The - core Django middleware classes are in ``django/middleware/`` in the - Django distribution. The session middleware is in - ``django/contrib/sessions``. - - * If you write a middleware component that you think would be useful to - other people, contribute to the community! Let us know, and we'll - consider adding it to Django. diff --git a/docs/misc/api-stability.txt b/docs/misc/api-stability.txt new file mode 100644 index 0000000000..0bf4b984c4 --- /dev/null +++ b/docs/misc/api-stability.txt @@ -0,0 +1,95 @@ +.. _misc-api-stability: + +============= +API stability +============= + +Although Django has not reached a 1.0 release, the bulk of Django's public APIs are +stable as of the 0.95 release. This document explains which APIs will and will not +change before the 1.0 release. + +What "stable" means +=================== + +In this context, stable means: + + - All the public APIs -- everything documented in the linked documents, and + all methods that don't begin with an underscore -- will not be moved or + renamed without providing backwards-compatible aliases. + + - If new features are added to these APIs -- which is quite possible -- + they will not break or change the meaning of existing methods. In other + words, "stable" does not (necessarily) mean "complete." + + - If, for some reason, an API declared stable must be removed or replaced, it + will be declared deprecated but will remain in the API until at least + version 1.1. Warnings will be issued when the deprecated method is + called. + + - We'll only break backwards compatibility of these APIs if a bug or + security hole makes it completely unavoidable. + +Stable APIs +=========== + +These APIs are stable: + + - :ref:`Caching <topics-cache>`. + + - :ref:`Custom template tags and libraries <howto-custom-template-tags>`. + + - :ref:`Database lookup <topics-db-queries>` (with the exception of validation; see below). + + - :ref:`django-admin utility <ref-django-admin>`. + + - :ref:`FastCGI and mod_python integration <howto-deployment-index>`. + + - :ref:`Flatpages <ref-contrib-flatpages>`. + + - :ref:`Generic views <topics-http-generic-views>`. + + - :ref:`Internationalization <topics-i18n>`. + + - :ref:`Legacy database integration <howto-legacy-databases>`. + + - :ref:`Model definition <topics-db-models>` (with the exception of generic relations; see below). + + - :ref:`Redirects <ref-contrib-redirects>`. + + - :ref:`Request/response objects <ref-request-response>`. + + - :ref:`Sending e-mail <topics-email>`. + + - :ref:`Sessions <topics-http-sessions>`. + + - :ref:`Settings <topics-settings>`. + + - :ref:`Syndication <ref-contrib-syndication>`. + + - :ref:`Template language <topics-templates>` (with the exception of some + possible disambiguation of how tag arguments are passed to tags and + filters). + + - :ref:`Transactions <topics-db-transactions>`. + + - :ref:`URL dispatch <topics-http-urls>`. + +You'll notice that this list comprises the bulk of Django's APIs. That's right +-- most of the changes planned between now and Django 1.0 are either under the +hood, feature additions, or changes to a few select bits. A good estimate is +that 90% of Django can be considered forwards-compatible at this point. + +That said, these APIs should *not* be considered stable, and are likely to +change: + + - :ref:`Serialization <topics-serialization>` is under development; changes + are possible. + + - Generic relations will most likely be moved out of core and into the + content-types contrib package to avoid core dependencies on optional + components. + + **New in development version**: this has now been done. + + - The comments framework, which is yet undocumented, will get a complete + rewrite before Django 1.0. diff --git a/docs/design_philosophies.txt b/docs/misc/design-philosophies.txt similarity index 93% rename from docs/design_philosophies.txt rename to docs/misc/design-philosophies.txt index 465c4b547e..43bb8096c9 100644 --- a/docs/design_philosophies.txt +++ b/docs/misc/design-philosophies.txt @@ -1,3 +1,5 @@ +.. _misc-design-philosophies: + =================== Design philosophies =================== @@ -9,9 +11,13 @@ the future. Overall ======= +.. _loose-coupling: + Loose coupling -------------- +.. index:: coupling; loose + A fundamental goal of Django's stack is `loose coupling and tight cohesion`_. The various layers of the framework shouldn't "know" about each other unless absolutely necessary. @@ -25,6 +31,8 @@ stack are independent of another wherever possible. .. _`loose coupling and tight cohesion`: http://c2.com/cgi/wiki?CouplingAndCohesion +.. _less-code: + Less code --------- @@ -32,6 +40,8 @@ Django apps should use as little code as possible; they should lack boilerplate. Django should take full advantage of Python's dynamic capabilities, such as introspection. +.. _quick-development: + Quick development ----------------- @@ -39,15 +49,29 @@ The point of a Web framework in the 21st century is to make the tedious aspects of Web development fast. Django should allow for incredibly quick Web development. +.. _dry: + Don't repeat yourself (DRY) --------------------------- +.. index:: + single: DRY + single: Don't repeat yourself + Every distinct concept and/or piece of data should live in one, and only one, place. Redundancy is bad. Normalization is good. The framework, within reason, should deduce as much as possible from as little as possible. +.. seealso:: + + The `discussion of DRY on the Portland Pattern Repository`__ + + __ http://c2.com/cgi/wiki?DontRepeatYourself + +.. _explicit-is-better-than-implicit: + Explicit is better than implicit -------------------------------- @@ -59,6 +83,8 @@ learn how to use the feature. .. _`core Python principle`: http://www.python.org/dev/peps/pep-0020/ +.. _consistency: + Consistency ----------- @@ -155,19 +181,25 @@ File extensions in Web-page URLs should be avoided. Vignette-style commas in URLs deserve severe punishment. +.. _definitive-urls: + Definitive URLs --------------- +.. index:: urls; definitive + Technically, ``foo.com/bar`` and ``foo.com/bar/`` are two different URLs, and search-engine robots (and some Web traffic-analyzing tools) would treat them as separate pages. Django should make an effort to "normalize" URLs so that search-engine robots don't get confused. -This is the reasoning behind the ``APPEND_SLASH`` setting. +This is the reasoning behind the :setting:`APPEND_SLASH` setting. Template system =============== +.. _separation-of-logic-and-presentation: + Separate logic from presentation -------------------------------- @@ -186,9 +218,8 @@ a common header, footer, navigation bar, etc. The Django template system should make it easy to store those elements in a single place, eliminating duplicate code. -This is the philosophy behind `template inheritance`_. - -.. _template inheritance: ../templates/#template-inheritance +This is the philosophy behind :ref:`template inheritance +<template-inheritance>`. Be decoupled from HTML ---------------------- @@ -200,6 +231,8 @@ text. XML should not be used for template languages --------------------------------------------- +.. index:: xml; suckiness of + Using an XML engine to parse templates introduces a whole new world of human error in editing templates -- and incurs an unacceptable level of overhead in template processing. diff --git a/docs/distributions.txt b/docs/misc/distributions.txt similarity index 95% rename from docs/distributions.txt rename to docs/misc/distributions.txt index 0c051c8da5..c94c399ce0 100644 --- a/docs/distributions.txt +++ b/docs/misc/distributions.txt @@ -1,3 +1,5 @@ +.. _misc-distributions: + =================================== Third-party distributions of Django =================================== @@ -10,10 +12,8 @@ requires. Typically, these packages are based on the latest stable release of Django, so if you want to use the development version of Django you'll need to follow the -instructions for `installing the development version`_ from our Subversion -repository. - -.. _installing the development version: ../install/#installing-the-development-version +instructions for :ref:`installing the development version +<installing-development-version>` from our Subversion repository. FreeBSD ======= diff --git a/docs/misc/index.txt b/docs/misc/index.txt new file mode 100644 index 0000000000..534171b6ed --- /dev/null +++ b/docs/misc/index.txt @@ -0,0 +1,14 @@ +.. _misc-index: + +Meta-documentation and miscellany +================================= + +Documentation that we can't find a more organized place for. Like that drawer in +your kitchen with the scissors, batteries, duct tape, and other junk. + +.. toctree:: + :maxdepth: 2 + + api-stability + design-philosophies + distributions diff --git a/docs/model-api.txt b/docs/model-api.txt deleted file mode 100644 index a203aa38c8..0000000000 --- a/docs/model-api.txt +++ /dev/null @@ -1,2145 +0,0 @@ -=============== -Model reference -=============== - -A model is the single, definitive source of data about your data. It contains -the essential fields and behaviors of the data you're storing. Generally, each -model maps to a single database table. - -The basics: - - * Each model is a Python class that subclasses ``django.db.models.Model``. - * Each attribute of the model represents a database field. - * Model metadata (non-field information) goes in an inner class named - ``Meta``. - * With all of this, Django gives you an automatically-generated - database-access API, which is explained in the `Database API reference`_. - -A companion to this document is the `official repository of model examples`_. -(In the Django source distribution, these examples are in the -``tests/modeltests`` directory.) - -.. _Database API reference: ../db-api/ -.. _official repository of model examples: ../models/ - -Quick example -============= - -This example model defines a ``Person``, which has a ``first_name`` and -``last_name``:: - - from django.db import models - - class Person(models.Model): - first_name = models.CharField(max_length=30) - last_name = models.CharField(max_length=30) - -``first_name`` and ``last_name`` are *fields* of the model. Each field is -specified as a class attribute, and each attribute maps to a database column. - -The above ``Person`` model would create a database table like this:: - - CREATE TABLE myapp_person ( - "id" serial NOT NULL PRIMARY KEY, - "first_name" varchar(30) NOT NULL, - "last_name" varchar(30) NOT NULL - ); - -Some technical notes: - - * The name of the table, ``myapp_person``, is automatically derived from - some model metadata but can be overridden. See `Table names`_ below. - * An ``id`` field is added automatically, but this behavior can be - overridden. See `Automatic primary key fields`_ below. - * The ``CREATE TABLE`` SQL in this example is formatted using PostgreSQL - syntax, but it's worth noting Django uses SQL tailored to the database - backend specified in your `settings file`_. - -.. _settings file: ../settings/ - -Fields -====== - -The most important part of a model -- and the only required part of a model -- -is the list of database fields it defines. Fields are specified by class -attributes. - -Example:: - - class Musician(models.Model): - first_name = models.CharField(max_length=50) - last_name = models.CharField(max_length=50) - instrument = models.CharField(max_length=100) - - class Album(models.Model): - artist = models.ForeignKey(Musician) - name = models.CharField(max_length=100) - release_date = models.DateField() - num_stars = models.IntegerField() - -Field name restrictions ------------------------ - -Django places only two restrictions on model field names: - - 1. A field name cannot be a Python reserved word, because that would result - in a Python syntax error. For example:: - - class Example(models.Model): - pass = models.IntegerField() # 'pass' is a reserved word! - - 2. A field name cannot contain more than one underscore in a row, due to - the way Django's query lookup syntax works. For example:: - - class Example(models.Model): - foo__bar = models.IntegerField() # 'foo__bar' has two underscores! - -These limitations can be worked around, though, because your field name doesn't -necessarily have to match your database column name. See `db_column`_ below. - -SQL reserved words, such as ``join``, ``where`` or ``select``, *are* allowed as -model field names, because Django escapes all database table names and column -names in every underlying SQL query. It uses the quoting syntax of your -particular database engine. - -Field types ------------ - -Each field in your model should be an instance of the appropriate ``Field`` -class. Django uses the field class types to determine a few things: - - * The database column type (e.g. ``INTEGER``, ``VARCHAR``). - * The widget to use in Django's admin interface, if you care to use it - (e.g. ``<input type="text">``, ``<select>``). - * The minimal validation requirements, used in Django's admin and in - automatically-generated forms. - -Here are all available field types: - -``AutoField`` -~~~~~~~~~~~~~ - -An ``IntegerField`` that automatically increments according to available IDs. -You usually won't need to use this directly; a primary key field will -automatically be added to your model if you don't specify otherwise. See -`Automatic primary key fields`_. - -``BooleanField`` -~~~~~~~~~~~~~~~~ - -A true/false field. - -The admin represents this as a checkbox. - -``CharField`` -~~~~~~~~~~~~~ - -A string field, for small- to large-sized strings. - -For large amounts of text, use ``TextField``. - -The admin represents this as an ``<input type="text">`` (a single-line input). - -``CharField`` has an extra required argument, ``max_length``, the maximum length -(in characters) of the field. The max_length is enforced at the database level -and in Django's validation. - -``CommaSeparatedIntegerField`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -A field of integers separated by commas. As in ``CharField``, the ``max_length`` -argument is required. - -``DateField`` -~~~~~~~~~~~~~ - -A date field. Has a few extra optional arguments: - - ====================== =================================================== - Argument Description - ====================== =================================================== - ``auto_now`` Automatically set the field to now every time the - object is saved. Useful for "last-modified" - timestamps. Note that the current date is *always* - used; it's not just a default value that you can - override. - - ``auto_now_add`` Automatically set the field to now when the object - is first created. Useful for creation of - timestamps. Note that the current date is *always* - used; it's not just a default value that you can - override. - ====================== =================================================== - -The admin represents this as an ``<input type="text">`` with a JavaScript -calendar, and a shortcut for "Today." The JavaScript calendar will always start -the week on a Sunday. - -``DateTimeField`` -~~~~~~~~~~~~~~~~~ - -A date and time field. Takes the same extra options as ``DateField``. - -The admin represents this as two ``<input type="text">`` fields, with -JavaScript shortcuts. - -``DecimalField`` -~~~~~~~~~~~~~~~~ - -**New in Django development version** - -A fixed-precision decimal number, represented in Python by a ``Decimal`` instance. -Has two **required** arguments: - - ====================== =================================================== - Argument Description - ====================== =================================================== - ``max_digits`` The maximum number of digits allowed in the number. - - ``decimal_places`` The number of decimal places to store with the - number. - ====================== =================================================== - -For example, to store numbers up to 999 with a resolution of 2 decimal places, -you'd use:: - - models.DecimalField(..., max_digits=5, decimal_places=2) - -And to store numbers up to approximately one billion with a resolution of 10 -decimal places:: - - models.DecimalField(..., max_digits=19, decimal_places=10) - -The admin represents this as an ``<input type="text">`` (a single-line input). - -``EmailField`` -~~~~~~~~~~~~~~ - -A ``CharField`` that checks that the value is a valid e-mail address. - -In Django 0.96, this doesn't accept ``max_length``; its ``max_length`` is -automatically set to 75. In the Django development version, ``max_length`` is -set to 75 by default, but you can specify it to override default behavior. - -``FileField`` -~~~~~~~~~~~~~ - -A file-upload field. Has two special arguments, of which the first is -**required**: - - ====================== =================================================== - Argument Description - ====================== =================================================== - ``upload_to`` Required. A filesystem-style path that will be - prepended to the filename before being committed to - the final storage destination. - - **New in Django development version** - - This may also be a callable, such as a function, - which will be called to obtain the upload path, - including the filename. See below for details. - - ``storage`` **New in Django development version** - - Optional. A storage object, which handles the - storage and retrieval of your files. See `managing - files`_ for details on how to provide this object. - ====================== =================================================== - -.. _managing files: ../files/ - -The ``upload_to`` path may contain `strftime formatting`_, which will be -replaced by the date/time of the file upload (so that uploaded files don't fill -up the given directory). - -**New in Django development version** - -If a callable is provided for the ``upload_to`` argument, that callable must be -able to accept two arguments, and return a Unix-style path (with forward -slashes) to be passed along to the storage system. The two arguments that will -be passed are: - - ====================== =================================================== - Argument Description - ====================== =================================================== - ``instance`` An instance of the model where the ``FileField`` is - defined. More specifically, this is the particular - instance where the current file is being attached. - - **Note**: In most cases, this object will not have - been saved to the database yet, so if it uses the - default ``AutoField``, *it might not yet have a - value for its primary key field*. - - ``filename`` The filename that was originally given to the file. - This may or may not be taken into account when - determining the final destination path. - ====================== =================================================== - -The admin represents this field as an ``<input type="file">`` (a file-upload -widget). - -Using a ``FileField`` or an ``ImageField`` (see below) in a model without a -specified storage system takes a few steps: - - 1. In your settings file, you'll need to define ``MEDIA_ROOT`` as the - full path to a directory where you'd like Django to store uploaded - files. (For performance, these files are not stored in the database.) - Define ``MEDIA_URL`` as the base public URL of that directory. Make - sure that this directory is writable by the Web server's user - account. - - 2. Add the ``FileField`` or ``ImageField`` to your model, making sure - to define the ``upload_to`` option to tell Django to which - subdirectory of ``MEDIA_ROOT`` it should upload files. - - 3. All that will be stored in your database is a path to the file - (relative to ``MEDIA_ROOT``). You'll most likely want to use - ``object.<field>.url`` to get the actual URL. For example, if your - ``ImageField`` is called ``mug_shot``, you can get the absolute URL to - your image in a template with ``{{ object.mug_shot.url }}``. - -For example, say your ``MEDIA_ROOT`` is set to ``'/home/media'``, and -``upload_to`` is set to ``'photos/%Y/%m/%d'``. The ``'%Y/%m/%d'`` part of -``upload_to`` is strftime formatting; ``'%Y'`` is the four-digit year, -``'%m'`` is the two-digit month and ``'%d'`` is the two-digit day. If you -upload a file on Jan. 15, 2007, it will be saved in the directory -``/home/media/photos/2007/01/15``. - -Information about the uploaded ``File`` object, such as its on-disk filename, -its size, or its URL, is available via attributes on the object itself. See the -`managing files`__ documentation for more information about ``File`` objects. - -__ ../files/ - -Note that whenever you deal with uploaded files, you should pay close attention -to where you're uploading them and what type of files they are, to avoid -security holes. *Validate all uploaded files* so that you're sure the files are -what you think they are. For example, if you blindly let somebody upload files, -without validation, to a directory that's within your Web server's document -root, then somebody could upload a CGI or PHP script and execute that script by -visiting its URL on your site. Don't allow that. - -.. _`strftime formatting`: http://docs.python.org/lib/module-time.html#l2h-1941 - -**New in development version:** By default, ``FileField`` instances are -created as ``varchar(100)`` columns in your database. As with other fields, you -can change the maximum length using the ``max_length`` argument. - -``FilePathField`` -~~~~~~~~~~~~~~~~~ - -A field whose choices are limited to the filenames in a certain directory -on the filesystem. Has three special arguments, of which the first is -**required**: - - ====================== =================================================== - Argument Description - ====================== =================================================== - ``path`` Required. The absolute filesystem path to a - directory from which this ``FilePathField`` should - get its choices. Example: ``"/home/images"``. - - ``match`` Optional. A regular expression, as a string, that - ``FilePathField`` will use to filter filenames. - Note that the regex will be applied to the - base filename, not the full path. Example: - ``"foo.*\.txt$"``, which will match a file called - ``foo23.txt`` but not ``bar.txt`` or ``foo23.gif``. - - ``recursive`` Optional. Either ``True`` or ``False``. Default is - ``False``. Specifies whether all subdirectories of - ``path`` should be included. - ====================== =================================================== - -Of course, these arguments can be used together. - -The one potential gotcha is that ``match`` applies to the base filename, -not the full path. So, this example:: - - FilePathField(path="/home/images", match="foo.*", recursive=True) - -...will match ``/home/images/foo.gif`` but not ``/home/images/foo/bar.gif`` -because the ``match`` applies to the base filename (``foo.gif`` and -``bar.gif``). - -**New in development version:** By default, ``FilePathField`` instances are -created as ``varchar(100)`` columns in your database. As with other fields, you -can change the maximum length using the ``max_length`` argument. - -``FloatField`` -~~~~~~~~~~~~~~ - -**Changed in Django development version** - -A floating-point number represented in Python by a ``float`` instance. - -The admin represents this as an ``<input type="text">`` (a single-line input). - -**NOTE:** The semantics of ``FloatField`` have changed in the Django -development version. See the `Django 0.96 documentation`_ for the old behavior. - -.. _Django 0.96 documentation: http://www.djangoproject.com/documentation/0.96/model-api/#floatfield - -``ImageField`` -~~~~~~~~~~~~~~ - -Like `FileField`_, but validates that the uploaded object is a valid -image. Has two extra optional arguments, ``height_field`` and -``width_field``, which, if set, will be auto-populated with the height and -width of the image each time a model instance is saved. - -In addition to the `standard attributes and methods`_ that are available for -``FileField``, an ``ImageField`` also has ``width`` and ``height`` attributes. - -Requires the `Python Imaging Library`_. - -**New in development version:** By default, ``ImageField`` instances are -created as ``varchar(100)`` columns in your database. As with other fields, you -can change the maximum length using the ``max_length`` argument. - -.. _standard attributes and methods: ../files/#file-attributes-and-methods -.. _Python Imaging Library: http://www.pythonware.com/products/pil/ - -``IntegerField`` -~~~~~~~~~~~~~~~~ - -An integer. - -The admin represents this as an ``<input type="text">`` (a single-line input). - -``IPAddressField`` -~~~~~~~~~~~~~~~~~~ - -An IP address, in string format (e.g. "192.0.2.30"). - -The admin represents this as an ``<input type="text">`` (a single-line input). - -``NullBooleanField`` -~~~~~~~~~~~~~~~~~~~~ - -Like a ``BooleanField``, but allows ``NULL`` as one of the options. Use this -instead of a ``BooleanField`` with ``null=True``. - -The admin represents this as a ``<select>`` box with "Unknown", "Yes" and "No" choices. - -``PhoneNumberField`` -~~~~~~~~~~~~~~~~~~~~ - -A ``CharField`` that checks that the value is a valid U.S.A.-style phone -number (in the format ``XXX-XXX-XXXX``). - -``PositiveIntegerField`` -~~~~~~~~~~~~~~~~~~~~~~~~ - -Like an ``IntegerField``, but must be positive. - -``PositiveSmallIntegerField`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Like a ``PositiveIntegerField``, but only allows values under a certain -(database-dependent) point. - -``SlugField`` -~~~~~~~~~~~~~ - -"Slug" is a newspaper term. A slug is a short label for something, -containing only letters, numbers, underscores or hyphens. They're generally -used in URLs. - -Like a CharField, you can specify ``max_length``. If ``max_length`` is -not specified, Django will use a default length of 50. - -Implies ``db_index=True``. - -``SmallIntegerField`` -~~~~~~~~~~~~~~~~~~~~~ - -Like an ``IntegerField``, but only allows values under a certain -(database-dependent) point. - -``TextField`` -~~~~~~~~~~~~~ - -A large text field. - -The admin represents this as a ``<textarea>`` (a multi-line input). - -``TimeField`` -~~~~~~~~~~~~~ - -A time. Accepts the same auto-population options as ``DateField`` and -``DateTimeField``. - -The admin represents this as an ``<input type="text">`` with some -JavaScript shortcuts. - -``URLField`` -~~~~~~~~~~~~ - -A field for a URL. If the ``verify_exists`` option is ``True`` (default), -the URL given will be checked for existence (i.e., the URL actually loads -and doesn't give a 404 response). - -The admin represents this as an ``<input type="text">`` (a single-line input). - -``URLField`` takes an optional argument, ``max_length``, the maximum length (in -characters) of the field. The maximum length is enforced at the database level and -in Django's validation. If you don't specify ``max_length``, a default of 200 -is used. - -``USStateField`` -~~~~~~~~~~~~~~~~ - -A two-letter U.S. state abbreviation. - -The admin represents this as an ``<input type="text">`` (a single-line input). - -``XMLField`` -~~~~~~~~~~~~ - -A ``TextField`` that checks that the value is valid XML that matches a -given schema. Takes one required argument, ``schema_path``, which is the -filesystem path to a RelaxNG_ schema against which to validate the field. - -.. _RelaxNG: http://www.relaxng.org/ - -Field options -------------- - -The following arguments are available to all field types. All are optional. - -``null`` -~~~~~~~~ - -If ``True``, Django will store empty values as ``NULL`` in the database. -Default is ``False``. - -Note that empty string values will always get stored as empty strings, not -as ``NULL``. Only use ``null=True`` for non-string fields such as integers, -booleans and dates. For both types of fields, you will also need to set -``blank=True`` if you wish to permit empty values in forms, as the ``null`` -parameter only affects database storage (see blank_, below). - -Avoid using ``null`` on string-based fields such as ``CharField`` and -``TextField`` unless you have an excellent reason. If a string-based field -has ``null=True``, that means it has two possible values for "no data": -``NULL``, and the empty string. In most cases, it's redundant to have two -possible values for "no data;" Django convention is to use the empty -string, not ``NULL``. - -.. note:: - When using the Oracle database backend, the ``null=True`` option will - be coerced for string-based fields that can blank, and the value - ``NULL`` will be stored to denote the empty string. - -``blank`` -~~~~~~~~~ - -If ``True``, the field is allowed to be blank. Default is ``False``. - -Note that this is different than ``null``. ``null`` is purely -database-related, whereas ``blank`` is validation-related. If a field has -``blank=True``, validation on Django's admin site will allow entry of an -empty value. If a field has ``blank=False``, the field will be required. - -``choices`` -~~~~~~~~~~~ - -An iterable (e.g., a list or tuple) of 2-tuples to use as choices for this -field. - -If this is given, Django's admin will use a select box instead of the -standard text field and will limit choices to the choices given. - -A choices list looks like this:: - - YEAR_IN_SCHOOL_CHOICES = ( - ('FR', 'Freshman'), - ('SO', 'Sophomore'), - ('JR', 'Junior'), - ('SR', 'Senior'), - ('GR', 'Graduate'), - ) - -The first element in each tuple is the actual value to be stored. The -second element is the human-readable name for the option. - -The choices list can be defined either as part of your model class:: - - class Foo(models.Model): - GENDER_CHOICES = ( - ('M', 'Male'), - ('F', 'Female'), - ) - gender = models.CharField(max_length=1, choices=GENDER_CHOICES) - -or outside your model class altogether:: - - GENDER_CHOICES = ( - ('M', 'Male'), - ('F', 'Female'), - ) - class Foo(models.Model): - gender = models.CharField(max_length=1, choices=GENDER_CHOICES) - -You can also collect your available choices into named groups that can -be used for organizational purposes:: - - MEDIA_CHOICES = ( - ('Audio', ( - ('vinyl', 'Vinyl'), - ('cd', 'CD'), - ) - ), - ('Video', ( - ('vhs', 'VHS Tape'), - ('dvd', 'DVD'), - ) - ), - ('unknown', 'Unknown'), - ) - -The first element in each tuple is the name to apply to the group. The -second element is an iterable of 2-tuples, with each 2-tuple containing -a value and a human-readable name for an option. Grouped options may be -combined with ungrouped options within a single list (such as the -`unknown` option in this example). - -For each model field that has ``choices`` set, Django will add a method to -retrieve the human-readable name for the field's current value. See -`get_FOO_display`_ in the database API documentation. - -.. _get_FOO_display: ../db-api/#get-foo-display - -Finally, note that choices can be any iterable object -- not necessarily a -list or tuple. This lets you construct choices dynamically. But if you find -yourself hacking ``choices`` to be dynamic, you're probably better off using -a proper database table with a ``ForeignKey``. ``choices`` is meant for static -data that doesn't change much, if ever. - -``core`` -~~~~~~~~ - -For objects that are edited inline to a related object. - -In the Django admin, if all "core" fields in an inline-edited object are -cleared, the object will be deleted. - -It is an error to have an inline-editable relation without at least one -``core=True`` field. - -Please note that each field marked "core" is treated as a required field by the -Django admin site. Essentially, this means you should put ``core=True`` on all -required fields in your related object that is being edited inline. - -``db_column`` -~~~~~~~~~~~~~ - -The name of the database column to use for this field. If this isn't given, -Django will use the field's name. - -If your database column name is an SQL reserved word, or contains -characters that aren't allowed in Python variable names -- notably, the -hyphen -- that's OK. Django quotes column and table names behind the -scenes. - -``db_index`` -~~~~~~~~~~~~ - -If ``True``, ``django-admin.py sqlindexes`` will output a ``CREATE INDEX`` -statement for this field. - -``db_tablespace`` -~~~~~~~~~~~~~~~~~ - -**New in Django development version** - -The name of the database tablespace to use for this field's index, if -this field is indexed. The default is the project's -``DEFAULT_INDEX_TABLESPACE`` setting, if set, or the ``db_tablespace`` -of the model, if any. If the backend doesn't support tablespaces, this -option is ignored. - -``default`` -~~~~~~~~~~~ - -The default value for the field. This can be a value or a callable object. If -callable it will be called every time a new object is created. - -``editable`` -~~~~~~~~~~~~ - -If ``False``, the field will not be editable in the admin or via forms -automatically generated from the model class. Default is ``True``. - -``help_text`` -~~~~~~~~~~~~~ - -Extra "help" text to be displayed under the field on the object's admin -form. It's useful for documentation even if your object doesn't have an -admin form. - -Note that this value is *not* HTML-escaped when it's displayed in the admin -interface. This lets you include HTML in ``help_text`` if you so desire. For -example:: - - help_text="Please use the following format: <em>YYYY-MM-DD</em>." - -Alternatively you can use plain text and -``django.utils.html.escape()`` to escape any HTML special characters. - -``primary_key`` -~~~~~~~~~~~~~~~ - -If ``True``, this field is the primary key for the model. - -If you don't specify ``primary_key=True`` for any fields in your model, -Django will automatically add this field:: - - id = models.AutoField('ID', primary_key=True) - -Thus, you don't need to set ``primary_key=True`` on any of your fields -unless you want to override the default primary-key behavior. - -``primary_key=True`` implies ``null=False`` and ``unique=True``. Only -one primary key is allowed on an object. - -``unique`` -~~~~~~~~~~ - -If ``True``, this field must be unique throughout the table. - -This is enforced at the database level and at the Django admin-form level. If -you try to save a model with a duplicate value in a ``unique`` field, a -``django.db.IntegrityError`` will be raised by the model's ``save()`` method. - -``unique_for_date`` -~~~~~~~~~~~~~~~~~~~ - -Set this to the name of a ``DateField`` or ``DateTimeField`` to require -that this field be unique for the value of the date field. - -For example, if you have a field ``title`` that has -``unique_for_date="pub_date"``, then Django wouldn't allow the entry of -two records with the same ``title`` and ``pub_date``. - -This is enforced at the Django admin-form level but not at the database level. - -``unique_for_month`` -~~~~~~~~~~~~~~~~~~~~ - -Like ``unique_for_date``, but requires the field to be unique with respect -to the month. - -``unique_for_year`` -~~~~~~~~~~~~~~~~~~~ - -Like ``unique_for_date`` and ``unique_for_month``. - -``validator_list`` -~~~~~~~~~~~~~~~~~~ - -A list of extra validators to apply to the field. Each should be a callable -that takes the parameters ``field_data, all_data`` and raises -``django.core.validators.ValidationError`` for errors. (See the -`validator docs`_.) - -Django comes with quite a few validators. They're in ``django.core.validators``. - -.. _validator docs: ../oldforms/#validators - -Verbose field names -------------------- - -Each field type, except for ``ForeignKey``, ``ManyToManyField`` and -``OneToOneField``, takes an optional first positional argument -- a -verbose name. If the verbose name isn't given, Django will automatically create -it using the field's attribute name, converting underscores to spaces. - -In this example, the verbose name is ``"Person's first name"``:: - - first_name = models.CharField("Person's first name", max_length=30) - -In this example, the verbose name is ``"first name"``:: - - first_name = models.CharField(max_length=30) - -``ForeignKey``, ``ManyToManyField`` and ``OneToOneField`` require the first -argument to be a model class, so use the ``verbose_name`` keyword argument:: - - poll = models.ForeignKey(Poll, verbose_name="the related poll") - sites = models.ManyToManyField(Site, verbose_name="list of sites") - place = models.OneToOneField(Place, verbose_name="related place") - -Convention is not to capitalize the first letter of the ``verbose_name``. -Django will automatically capitalize the first letter where it needs to. - -Relationships -------------- - -Clearly, the power of relational databases lies in relating tables to each -other. Django offers ways to define the three most common types of database -relationships: Many-to-one, many-to-many and one-to-one. - -Many-to-one relationships -~~~~~~~~~~~~~~~~~~~~~~~~~ - -To define a many-to-one relationship, use ``ForeignKey``. You use it just like -any other ``Field`` type: by including it as a class attribute of your model. - -``ForeignKey`` requires a positional argument: the class to which the model is -related. - -For example, if a ``Car`` model has a ``Manufacturer`` -- that is, a -``Manufacturer`` makes multiple cars but each ``Car`` only has one -``Manufacturer`` -- use the following definitions:: - - class Manufacturer(models.Model): - # ... - - class Car(models.Model): - manufacturer = models.ForeignKey(Manufacturer) - # ... - -To create a recursive relationship -- an object that has a many-to-one -relationship with itself -- use ``models.ForeignKey('self')``. - -If you need to create a relationship on a model that has not yet been defined, -you can use the name of the model, rather than the model object itself:: - - class Car(models.Model): - manufacturer = models.ForeignKey('Manufacturer') - # ... - - class Manufacturer(models.Model): - # ... - -Note, however, that this only refers to models in the same models.py file -- you -cannot use a string to reference a model defined in another application or -imported from elsewhere. - -**New in Django development version:** To refer to models defined in another -application, you must instead explicitly specify the application label. For -example, if the ``Manufacturer`` model above is defined in another application -called ``production``, you'd need to use:: - - class Car(models.Model): - manufacturer = models.ForeignKey('production.Manufacturer') - -Behind the scenes, Django appends ``"_id"`` to the field name to create its -database column name. In the above example, the database table for the ``Car`` -model will have a ``manufacturer_id`` column. (You can change this explicitly -by specifying ``db_column``; see ``db_column`` below.) However, your code -should never have to deal with the database column name, unless you write -custom SQL. You'll always deal with the field names of your model object. - -It's suggested, but not required, that the name of a ``ForeignKey`` field -(``manufacturer`` in the example above) be the name of the model, lowercase. -You can, of course, call the field whatever you want. For example:: - - class Car(models.Model): - company_that_makes_it = models.ForeignKey(Manufacturer) - # ... - -See the `Many-to-one relationship model example`_ for a full example. - -.. _Many-to-one relationship model example: ../models/many_to_one/ - -``ForeignKey`` fields take a number of extra arguments for defining how the -relationship should work. All are optional: - - ======================= ============================================================ - Argument Description - ======================= ============================================================ - ``limit_choices_to`` A dictionary of lookup arguments and values (see - the `Database API reference`_) that limit the - available admin choices for this object. Use this - with functions from the Python ``datetime`` module - to limit choices of objects by date. For example:: - - limit_choices_to = {'pub_date__lte': datetime.now} - - only allows the choice of related objects with a - ``pub_date`` before the current date/time to be - chosen. - - Instead of a dictionary this can also be a ``Q`` object - (an object with a ``get_sql()`` method) for more complex - queries. - - ``limit_choices_to`` has no effect on the inline FormSets - that are created to display related objects in the admin. - - ``related_name`` The name to use for the relation from the related - object back to this one. See the - `related objects documentation`_ for a full - explanation and example. - - If using this in an `abstract base class`_, be - sure to read the `extra notes`_ in that section - about ``related_name``. - - ``to_field`` The field on the related object that the relation - is to. By default, Django uses the primary key of - the related object. - ======================= ============================================================ - -.. _`Database API reference`: ../db-api/ -.. _related objects documentation: ../db-api/#related-objects -.. _abstract base class: `Abstract base classes`_ -.. _extra notes: `Be careful with related_name`_ - -Many-to-many relationships -~~~~~~~~~~~~~~~~~~~~~~~~~~ - -To define a many-to-many relationship, use ``ManyToManyField``. You use it just -like any other ``Field`` type: by including it as a class attribute of your -model. - -``ManyToManyField`` requires a positional argument: the class to which the -model is related. - -For example, if a ``Pizza`` has multiple ``Topping`` objects -- that is, a -``Topping`` can be on multiple pizzas and each ``Pizza`` has multiple toppings -- -here's how you'd represent that:: - - class Topping(models.Model): - # ... - - class Pizza(models.Model): - # ... - toppings = models.ManyToManyField(Topping) - -As with ``ForeignKey``, a relationship to self can be defined by using the -string ``'self'`` instead of the model name, and you can refer to as-yet -undefined models by using a string containing the model name. However, you -can only use strings to refer to models in the same models.py file -- you -cannot use a string to reference a model in a different application, or to -reference a model that has been imported from elsewhere. - -It's suggested, but not required, that the name of a ``ManyToManyField`` -(``toppings`` in the example above) be a plural describing the set of related -model objects. - -Behind the scenes, Django creates an intermediary join table to represent the -many-to-many relationship. - -It doesn't matter which model gets the ``ManyToManyField``, but you only need -it in one of the models -- not in both. - -Generally, ``ManyToManyField`` instances should go in the object that's going -to be edited in the admin interface, if you're using Django's admin. In the -above example, ``toppings`` is in ``Pizza`` (rather than ``Topping`` having a -``pizzas`` ``ManyToManyField`` ) because it's more natural to think about a -``Pizza`` having toppings than a topping being on multiple pizzas. The way it's -set up above, the ``Pizza`` admin form would let users select the toppings. - -See the `Many-to-many relationship model example`_ for a full example. - -.. _Many-to-many relationship model example: ../models/many_to_many/ - -``ManyToManyField`` objects take a number of extra arguments for defining how -the relationship should work. All are optional: - - ======================= ============================================================ - Argument Description - ======================= ============================================================ - ``related_name`` See the description under ``ForeignKey`` above. - - ``limit_choices_to`` See the description under ``ForeignKey`` above. - - ``limit_choices_to`` has no effect when used on a - ``ManyToManyField`` with an intermediate table. - - ``symmetrical`` Only used in the definition of ManyToManyFields on self. - Consider the following model:: - - class Person(models.Model): - friends = models.ManyToManyField("self") - - When Django processes this model, it identifies that it has - a ``ManyToManyField`` on itself, and as a result, it - doesn't add a ``person_set`` attribute to the ``Person`` - class. Instead, the ``ManyToManyField`` is assumed to be - symmetrical -- that is, if I am your friend, then you are - my friend. - - If you do not want symmetry in ``ManyToMany`` relationships - with ``self``, set ``symmetrical`` to ``False``. This will - force Django to add the descriptor for the reverse - relationship, allowing ``ManyToMany`` relationships to be - non-symmetrical. - - ``db_table`` The name of the table to create for storing the many-to-many - data. If this is not provided, Django will assume a default - name based upon the names of the two tables being joined. - - ======================= ============================================================ - -Extra fields on many-to-many relationships -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -**New in Django development version** - -When you're only dealing with simple many-to-many relationships such as -mixing and matching pizzas and toppings, a standard ``ManyToManyField`` -is all you need. However, sometimes you may need to associate data with the -relationship between two models. - -For example, consider the case of an application tracking the musical groups -which musicians belong to. There is a many-to-many relationship between a person -and the groups of which they are a member, so you could use a ManyToManyField -to represent this relationship. However, there is a lot of detail about the -membership that you might want to collect, such as the date at which the person -joined the group. - -For these situations, Django allows you to specify the model that will be used -to govern the many-to-many relationship. You can then put extra fields on the -intermediate model. The intermediate model is associated with the -``ManyToManyField`` using the ``through`` argument to point to the model -that will act as an intermediary. For our musician example, the code would look -something like this:: - - class Person(models.Model): - name = models.CharField(max_length=128) - - def __unicode__(self): - return self.name - - class Group(models.Model): - name = models.CharField(max_length=128) - members = models.ManyToManyField(Person, through='Membership') - - def __unicode__(self): - return self.name - - class Membership(models.Model): - person = models.ForeignKey(Person) - group = models.ForeignKey(Group) - date_joined = models.DateField() - invite_reason = models.CharField(max_length=64) - -When you set up the intermediary model, you explicitly specify foreign -keys to the models that are involved in the ManyToMany relation. This -explicit declaration defines how the two models are related. - -There are a few restrictions on the intermediate model: - - * Your intermediate model must contain one - and *only* one - foreign key - on the target model (this would be ``Person`` in our example). If you - have more than one foreign key, a validation error will be raised. - - * Your intermediate model must contain one - and *only* one - foreign key - on the source model (this would be ``Group`` in our example). If you - have more than one foreign key, a validation error will be raised. - - * The only exception to this is a model which has a many-to-many - relationship to itself, through an intermediary model. In this - case, two foreign keys to the same model are permitted, but they - will be treated as the two (different) sides of the many-to-many - relation. - - * When defining a many-to-many relationship from a model to - itself, using an intermediary model, you *must* use - ``symmetrical=False`` (see the documentation for - ``ManyToManyField`` above). - -Now that you have set up your ``ManyToManyField`` to use your intermediary -model (Membership, in this case), you're ready to start creating some -many-to-many relationships. You do this by creating instances of the -intermediate model:: - - >>> ringo = Person.objects.create(name="Ringo Starr") - >>> paul = Person.objects.create(name="Paul McCartney") - >>> beatles = Group.objects.create(name="The Beatles") - >>> m1 = Membership(person=ringo, group=beatles, - ... date_joined=date(1962, 8, 16), - ... invite_reason= "Needed a new drummer.") - >>> m1.save() - >>> beatles.members.all() - [<Person: Ringo Starr>] - >>> ringo.group_set.all() - [<Group: The Beatles>] - >>> m2 = Membership.objects.create(person=paul, group=beatles, - ... date_joined=date(1960, 8, 1), - ... invite_reason= "Wanted to form a band.") - >>> beatles.members.all() - [<Person: Ringo Starr>, <Person: Paul McCartney>] - -Unlike normal many-to-many fields, you *can't* use ``add``, ``create``, -or assignment (i.e., ``beatles.members = [...]``) to create relationships:: - - # THIS WILL NOT WORK - >>> beatles.members.add(john) - # NEITHER WILL THIS - >>> beatles.members.create(name="George Harrison") - # AND NEITHER WILL THIS - >>> beatles.members = [john, paul, ringo, george] - -Why? You can't just create a relationship between a Person and a Group - you -need to specify all the detail for the relationship required by the -Membership table. The simple ``add``, ``create`` and assignment calls -don't provide a way to specify this extra detail. As a result, they are -disabled for many-to-many relationships that use an intermediate model. -The only way to create a many-to-many relationship with an intermediate table -is to create instances of the intermediate model. - -The ``remove`` method is disabled for similar reasons. However, the -``clear()`` method can be used to remove all many-to-many relationships -for an instance:: - - # Beatles have broken up - >>> beatles.members.clear() - -Once you have established the many-to-many relationships by creating instances -of your intermediate model, you can issue queries. Just as with normal -many-to-many relationships, you can query using the attributes of the -many-to-many-related model:: - - # Find all the groups with a member whose name starts with 'Paul' - >>> Groups.objects.filter(person__name__startswith='Paul') - [<Group: The Beatles>] - -As you are using an intermediate table, you can also query on the attributes -of the intermediate model:: - - # Find all the members of the Beatles that joined after 1 Jan 1961 - >>> Person.objects.filter( - ... group__name='The Beatles', - ... membership__date_joined__gt=date(1961,1,1)) - [<Person: Ringo Starr] - -One-to-one relationships -~~~~~~~~~~~~~~~~~~~~~~~~ - -To define a one-to-one relationship, use ``OneToOneField``. You use it just -like any other ``Field`` type: by including it as a class attribute of your -model. - -This is most useful on the primary key of an object when that object "extends" -another object in some way. - -``OneToOneField`` requires a positional argument: the class to which the -model is related. - -For example, if you're building a database of "places", you would build pretty -standard stuff such as address, phone number, etc. in the database. Then, if you -wanted to build a database of restaurants on top of the places, instead of -repeating yourself and replicating those fields in the ``Restaurant`` model, you -could make ``Restaurant`` have a ``OneToOneField`` to ``Place`` (because a -restaurant "is-a" place). - -As with ``ForeignKey``, a relationship to self can be defined by using the -string ``"self"`` instead of the model name; references to as-yet undefined -models can be made by using a string containing the model name. - -Finally, ``OneToOneField`` takes the following extra option: - - ======================= ============================================================ - Argument Description - ======================= ============================================================ - ``parent_link`` When ``True`` and used in a model inherited from - another model, indicates that this field should - be used as the link from the child back to the - parent. See `Model inheritance`_ for more - details. - - **New in Django development version** - - ======================= ============================================================ - -**New in Django development version:** ``OneToOneField`` classes used to -automatically become the primary key on a model. This is no longer true, -although you can manually pass in the ``primary_key`` attribute if you like. -Thus, it's now possible to have multiple fields of type ``OneToOneField`` on a -single model. - -See the `One-to-one relationship model example`_ for a full example. - -.. _One-to-one relationship model example: ../models/one_to_one/ - -Custom field types ------------------- - -**New in Django development version** - -If one of the existing model fields cannot be used to fit your purposes, or if -you wish to take advantage of some less common database column types, you can -create your own field class. Full coverage of creating your own fields is -provided in the `Custom Model Fields`_ documentation. - -.. _Custom Model Fields: ../custom_model_fields/ - -Meta options -============ - -Give your model metadata by using an inner ``class Meta``, like so:: - - class Foo(models.Model): - bar = models.CharField(max_length=30) - - class Meta: - # ... - -Model metadata is "anything that's not a field", such as ordering options, etc. - -Here's a list of all possible ``Meta`` options. No options are required. Adding -``class Meta`` to a model is completely optional. - -``abstract`` ------------- - -**New in Django development version** - -When set to ``True``, denotes this model as an abstract base class. See -`Abstract base classes`_ for more details. Defaults to ``False``. - -``db_table`` ------------- - -The name of the database table to use for the model:: - - db_table = 'music_album' - -If this isn't given, Django will use ``app_label + '_' + model_class_name``. -See "Table names" below for more. - -If your database table name is an SQL reserved word, or contains characters -that aren't allowed in Python variable names -- notably, the hyphen -- -that's OK. Django quotes column and table names behind the scenes. - -``db_tablespace`` ------------------ - -**New in Django development version** - -The name of the database tablespace to use for the model. If the backend -doesn't support tablespaces, this option is ignored. - -``get_latest_by`` ------------------ - -The name of a ``DateField`` or ``DateTimeField`` in the model. This specifies -the default field to use in your model ``Manager``'s ``latest()`` method. - -Example:: - - get_latest_by = "order_date" - -See the `docs for latest()`_ for more. - -.. _docs for latest(): ../db-api/#latest-field-name-none - -``order_with_respect_to`` -------------------------- - -Marks this object as "orderable" with respect to the given field. This is -almost always used with related objects to allow them to be ordered with -respect to a parent object. For example, if an ``Answer`` relates to a -``Question`` object, and a question has more than one answer, and the order -of answers matters, you'd do this:: - - class Answer(models.Model): - question = models.ForeignKey(Question) - # ... - - class Meta: - order_with_respect_to = 'question' - -``ordering`` ------------- - -The default ordering for the object, for use when obtaining lists of objects:: - - ordering = ['-order_date'] - -This is a tuple or list of strings. Each string is a field name with an -optional "-" prefix, which indicates descending order. Fields without a -leading "-" will be ordered ascending. Use the string "?" to order randomly. - -For example, to order by a ``pub_date`` field ascending, use this:: - - ordering = ['pub_date'] - -To order by ``pub_date`` descending, use this:: - - ordering = ['-pub_date'] - -To order by ``pub_date`` descending, then by ``author`` ascending, use this:: - - ordering = ['-pub_date', 'author'] - -See `Specifying ordering`_ for more examples. - -Note that, regardless of how many fields are in ``ordering``, the admin -site uses only the first field. - -.. _Specifying ordering: ../models/ordering/ - -``permissions`` ---------------- - -Extra permissions to enter into the permissions table when creating this -object. Add, delete and change permissions are automatically created for -each object that has ``admin`` set. This example specifies an extra -permission, ``can_deliver_pizzas``:: - - permissions = (("can_deliver_pizzas", "Can deliver pizzas"),) - -This is a list or tuple of 2-tuples in the format -``(permission_code, human_readable_permission_name)``. - -``unique_together`` -------------------- - -Sets of field names that, taken together, must be unique:: - - unique_together = (("driver", "restaurant"),) - -This is a list of lists of fields that must be unique when considered -together. It's used in the Django admin and is enforced at the database -level (i.e., the appropriate ``UNIQUE`` statements are included in the -``CREATE TABLE`` statement). - -All the fields specified in ``unique_together`` must be part of the current -model. If you are using `model inheritance`_, you cannot refer to fields from -any parent classes in ``unique_together``. - -**New in Django development version** - -For convenience, unique_together can be a single list when dealing -with a single set of fields:: - - unique_together = ("driver", "restaurant") - -``verbose_name`` ----------------- - -A human-readable name for the object, singular:: - - verbose_name = "pizza" - -If this isn't given, Django will use a munged version of the class name: -``CamelCase`` becomes ``camel case``. - -``verbose_name_plural`` ------------------------ - -The plural name for the object:: - - verbose_name_plural = "stories" - -If this isn't given, Django will use ``verbose_name + "s"``. - -Table names -=========== - -To save you time, Django automatically derives the name of the database table -from the name of your model class and the app that contains it. A model's -database table name is constructed by joining the model's "app label" -- the -name you used in ``manage.py startapp`` -- to the model's class name, with an -underscore between them. - -For example, if you have an app ``bookstore`` (as created by -``manage.py startapp bookstore``), a model defined as ``class Book`` will have -a database table named ``bookstore_book``. - -To override the database table name, use the ``db_table`` parameter in -``class Meta``. - -Automatic primary key fields -============================ - -By default, Django gives each model the following field:: - - id = models.AutoField(primary_key=True) - -This is an auto-incrementing primary key. - -If you'd like to specify a custom primary key, just specify ``primary_key=True`` -on one of your fields. If Django sees you've explicitly set ``primary_key``, it -won't add the automatic ``id`` column. - -Each model requires exactly one field to have ``primary_key=True``. - -The ``pk`` property -------------------- -**New in Django development version** - -Regardless of whether you define a primary key field yourself, or let Django -supply one for you, each model will have a property called ``pk``. It behaves -like a normal attribute on the model, but is actually an alias for whichever -attribute is the primary key field for the model. You can read and set this -value, just as you would for any other attribute, and it will update the -correct field in the model. - -Managers -======== - -A ``Manager`` is the interface through which database query operations are -provided to Django models. At least one ``Manager`` exists for every model in -a Django application. - -The way ``Manager`` classes work is documented in the `Retrieving objects`_ -section of the database API docs, but this section specifically touches on -model options that customize ``Manager`` behavior. - -.. _Retrieving objects: ../db-api/#retrieving-objects - -Manager names -------------- - -By default, Django adds a ``Manager`` with the name ``objects`` to every Django -model class. However, if you want to use ``objects`` as a field name, or if you -want to use a name other than ``objects`` for the ``Manager``, you can rename -it on a per-model basis. To rename the ``Manager`` for a given class, define a -class attribute of type ``models.Manager()`` on that model. For example:: - - from django.db import models - - class Person(models.Model): - #... - people = models.Manager() - -Using this example model, ``Person.objects`` will generate an -``AttributeError`` exception, but ``Person.people.all()`` will provide a list -of all ``Person`` objects. - -Custom Managers ---------------- - -You can use a custom ``Manager`` in a particular model by extending the base -``Manager`` class and instantiating your custom ``Manager`` in your model. - -There are two reasons you might want to customize a ``Manager``: to add extra -``Manager`` methods, and/or to modify the initial ``QuerySet`` the ``Manager`` -returns. - -Adding extra Manager methods -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Adding extra ``Manager`` methods is the preferred way to add "table-level" -functionality to your models. (For "row-level" functionality -- i.e., functions -that act on a single instance of a model object -- use `Model methods`_, not -custom ``Manager`` methods.) - -A custom ``Manager`` method can return anything you want. It doesn't have to -return a ``QuerySet``. - -For example, this custom ``Manager`` offers a method ``with_counts()``, which -returns a list of all ``OpinionPoll`` objects, each with an extra -``num_responses`` attribute that is the result of an aggregate query:: - - class PollManager(models.Manager): - def with_counts(self): - from django.db import connection - cursor = connection.cursor() - cursor.execute(""" - SELECT p.id, p.question, p.poll_date, COUNT(*) - FROM polls_opinionpoll p, polls_response r - WHERE p.id = r.poll_id - GROUP BY 1, 2, 3 - ORDER BY 3 DESC""") - result_list = [] - for row in cursor.fetchall(): - p = self.model(id=row[0], question=row[1], poll_date=row[2]) - p.num_responses = row[3] - result_list.append(p) - return result_list - - class OpinionPoll(models.Model): - question = models.CharField(max_length=200) - poll_date = models.DateField() - objects = PollManager() - - class Response(models.Model): - poll = models.ForeignKey(Poll) - person_name = models.CharField(max_length=50) - response = models.TextField() - -With this example, you'd use ``OpinionPoll.objects.with_counts()`` to return -that list of ``OpinionPoll`` objects with ``num_responses`` attributes. - -Another thing to note about this example is that ``Manager`` methods can -access ``self.model`` to get the model class to which they're attached. - -Modifying initial Manager QuerySets -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -A ``Manager``'s base ``QuerySet`` returns all objects in the system. For -example, using this model:: - - class Book(models.Model): - title = models.CharField(max_length=100) - author = models.CharField(max_length=50) - -...the statement ``Book.objects.all()`` will return all books in the database. - -You can override a ``Manager``\'s base ``QuerySet`` by overriding the -``Manager.get_query_set()`` method. ``get_query_set()`` should return a -``QuerySet`` with the properties you require. - -For example, the following model has *two* ``Manager``\s -- one that returns -all objects, and one that returns only the books by Roald Dahl:: - - # First, define the Manager subclass. - class DahlBookManager(models.Manager): - def get_query_set(self): - return super(DahlBookManager, self).get_query_set().filter(author='Roald Dahl') - - # Then hook it into the Book model explicitly. - class Book(models.Model): - title = models.CharField(max_length=100) - author = models.CharField(max_length=50) - - objects = models.Manager() # The default manager. - dahl_objects = DahlBookManager() # The Dahl-specific manager. - -With this sample model, ``Book.objects.all()`` will return all books in the -database, but ``Book.dahl_objects.all()`` will only return the ones written by -Roald Dahl. - -Of course, because ``get_query_set()`` returns a ``QuerySet`` object, you can -use ``filter()``, ``exclude()`` and all the other ``QuerySet`` methods on it. -So these statements are all legal:: - - Book.dahl_objects.all() - Book.dahl_objects.filter(title='Matilda') - Book.dahl_objects.count() - -This example also pointed out another interesting technique: using multiple -managers on the same model. You can attach as many ``Manager()`` instances to -a model as you'd like. This is an easy way to define common "filters" for your -models. - -For example:: - - class MaleManager(models.Manager): - def get_query_set(self): - return super(MaleManager, self).get_query_set().filter(sex='M') - - class FemaleManager(models.Manager): - def get_query_set(self): - return super(FemaleManager, self).get_query_set().filter(sex='F') - - class Person(models.Model): - first_name = models.CharField(max_length=50) - last_name = models.CharField(max_length=50) - sex = models.CharField(max_length=1, choices=(('M', 'Male'), ('F', 'Female'))) - people = models.Manager() - men = MaleManager() - women = FemaleManager() - -This example allows you to request ``Person.men.all()``, ``Person.women.all()``, -and ``Person.people.all()``, yielding predictable results. - -If you use custom ``Manager`` objects, take note that the first -``Manager`` Django encounters (in the order in which they're defined -in the model) has a special status. Django interprets this first -``Manager`` defined in a class as the "default" ``Manager``, and -several parts of Django (though not the admin application) will use -that ``Manager`` exclusively for that model. As a result, it's often a -good idea to be careful in your choice of default manager, in order to -avoid a situation where overriding of ``get_query_set()`` results in -an inability to retrieve objects you'd like to work with. - -Using managers for related object access -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -By default, Django uses a "bare" (i.e. default) manager when accessing related -objects (i.e. ``choice.poll``). If this default isn't appropriate for your -default manager, you can force Django to use a custom manager for related object -attributes by giving it a ``use_for_related_fields`` property:: - - class MyManager(models.Manager):: - use_for_related_fields = True - - ... - -Model methods -============= - -Define custom methods on a model to add custom "row-level" functionality to -your objects. Whereas ``Manager`` methods are intended to do "table-wide" -things, model methods should act on a particular model instance. - -This is a valuable technique for keeping business logic in one place -- the -model. - -For example, this model has a few custom methods:: - - class Person(models.Model): - first_name = models.CharField(max_length=50) - last_name = models.CharField(max_length=50) - birth_date = models.DateField() - address = models.CharField(max_length=100) - city = models.CharField(max_length=50) - state = models.USStateField() # Yes, this is America-centric... - - def baby_boomer_status(self): - "Returns the person's baby-boomer status." - import datetime - if datetime.date(1945, 8, 1) <= self.birth_date <= datetime.date(1964, 12, 31): - return "Baby boomer" - if self.birth_date < datetime.date(1945, 8, 1): - return "Pre-boomer" - return "Post-boomer" - - def is_midwestern(self): - "Returns True if this person is from the Midwest." - return self.state in ('IL', 'WI', 'MI', 'IN', 'OH', 'IA', 'MO') - - def _get_full_name(self): - "Returns the person's full name." - return '%s %s' % (self.first_name, self.last_name) - full_name = property(_get_full_name) - -The last method in this example is a *property*. `Read more about properties`_. - -.. _Read more about properties: http://www.python.org/download/releases/2.2/descrintro/#property - -A few object methods have special meaning: - -``__str__`` ------------ - -``__str__()`` is a Python "magic method" that defines what should be returned -if you call ``str()`` on the object. Django uses ``str(obj)`` (or the related -function, ``unicode(obj)`` -- see below) in a number of places, most notably -as the value displayed to render an object in the Django admin site and as the -value inserted into a template when it displays an object. Thus, you should -always return a nice, human-readable string for the object's ``__str__``. -Although this isn't required, it's strongly encouraged (see the description of -``__unicode__``, below, before putting ``__str__`` methods everywhere). - -For example:: - - class Person(models.Model): - first_name = models.CharField(max_length=50) - last_name = models.CharField(max_length=50) - - def __str__(self): - # Note use of django.utils.encoding.smart_str() here because - # first_name and last_name will be unicode strings. - return smart_str('%s %s' % (self.first_name, self.last_name)) - -``__unicode__`` ---------------- - -The ``__unicode__()`` method is called whenever you call ``unicode()`` on an -object. Since Django's database backends will return Unicode strings in your -model's attributes, you would normally want to write a ``__unicode__()`` -method for your model. The example in the previous section could be written -more simply as:: - - class Person(models.Model): - first_name = models.CharField(max_length=50) - last_name = models.CharField(max_length=50) - - def __unicode__(self): - return u'%s %s' % (self.first_name, self.last_name) - -If you define a ``__unicode__()`` method on your model and not a ``__str__()`` -method, Django will automatically provide you with a ``__str__()`` that calls -``__unicode__()`` and then converts the result correctly to a UTF-8 encoded -string object. This is recommended development practice: define only -``__unicode__()`` and let Django take care of the conversion to string objects -when required. - -``get_absolute_url`` --------------------- - -Define a ``get_absolute_url()`` method to tell Django how to calculate the -URL for an object. For example:: - - def get_absolute_url(self): - return "/people/%i/" % self.id - -Django uses this in its admin interface. If an object defines -``get_absolute_url()``, the object-editing page will have a "View on site" -link that will jump you directly to the object's public view, according to -``get_absolute_url()``. - -Also, a couple of other bits of Django, such as the `syndication feed framework`_, -use ``get_absolute_url()`` as a convenience to reward people who've defined the -method. - -.. _syndication feed framework: ../syndication_feeds/ - -It's good practice to use ``get_absolute_url()`` in templates, instead of -hard-coding your objects' URLs. For example, this template code is bad:: - - <a href="/people/{{ object.id }}/">{{ object.name }}</a> - -But this template code is good:: - - <a href="{{ object.get_absolute_url }}">{{ object.name }}</a> - -.. note:: - The string you return from ``get_absolute_url()`` must contain only ASCII - characters (required by the URI spec, `RFC 2396`_) that have been - URL-encoded, if necessary. Code and templates using ``get_absolute_url()`` - should be able to use the result directly without needing to do any - further processing. You may wish to use the - ``django.utils.encoding.iri_to_uri()`` function to help with this if you - are using unicode strings a lot. - -.. _RFC 2396: http://www.ietf.org/rfc/rfc2396.txt - -The ``permalink`` decorator -~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The problem with the way we wrote ``get_absolute_url()`` above is that it -slightly violates the DRY principle: the URL for this object is defined both -in the URLConf file and in the model. - -You can further decouple your models from the URLconf using the ``permalink`` -decorator. This decorator is passed the view function, a list of positional -parameters and (optionally) a dictionary of named parameters. Django then -works out the correct full URL path using the URLconf, substituting the -parameters you have given into the URL. For example, if your URLconf -contained a line such as:: - - (r'^people/(\d+)/$', 'people.views.details'), - -...your model could have a ``get_absolute_url`` method that looked like this:: - - from django.db.models import permalink - - def get_absolute_url(self): - return ('people.views.details', [str(self.id)]) - get_absolute_url = permalink(get_absolute_url) - -Similarly, if you had a URLconf entry that looked like:: - - (r'/archive/(?P<year>\d{4})/(?P<month>\d{1,2})/(?P<day>\d{1,2})/$', archive_view) - -...you could reference this using ``permalink()`` as follows:: - - def get_absolute_url(self): - return ('archive_view', (), { - 'year': self.created.year, - 'month': self.created.month, - 'day': self.created.day}) - get_absolute_url = permalink(get_absolute_url) - -Notice that we specify an empty sequence for the second parameter in this case, -because we only want to pass keyword parameters, not positional ones. - -In this way, you're tying the model's absolute URL to the view that is used -to display it, without repeating the URL information anywhere. You can still -use the ``get_absolute_url`` method in templates, as before. - -In some cases, such as the use of generic views or the re-use of -custom views for multiple models, specifying the view function may -confuse the reverse URL matcher (because multiple patterns point to -the same view). - -For that problem, Django has **named URL patterns**. Using a named -URL pattern, it's possible to give a name to a pattern, and then -reference the name rather than the view function. A named URL -pattern is defined by replacing the pattern tuple by a call to -the ``url`` function):: - - from django.conf.urls.defaults import * - - url(r'^people/(\d+)/$', - 'django.views.generic.list_detail.object_detail', - name='people_view'), - -...and then using that name to perform the reverse URL resolution instead -of the view name:: - - from django.db.models import permalink - - def get_absolute_url(self): - return ('people_view', [str(self.id)]) - get_absolute_url = permalink(get_absolute_url) - -More details on named URL patterns are in the `URL dispatch documentation`_. - -.. _URL dispatch documentation: ../url_dispatch/#naming-url-patterns - -Executing custom SQL --------------------- - -Feel free to write custom SQL statements in custom model methods and -module-level methods. The object ``django.db.connection`` represents the -current database connection. To use it, call ``connection.cursor()`` to get a -cursor object. Then, call ``cursor.execute(sql, [params])`` to execute the SQL -and ``cursor.fetchone()`` or ``cursor.fetchall()`` to return the resulting -rows. Example:: - - def my_custom_sql(self): - from django.db import connection - cursor = connection.cursor() - cursor.execute("SELECT foo FROM bar WHERE baz = %s", [self.baz]) - row = cursor.fetchone() - return row - -``connection`` and ``cursor`` mostly implement the standard `Python DB-API`_ -(except when it comes to `transaction handling`_). If you're not familiar with -the Python DB-API, note that the SQL statement in ``cursor.execute()`` uses -placeholders, ``"%s"``, rather than adding parameters directly within the SQL. -If you use this technique, the underlying database library will automatically -add quotes and escaping to your parameter(s) as necessary. (Also note that -Django expects the ``"%s"`` placeholder, *not* the ``"?"`` placeholder, which is -used by the SQLite Python bindings. This is for the sake of consistency and -sanity.) - -A final note: If all you want to do is a custom ``WHERE`` clause, you can just -use the ``where``, ``tables`` and ``params`` arguments to the standard lookup -API. See `Other lookup options`_. - -.. _Python DB-API: http://www.python.org/peps/pep-0249.html -.. _Other lookup options: ../db-api/#extra-select-none-where-none-params-none-tables-none -.. _transaction handling: ../transactions/ - -Overriding default model methods --------------------------------- - -As explained in the `database API docs`_, each model gets a few methods -automatically -- most notably, ``save()`` and ``delete()``. You can override -these methods to alter behavior. - -A classic use-case for overriding the built-in methods is if you want something -to happen whenever you save an object. For example:: - - class Blog(models.Model): - name = models.CharField(max_length=100) - tagline = models.TextField() - - def save(self): - do_something() - super(Blog, self).save() # Call the "real" save() method. - do_something_else() - -You can also prevent saving:: - - class Blog(models.Model): - name = models.CharField(max_length=100) - tagline = models.TextField() - - def save(self): - if self.name == "Yoko Ono's blog": - return # Yoko shall never have her own blog! - else: - super(Blog, self).save() # Call the "real" save() method. - -.. _database API docs: ../db-api/ - -Model inheritance -================= - -**New in Django development version** - -Model inheritance in Django works almost identically to the way normal class -inheritance works in Python. The only decision you have to make is whether you -want the parent models to be models in their own right (with their own -database tables), or if the parents are just holders of common information -that will only be visible through the child models. - -Often, you will just want to use the parent class to hold information that you -don't want to have to type out for each child model. This class isn't going to -ever be used in isolation, so `abstract base classes`_ are what you're after. However, if you're subclassing an existing model (perhaps something from another application entirely), or want each model to have its own database table, `multi-table inheritance`_ is the way to go. - -Abstract base classes ---------------------- - -Abstract base classes are useful when you want to put some common information -into a number of other models. You write your base class and put -``abstract=True`` in the ``Meta`` class. This model will then not be used to -create any database table. Instead, when it is used as a base class for other -models, its fields will be added to those of the child class. It is an error -to have fields in the abstract base class with the same name as those in the -child (and Django will raise an exception). - -An example:: - - class CommonInfo(models.Model): - name = models.CharField(max_length=100) - age = models.PositiveIntegerField() - - class Meta: - abstract = True - - class Student(CommonInfo): - home_group = models.CharField(max_length=5) - -The ``Student`` model will have three fields: ``name``, ``age`` and -``home_group``. The ``CommonInfo`` model cannot be used as a normal Django -model, since it is an abstract base class. It does not generate a database -table or have a manager or anything like that. - -For many uses, this type of model inheritance will be exactly what you want. -It provides a way to factor out common information at the Python level, whilst -still only creating one database table per child model at the database level. - -``Meta`` inheritance -~~~~~~~~~~~~~~~~~~~~ - -When an abstract base class is created, Django makes any ``Meta`` inner class -you declared on the base class available as an attribute. If a child class -does not declare its own ``Meta`` class, it will inherit the parent's -``Meta``. If the child wants to extend the parent's ``Meta`` class, it can -subclass it. For example:: - - class CommonInfo(models.Model): - ... - class Meta: - abstract = True - ordering = ['name'] - - class Student(CommonInfo): - ... - class Meta(CommonInfo.Meta): - db_table = 'student_info' - -Django does make one adjustment to the ``Meta`` class of an abstract base -class: before installing the ``Meta`` attribute, it sets ``abstract=False``. -This means that children of abstract base classes don't automatically become -abstract classes themselves. Of course, you can make an abstract base class -that inherits from another abstract base class. You just need to remember to -explicitly set ``abstract=True`` each time. - -Some attributes won't make sense to include in the ``Meta`` class of an -abstract base class. For example, including ``db_table`` would mean that all -the child classes (the ones that don't specify their own ``Meta``) would use -the same database table, which is almost certainly not what you want. - -Be careful with ``related_name`` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -If you are using the ``related_name`` attribute on a ``ForeignKey`` or -``ManyToManyField``, you must always specify a *unique* reverse name for the -field. This would normally cause a problem in abstract base classes, since the -fields on this class are included into each of the child classes, with exactly -the same values for the attributes (including ``related_name``) each time. - -To work around this problem, when you are using ``related_name`` in an -abstract base class (only), part of the name should be the string -``'%(class)s'``. This is replaced by the lower-cased name of the child class -that the field is used in. Since each class has a different name, each related -name will end up being different. For example:: - - class Base(models.Model): - m2m = models.ManyToMany(OtherModel, related_name="%(class)s_related") - - class Meta: - abstract = True - - class ChildA(Base): - pass - - class ChildB(Base): - pass - -The reverse name of the ``ChildA.m2m`` field will be ``childa_related``, -whilst the reverse name of the ``ChildB.m2m`` field will be -``childb_related``. It is up to you how you use the ``'%(class)s'`` portion to -construct your related name, but if you forget to use it, Django will raise -errors when you validate your models (or run ``syncdb``). - -If you don't specify a ``related_name`` attribute for a field in an abstract -base class, the default reverse name will be the name of the child class -followed by ``'_set'``, just as it normally would be if you'd declared the field directly on the child class. For example, in the above code, if the ``related_name`` attribute was omitted, the reverse name for the ``m2m`` field would be ``childa_set`` in the ``ChildA`` case and ``childb_set`` for the ``ChildB`` field. - -Multi-table inheritance ------------------------ - -The second type of model inheritance supported by Django is when each model in -the hierarchy is a model all by itself. Each model corresponds to its own -database table and can be queried and created individually. The inheritance -relationship introduces links between the child model and each of its parents -(via an automatically created ``OneToOneField``). For example:: - - class Place(models.Model): - name = models.CharField(max_length=50) - address = models.CharField(max_length=80) - - class Restaurant(Place): - serves_hot_dogs = models.BooleanField() - serves_pizza = models.BooleanField() - -All of the fields of ``Place`` will also be available in ``Restaurant``, -although the data will reside in a different database table. So these are both -possible:: - - >>> Place.objects.filter(name="Bob's Cafe") - >>> Restaurant.objects.filter(name="Bob's Cafe") - -If you have a ``Place`` that is also a ``Restaurant``, you can get from the -``Place`` object to the ``Restaurant`` object by using the lower-case version -of the model name:: - - >>> p = Place.objects.filter(name="Bob's Cafe") - # If Bob's Cafe is a Restaurant object, this will give the child class: - >>> p.restaurant - <Restaurant: ...> - -However, if ``p`` in the above example was *not* a ``Restaurant`` (it had been -created directly as a ``Place`` object or was the parent of some other class), -referring to ``p.restaurant`` would give an error. - -``Meta`` and multi-table inheritance -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -In the multi-table inheritance situation, it doesn't make sense for a child -class to inherit from its parent's ``Meta`` class. All the ``Meta`` options -have already been applied to the parent class and applying them again would -normally only lead to contradictory behaviour (this is in contrast with the -abstract base class case, where the base class doesn't exist in its own -right). - -So a child model does not have access to its parent's ``Meta`` class. However, -there are a few limited cases where the child inherits behaviour from the -parent: if the child does not specify an ``ordering`` attribute or a -``get_latest_by`` attribute, it will inherit these from its parent. - -If the parent has an ordering and you don't want the child to have any natural -ordering, you can explicitly set it to be empty:: - - class ChildModel(ParentModel): - ... - class Meta: - # Remove parent's ordering effect - ordering = [] - -Inheritance and reverse relations -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Because multi-table inheritance uses an implicit ``OneToOneField`` to link the -child and the parent, it's possible to move from the parent down to the child, -as in the above example. However, this uses up the name that is the default -``related_name`` value for ``ForeignKey`` and ``ManyToManyField`` relations. -If you are putting those type of relations on a subclass of another model, you -**must** specify the ``related_name`` attribute on each such field. If you -forget, Django will raise an error when you run ``manage.py validate`` or try -to syncdb. - -For example, using the above ``Place`` class again, let's create another -subclass with a ``ManyToManyField``:: - - class Supplier(Place): - # Must specify related_name on all relations. - customers = models.ManyToManyField(Restaurant, - related_name='provider') - -For more information about reverse relations, refer to the `Database API -reference`_ . For now, just remember to run ``manage.py validate`` when -you're writing your models and pay attention to the error messages. - -Specifying the parent link field -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -As mentioned, Django will automatically create a ``OneToOneField`` linking -your child class back any non-abstract parent models. If you want to control -the name of the attribute linking back to the parent, you can create your own -link field and pass it ``parent_link=True``. For example, to explicitly -specify the field that will link ``Supplier`` to ``Place`` in the above -example, you could write:: - - class Supplier(Place): - parent = models.OneToOneField(Place, parent_link=True) - ... - -Multiple inheritance --------------------- - -Just as with Python's subclassing, it's possible for a Django model to inherit -from multiple parent models. Keep in mind that normal Python name resolution -rules apply. The first base class that a particular name appears in (e.g. -``Meta``) will be the one that is used. We stop searching once we find the -name once. This means that if multiple parents contain a ``Meta`` class, only -the first one is going to be used. All others will be ignored. - -Generally, you won't need to inherit from multiple parents. The main use-case -where this is useful is for ''mix-in'' classes: adding a particular extra -field or method to every class that inherits the mix-in. Try to keep your -inheritance hierarchies as simple and straightforward as possible so that you -won't have to struggle to work out where a particular piece of information is -coming from. - -Models across files -=================== - -It's perfectly OK to relate a model to one from another app. To do this, just -import the related model at the top of the model that holds your model. Then, -just refer to the other model class wherever needed. For example:: - - from mysite.geography.models import ZipCode - - class Restaurant(models.Model): - # ... - zip_code = models.ForeignKey(ZipCode) - -Using models -============ - -Once you have created your models, the final step is to tell Django you're -going to *use* those models. - -Do this by editing your settings file and changing the ``INSTALLED_APPS`` -setting to add the name of the module that contains your ``models.py``. - -For example, if the models for your application live in the module -``mysite.myapp.models`` (the package structure that is created for an -application by the ``manage.py startapp`` script), ``INSTALLED_APPS`` should -read, in part:: - - INSTALLED_APPS = ( - #... - 'mysite.myapp', - #... - ) - -Providing initial SQL data -========================== - -Django provides a hook for passing the database arbitrary SQL that's executed -just after the CREATE TABLE statements. Use this hook, for example, if you want -to populate default records, or create SQL functions, automatically. - -The hook is simple: Django just looks for a file called -``<appname>/sql/<modelname>.sql``, where ``<appname>`` is your app directory and -``<modelname>`` is the model's name in lowercase. - -In the ``Person`` example model at the top of this document, assuming it lives -in an app called ``myapp``, you could add arbitrary SQL to the file -``myapp/sql/person.sql``. Here's an example of what the file might contain:: - - INSERT INTO myapp_person (first_name, last_name) VALUES ('John', 'Lennon'); - INSERT INTO myapp_person (first_name, last_name) VALUES ('Paul', 'McCartney'); - -Each SQL file, if given, is expected to contain valid SQL statements -which will insert the desired data (e.g., properly-formatted -``INSERT`` statements separated by semicolons). - -The SQL files are read by the ``sqlcustom``, ``sqlreset``, ``sqlall`` and -``reset`` commands in ``manage.py``. Refer to the `manage.py documentation`_ -for more information. - -Note that if you have multiple SQL data files, there's no guarantee of the -order in which they're executed. The only thing you can assume is that, by the -time your custom data files are executed, all the database tables already will -have been created. - -.. _`manage.py documentation`: ../django-admin/#sqlcustom-appname-appname - -Database-backend-specific SQL data ----------------------------------- - -There's also a hook for backend-specific SQL data. For example, you can have -separate initial-data files for PostgreSQL and MySQL. For each app, Django -looks for a file called ``<appname>/sql/<modelname>.<backend>.sql``, where -``<appname>`` is your app directory, ``<modelname>`` is the model's name in -lowercase and ``<backend>`` is the value of ``DATABASE_ENGINE`` in your -settings file (e.g., ``postgresql``, ``mysql``). - -Backend-specific SQL data is executed before non-backend-specific SQL data. For -example, if your app contains the files ``sql/person.sql`` and -``sql/person.postgresql.sql`` and you're installing the app on PostgreSQL, -Django will execute the contents of ``sql/person.postgresql.sql`` first, then -``sql/person.sql``. diff --git a/docs/obsolete/_images/formrow.gif b/docs/obsolete/_images/formrow.gif new file mode 100644 index 0000000000000000000000000000000000000000..3ff425862fb29a97b503a54490252f9894b99951 GIT binary patch literal 9156 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 literal 0 HcmV?d00001 diff --git a/docs/obsolete/_images/module.gif b/docs/obsolete/_images/module.gif new file mode 100644 index 0000000000000000000000000000000000000000..43c4d4de99d94fe8be6c5d541d4f9075e06e6d4f GIT binary patch literal 5786 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 literal 0 HcmV?d00001 diff --git a/docs/obsolete/_images/objecttools_01.gif b/docs/obsolete/_images/objecttools_01.gif new file mode 100644 index 0000000000000000000000000000000000000000..067edb6f7301524db930046ebaeb0b0801184ad7 GIT binary patch literal 1473 zcmd^;|4$Ql7{{+IU|ZQ>4hS%usGvnUvng)km#w0L;@s4!u!$4QWK3}mM29XWMNv1L zB7(AGt<<9)aA2iCyEVD7gF_3QU8q*eD!1LZrO<InEh#xUZhltxZ|wcU^TU&O-g(}6 z<;mKdxiY=rC=?5E5HvM4MWQeO+_PuTP=cPBnE`+o0ANUrWH><(5ER9!fDMDEr>E(l z6-Iy%KvC3a_YN?e!S1yNcQA@*VUNed`zWWEtE{Z_IZaj@<#2fjIskwm1Q-AUHrf~9 zftBGMtYCM0gF;}~#d1V2L5q7S7tJt!H*PYS#>U3{j8mi0;5Mqcxmn<OA8oTToX?H- z_V&WC!D}}RyIF@%aM7%dVj0R7@G^cs3pg)|BCN9qaBhkN-QC?@7s&@(;BFxJ{Q$6j z7DEw~pbQ4X$jC@vU!T`z0s>2z3|gbZ<HBhYbKxk4VF37zMq}_YhnKIfuh*KKfcJ1T zu7zO}X~hi2nwlEGJw|ZKVL<@TI7lN80Iao)kB?(UqX9-84#(NEXZe69z;ir9OiWA= z2rT$LO-)U9yIrr>GYmsusL4iY5tIX<uCC5vv5bz6QaECF(152Ai<4zp!s&6kJ&lcx zX0zFDLNFNa?CeBL_FDvvSs56$3Les9$NT&H5rVc-et~tkNFzrRR=3Xt!z9fO4-X4| z`qHIK)z#Ik0J^%mT3cIvLCQ9~t*y<@_=SK+tyTv?0sx@@ljcu{{8v}`d_MmPND80= zS;D3cUGEv`%S-YGI&P5XBNt|CHW`sS7h;zm92qb+WmQOG4rEMW`oUVo2Uy-<=gnX0 z7Z+F>HrE!;&8Qv?FUr-)?=`B<$PcG<q1zj><x1s~11%4lx8=mFJ?X63Q7JjTfwCPN zcQ!y!!qx5vw0h0Du7oGZ;$*2v^j^=!SIU-(a;24F_cQ7a=3>iibMD2bohM#Qi6hpw zez$b!Zmq6EhRI^C_hf-r*Cv<i#4^>MHL?=jR(($7CZcMa`18LX-kSSXL8;_XO`^D@ zrQ9BGKvw4!x_Y#G?xbcO$^T7Mw;?h7+P=>YzS)pj(JM|<?^Yj3j%r_j+k62$g=QPd zCogRIeTAxjR(qTx|JcfXZxee%CLaG>{l|?t?Yl1$NM>x?F|oF+Ah{)RYeL?}$m8$q z9nvgmB>DzZWwAp<>LTLmpXcVTI-V18TZlY8TSc4>35_q6x=t;;R=&R~)vU;hIz;RU zD>Nv^n{t=0DA&$==VA%8PMmxBMriEGBB)lT=WKf;@KUjIJ$|_&QkgNm;NzVieRK0# zp1C|M=F1a(3v*TRyQ<DeqPGpaf3D#4-Kg&gF&WZPME8om@Ou~Q7K~2GB^}D`q-d3t zAFF>FSJi@iJDDzDFe@oTru^#1lKjHMkGka=af&MR-PiP`p^D@Wmr3J}7GHmTNGi%p zY*TeNL@kO)mF^6gZT>Z09o126JaoH5kc(2q=^|MIN|X*ZXKu}@RXmDLgP=ExO;DKP z)XaTxrY6a-<*(~W(xT*w`4w@_&J%SnKxJW9#LLPY4|{~{jnTXIf1*?Wl$ieH{G5Ll zjT|Wh+4)~fLL$=Cl9ZvBB=h8-hDVd(SN5-;m!c9J14;G8lY@%p_DP%a2YkB<TKz9s CW5aC# literal 0 HcmV?d00001 diff --git a/docs/obsolete/_images/objecttools_02.gif b/docs/obsolete/_images/objecttools_02.gif new file mode 100644 index 0000000000000000000000000000000000000000..0faa39a6a94dcbce6c99768e38ea903b6d3c7100 GIT binary patch literal 1874 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 QG=DBXv^lybI$W{k|DldvhX4Qo literal 0 HcmV?d00001 diff --git a/docs/admin_css.txt b/docs/obsolete/admin-css.txt similarity index 89% rename from docs/admin_css.txt rename to docs/obsolete/admin-css.txt index 5822e26e45..f21d60888c 100644 --- a/docs/admin_css.txt +++ b/docs/obsolete/admin-css.txt @@ -1,7 +1,16 @@ +.. _obsolete-admin-css: + ====================================== Customizing the Django admin interface ====================================== +.. warning:: + + The design of the admin has changed somewhat since this document was + written, and parts may not apply any more. This document is no longer + maintained since an official API for customizing the Django admin interface + is in development. + Django's dynamic admin interface gives you a fully-functional admin for free with no hand-coding required. The dynamic admin is designed to be production-ready, not just a starting point, so you can use it as-is on a real @@ -20,13 +29,13 @@ group in a box and applies certain styles to the elements within. An ``h2`` within a ``div.module`` will align to the top of the ``div`` as a header for the whole group. -.. image:: http://media.djangoproject.com/img/doc/admincss/module.gif +.. image:: _images/module.gif :alt: Example use of module class on admin homepage Column Types ============ -.. admonition:: Note +.. note:: All admin pages (except the dashboard) are fluid-width. All fixed-width classes from previous Django versions have been removed. @@ -50,7 +59,9 @@ colSM doesn't matter. For instance, you could stick this in a template to make a two-column page with -the sidebar on the right:: +the sidebar on the right: + +.. code-block:: html+django {% block coltype %}colMS{% endblock %} @@ -115,23 +126,27 @@ to the right of the page. The tools are wrapped in a ``ul`` with the class additional class on the ``a`` for that tool. These are ``.addlink`` and ``.viewsitelink``. -Example from a changelist page:: +Example from a changelist page: + +.. code-block:: html+django <ul class="object-tools"> <li><a href="/stories/add/" class="addlink">Add redirect</a></li> </ul> -.. image:: http://media.djangoproject.com/img/doc/admincss/objecttools_01.gif +.. image:: _images/objecttools_01.gif :alt: Object tools on a changelist page -and from a form page:: +and from a form page: + +.. code-block:: html+django <ul class="object-tools"> <li><a href="/history/303/152383/">History</a></li> <li><a href="/r/303/152383/" class="viewsitelink">View on site</a></li> </ul> -.. image:: http://media.djangoproject.com/img/doc/admincss/objecttools_02.gif +.. image:: _images/objecttools_02.gif :alt: Object tools on a form page Form Styles @@ -161,7 +176,7 @@ Each row of the form (within the ``fieldset``) should be enclosed in a ``div`` with class ``form-row``. If the field in the row is required, a class of ``required`` should also be added to the ``div.form-row``. -.. image:: http://media.djangoproject.com/img/doc/admincss/formrow.gif +.. image:: _images/formrow.gif :alt: Example use of form-row class Labels diff --git a/docs/oldforms.txt b/docs/obsolete/forms.txt similarity index 97% rename from docs/oldforms.txt rename to docs/obsolete/forms.txt index 7703483f5d..9bfd4a979e 100644 --- a/docs/oldforms.txt +++ b/docs/obsolete/forms.txt @@ -1,3 +1,5 @@ +.. _obsolete-forms: + =============================== Forms, fields, and manipulators =============================== @@ -8,9 +10,7 @@ Forwards-compatibility note The legacy forms/manipulators system described in this document is going to be replaced in the next Django release. If you're starting from scratch, we strongly encourage you not to waste your time learning this. Instead, learn and -use the new `forms library`_. - -.. _forms library: ../forms/ +use the new :ref:`forms library <topics-forms-index>`. Introduction ============ @@ -232,8 +232,8 @@ Below is the finished view:: new_place = manipulator.save(new_data) # Redirect to the object's "edit" page. Always use a redirect - # after POST data, so that reloads don't accidently create - # duplicate entires, and so users don't see the confusing + # after POST data, so that reloads don't accidentally create + # duplicate entries, and so users don't see the confusing # "Repost POST data?" alert box in their browsers. return HttpResponseRedirect("/places/edit/%i/" % new_place.id) else: @@ -358,8 +358,8 @@ identical and could in fact be collapsed into a single view. This is left as an exercise for said programmer. (However, the even-more-astute programmer will take heed of the note at the top -of this document and check out the `generic views`_ documentation if all she -wishes to do is this type of simple create/update.) +of this document and check out the :ref:`generic views <ref-generic-views>` +documentation if all she wishes to do is this type of simple create/update.) Custom forms and manipulators ============================= @@ -684,13 +684,9 @@ fails. If no message is passed in, a default message is used. type from the list used to create the validator. ``RelaxNGCompact`` - Used to validate an XML document against a Relax NG compact schema. Takes - a file path to the location of the schema and an optional root element - (which is wrapped around the XML fragment before validation, if supplied). - At validation time, the XML fragment is validated against the schema using - the executable specified in the ``JING_PATH`` setting (see the settings_ - document for more details). - -.. _`generic views`: ../generic_views/ -.. _`models API`: ../model-api/ -.. _settings: ../settings/ + Used to validate an XML document against a Relax NG compact schema. Takes a + file path to the location of the schema and an optional root element (which + is wrapped around the XML fragment before validation, if supplied). At + validation time, the XML fragment is validated against the schema using the + executable specified in the ``JING_PATH`` setting (see the :ref:`settings + <ref-settings>` document for more details). diff --git a/docs/obsolete/index.txt b/docs/obsolete/index.txt new file mode 100644 index 0000000000..ae384d8ba9 --- /dev/null +++ b/docs/obsolete/index.txt @@ -0,0 +1,16 @@ +.. _obsolete-index: + +Deprecated/obsolete documentation +================================= + +These documents cover features that have been deprecated or that have been +replaced in newer versions of Django. They're preserved here for folks using old +versions of Django or those still using deprecated APIs. No new code based on +these APIs should be written. + +.. toctree:: + :maxdepth: 1 + + admin-css + forms + newforms-migration \ No newline at end of file diff --git a/docs/obsolete/newforms-migration.txt b/docs/obsolete/newforms-migration.txt new file mode 100644 index 0000000000..da56b5704e --- /dev/null +++ b/docs/obsolete/newforms-migration.txt @@ -0,0 +1,48 @@ +.. _howto-newforms-migration: + +Migrating from "oldforms" to "newforms" +======================================= + +:mod:`django.newforms` is new in Django's 0.96 release, but, as it won't be new +forever. We plan to rename it to ``django.forms`` in next official release. The +current ``django.forms`` package will be available as ``django.oldforms`` until +Django 1.0, when we plan to remove it for good. + +If you're using "old" forms -- and if you started using Django after 0.96 you're +probably not -- you need to read this document and understand this migration +plan. + + * The old forms framework (the current ``django.forms``) has been copied to + ``django.oldforms``. Thus, you can start upgrading your code *now*, + rather than waiting for the future backwards-incompatible change, by + changing your import statements like this:: + + from django import forms # old + from django import oldforms as forms # new + + * In the next Django release, we will move the current ``django.newforms`` + to ``django.forms``. This will be a backwards-incompatible change, and + anybody who is still using the old version of ``django.forms`` at that + time will need to change their import statements, as described in the + previous bullet. + + * We will remove ``django.oldforms`` in Django 1.0. It will continue to be + available from older tags in our SVN repository, but it will not be + consider part of Django, and will not be supported.. + +With this in mind, we recommend you use the following import statement when +using ``django.newforms``:: + + from django import newforms as forms + +This way, your code can refer to the ``forms`` module, and when +``django.newforms`` is renamed to ``django.forms``, you'll only have to change +your ``import`` statements. + +If you prefer "``import *``" syntax, you can do the following:: + + from django.newforms import * + +This will import all fields, widgets, form classes and other various utilities +into your local namespace. Some people find this convenient; others find it +too messy. The choice is yours. diff --git a/docs/ref/contrib/_images/flatfiles_admin.png b/docs/ref/contrib/_images/flatfiles_admin.png new file mode 100644 index 0000000000000000000000000000000000000000..391a629348e22c2ef6d966bf65e909bfaabf5372 GIT binary patch literal 42243 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 M07*qoM6N<$g7!X{8vp<R literal 0 HcmV?d00001 diff --git a/docs/ref/contrib/_images/users_changelist.png b/docs/ref/contrib/_images/users_changelist.png new file mode 100644 index 0000000000000000000000000000000000000000..d5f9c016cc2faffefefdf95a7a131e7090b3c22d GIT binary patch literal 59355 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	{5Dh!^G0W!=v*UmuXGy#~B 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 literal 0 HcmV?d00001 diff --git a/docs/admin.txt b/docs/ref/contrib/admin.txt similarity index 95% rename from docs/admin.txt rename to docs/ref/contrib/admin.txt index c656c716df..e7e55fbc82 100644 --- a/docs/admin.txt +++ b/docs/ref/contrib/admin.txt @@ -1,3 +1,5 @@ +.. _ref-contrib-admin: + ===================== The Django admin site ===================== @@ -108,7 +110,7 @@ A full example, taken from the ``django.contrib.flatpages.FlatPage`` model:: This results in an admin page that looks like: - .. image:: http://media.djangoproject.com/img/doc/flatfiles_admin.png + .. image:: _images/flatfiles_admin.png If ``fieldsets`` isn't given, Django will default to displaying each field that isn't an ``AutoField`` and has ``editable=True``, in a single fieldset, @@ -169,7 +171,7 @@ the ``django.contrib.flatpages.FlatPage`` model as follows:: fields = ('url', 'title', 'content') In the above example, only the fields 'url', 'title' and 'content' will be -displayed, sequencially, in the form. +displayed, sequentially, in the form. .. admonition:: Note @@ -221,7 +223,7 @@ You have four possible values that can be used in ``list_display``: class PersonAdmin(admin.ModelAdmin): list_display = (upper_case_name,) - * A string representating an attribute on the ``ModelAdmin``. This behaves + * A string representing an attribute on the ``ModelAdmin``. This behaves the same as the callable. For example:: class PersonAdmin(admin.ModelAdmin): @@ -231,7 +233,7 @@ You have four possible values that can be used in ``list_display``: return "%s %s" % (obj.first_name, obj.last_name).upper() upper_case_name.short_description = 'Name' - * A string representating an attribute on the model. This behaves almost + * A string representing an attribute on the model. This behaves almost the same as the callable, but ``self`` in this context is the model instance. Here's a full model example:: @@ -373,7 +375,7 @@ how both ``list_display`` and ``list_filter`` work:: The above code results in an admin change list page that looks like this: - .. image:: http://media.djangoproject.com/img/doc/users_changelist.png + .. image:: _images/users_changelist.png (This example also has ``search_fields`` defined. See below.) @@ -395,9 +397,8 @@ The value should be either ``True`` or ``False``. Default is ``False``. Note that Django will use ``select_related()``, regardless of this setting, if one of the ``list_display`` fields is a ``ForeignKey``. -For more on ``select_related()``, see `the select_related() docs`_. - -.. _the select_related() docs: ../db-api/#select-related +For more on ``select_related()``, see +:ref:`the select_related() docs <select-related>`. ``inlines`` ~~~~~~~~~~~ @@ -572,7 +573,7 @@ For example to attach ``request.user`` to the object prior to saving:: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The ``save_formset`` method is given the ``HttpRequest``, the parent -``ModelForm`` instance and a boolean value baesed on whether it is adding or +``ModelForm`` instance and a boolean value based on whether it is adding or changing the parent object. For example to attach ``request.user`` to each changed formset @@ -601,16 +602,14 @@ on your ``ModelAdmin``:: js = ("my_code.js",) Keep in mind that this will be prepended with ``MEDIA_URL``. The same rules -apply as `regular media definitions on forms`_. - -.. _regular media definitions on forms: ../forms/#media +apply as :ref:`regular media definitions on forms <topics-forms-media>`. Adding custom validation to the admin ------------------------------------- -Adding custom validation of data in the admin is quite easy. The automatic -admin interfaces reuses the Django `forms`_ module. The ``ModelAdmin`` class -gives you the ability define your own form:: +Adding custom validation of data in the admin is quite easy. The automatic admin +interfaces reuses :mod:`django.forms`, and the ``ModelAdmin`` class gives you +the ability define your own form:: class ArticleAdmin(admin.ModelAdmin): form = MyArticleAdminForm @@ -627,11 +626,9 @@ any field:: # do something that validates your data return self.cleaned_data["name"] -It is important you use a ``ModelForm`` here otherwise things can break. See -the `forms`_ documentation on `custom validation`_ for more information. - -.. _forms: ../forms/ -.. _custom validation: ../forms/#custom-form-and-field-validation +It is important you use a ``ModelForm`` here otherwise things can break. See the +:ref:`forms <ref-forms-index>` documentation on :ref:`custom validation +<ref-forms-validation>` for more information. ``InlineModelAdmin`` objects ============================ @@ -678,9 +675,7 @@ more than one foreign key to the same parent model. This defaults to ``BaseInlineFormSet``. Using your own formset can give you many possibilities of customization. Inlines are built around -`model formsets`_. - -.. _model formsets: ../modelforms/#model-formsets +:ref:`model formsets <model-formsets>`. ``form`` ~~~~~~~~ @@ -693,18 +688,15 @@ inline. ~~~~~~~~~ This controls the number of extra forms the formset will display in addition -to the initial forms. See the `formsets documentation`_ for more information. - -.. _formsets documentation: ../forms/#formsets +to the initial forms. See the +:ref:`formsets documentation <topics-forms-formsets>` for more information. ``max_num`` ~~~~~~~~~~~ This controls the maximum number of forms to show in the inline. This doesn't directly correlate to the number of objects, but can if the value is small -enough. See `max_num in formsets`_ for more information. - -.. _max_num in formsets: ../modelforms/#limiting-the-number-of-objects-editable +enough. See :ref:`model-formsets-max-num` for more information. ``raw_id_fields`` ~~~~~~~~~~~~~~~~~ @@ -852,9 +844,8 @@ example app:: ``django.contrib.contenttypes.generic`` provides both a ``GenericTabularInline`` and ``GenericStackedInline`` and behave just like any other inline. See the -`contenttypes documentation`_ for more specific information. - -.. _contenttypes documentation: ../contenttypes/ +:ref:`contenttypes documentation <ref-contrib-contenttypes>` for more specific +information. ``AdminSite`` objects ===================== diff --git a/docs/ref/contrib/auth.txt b/docs/ref/contrib/auth.txt new file mode 100644 index 0000000000..03f5ff1281 --- /dev/null +++ b/docs/ref/contrib/auth.txt @@ -0,0 +1,6 @@ +.. _ref-contrib-auth: + +``django.contrib.auth`` +======================= + +See :ref:`topics-auth`. diff --git a/docs/ref/contrib/contenttypes.txt b/docs/ref/contrib/contenttypes.txt new file mode 100644 index 0000000000..fe9a32b64f --- /dev/null +++ b/docs/ref/contrib/contenttypes.txt @@ -0,0 +1,347 @@ +.. _ref-contrib-contenttypes: + +========================== +The contenttypes framework +========================== + +.. module:: django.contrib.contenttypes + :synopsis: Provides generic interface to installed models. + +Django includes a :mod:`contenttypes` application that can track all of +the models installed in your Django-powered project, providing a +high-level, generic interface for working with your models. + +Overview +======== + +At the heart of the contenttypes application is the +:class:`~django.contrib.contenttypes.models.ContentType` model, which lives at +``django.contrib.contenttypes.models.ContentType``. Instances of +:class:`~django.contrib.contenttypes.models.ContentType` represent and store +information about the models installed in your project, and new instances of +:class:`~django.contrib.contenttypes.models.ContentType` are automatically +created whenever new models are installed. + +Instances of :class:`~django.contrib.contenttypes.models.ContentType` have +methods for returning the model classes they represent and for querying objects +from those models. :class:`~django.contrib.contenttypes.models.ContentType` +also has a :ref:`custom manager <custom-managers>` that adds methods for +working with :class:`~django.contrib.contenttypes.models.ContentType` and for +obtaining instances of :class:`~django.contrib.contenttypes.models.ContentType` +for a particular model. + +Relations between your models and +:class:`~django.contrib.contenttypes.models.ContentType` can also be used to +enable "generic" relationships between an instance of one of your +models and instances of any model you have installed. + +Installing the contenttypes framework +===================================== + +The contenttypes framework is included in the default +:setting:`INSTALLED_APPS` list created by ``django-admin.py startproject``, +but if you've removed it or if you manually set up your +:setting:`INSTALLED_APPS` list, you can enable it by adding +``'django.contrib.contenttypes'`` to your :setting:`INSTALLED_APPS` setting. + +It's generally a good idea to have the contenttypes framework +installed; several of Django's other bundled applications require it: + + * The admin application uses it to log the history of each object + added or changed through the admin interface. + + * Django's :mod:`authentication framework <django.contrib.auth>` uses it + to tie user permissions to specific models. + + * Django's comments system (:mod:`django.contrib.comments`) uses it to + "attach" comments to any installed model. + +The ``ContentType`` model +========================= + +.. class:: models.ContentType + + Each instance of :class:`~django.contrib.contenttypes.models.ContentType` + has three fields which, taken together, uniquely describe an installed model: + + .. attribute:: models.ContentType.app_label + + The name of the application the model is part of. This is taken from + the :attr:`app_label` attribute of the model, and includes only the *last* + part of the application's Python import path; + "django.contrib.contenttypes", for example, becomes an :attr:`app_label` + of "contenttypes". + + .. attribute:: models.ContentType.model + + The name of the model class. + + .. attribute:: models.ContentType.name + + The human-readable name of the model. This is taken from the + :attr:`verbose_name <django.db.models.fields.Field.verbose_name>` + attribute of the model. + +Let's look at an example to see how this works. If you already have +the contenttypes application installed, and then add +:mod:`the sites application <django.contrib.sites>` to your +:setting:`INSTALLED_APPS` setting and run ``manage.py syncdb`` to install it, +the model :class:`django.contrib.sites.models.Site` will be installed into +your database. Along with it a new instance of +:class:`~django.contrib.contenttypes.models.ContentType` will be +created with the following values: + + * :attr:`app_label` will be set to ``'sites'`` (the last part of the Python + path "django.contrib.sites"). + + * :attr:`model` will be set to ``'site'``. + + * :attr:`name` will be set to ``'site'``. + +.. _the verbose_name attribute: ../model-api/#verbose_name + +Methods on ``ContentType`` instances +==================================== + +.. class:: models.ContentType + + Each :class:`~django.contrib.contenttypes.models.ContentType` instance has + methods that allow you to get from a + :class:`~django.contrib.contenttypes.models.ContentType` instance to the model + it represents, or to retrieve objects from that model: + +.. method:: models.ContentType.get_object_for_this_type(**kwargs) + + Takes a set of valid :ref:`lookup arguments <field-lookups-intro>` for the + model the :class:`~django.contrib.contenttypes.models.ContentType` + represents, and does :ref:`a get() lookup <get-kwargs>` on that model, + returning the corresponding object. + +.. method:: models.ContentType.model_class() + + Returns the model class represented by this + :class:`~django.contrib.contenttypes.models.ContentType` instance. + +For example, we could look up the +:class:`~django.contrib.contenttypes.models.ContentType` for the +:class:`~django.contrib.auth.models.User` model:: + + >>> from django.contrib.contenttypes.models import ContentType + >>> user_type = ContentType.objects.get(app_label="auth", model="user") + >>> user_type + <ContentType: user> + +And then use it to query for a particular ``User``, or to get access +to the ``User`` model class:: + + >>> user_type.model_class() + <class 'django.contrib.auth.models.User'> + >>> user_type.get_object_for_this_type(username='Guido') + <User: Guido> + +Together, +:meth:`~django.contrib.contenttypes.models.ContentType.get_object_for_this_type` +and :meth:`~django.contrib.contenttypes.models.ContentType.model_class` +enable two extremely important use cases: + + 1. Using these methods, you can write high-level generic code that + performs queries on any installed model -- instead of importing and using + a single specific model class, you can pass an ``app_label`` and + ``model`` into a :class:`~django.contrib.contenttypes.models.ContentType` + lookup at runtime, and then work with the model class or retrieve objects + from it. + + 2. You can relate another model to + :class:`~django.contrib.contenttypes.models.ContentType` as a way of + tying instances of it to particular model classes, and use these methods + to get access to those model classes. + +Several of Django's bundled applications make use of the latter technique. +For example, +:class:`the permissions system <django.contrib.auth.models.Permission` in +Django's authentication framework uses a +:class:`~django.contrib.auth.models.Permission` model with a foreign +key to :class:`~django.contrib.contenttypes.models.ContentType`; this lets +:class:`~django.contrib.auth.models.Permission` represent concepts like +"can add blog entry" or "can delete news story". + +The ``ContentTypeManager`` +-------------------------- + +.. class:: models.ContentTypeManager + + :class:`~django.contrib.contenttypes.models.ContentType` also has a custom + manager, :class:`~django.contrib.contenttypes.models.ContentTypeManager`, + which adds the following methods: + + .. method:: models.ContentTypeManager.clear_cache() + + Clears an internal cache used by + :class:`~django.contrib.contenttypes.models.ContentType>` to keep track + of which models for which it has created + :class:`django.contrib.contenttypes.models.ContentType>` instances. You + probably won't ever need to call this method yourself; Django will call + it automatically when it's needed. + + .. method:: models.ContentTypeManager.get_for_model(model) + + Takes either a model class or an instance of a model, and returns the + :class:`~django.contrib.contenttypes.models.ContentType` instance + representing that model. + +The :meth:`~models.ContentTypeManager.get_for_model()` method is especially useful when you know you +need to work with a :class:`ContentType <django.contrib.contenttypes.models.ContentType>` but don't want to go to the +trouble of obtaining the model's metadata to perform a manual lookup:: + + >>> from django.contrib.auth.models import User + >>> user_type = ContentType.objects.get_for_model(User) + >>> user_type + <ContentType: user> + +.. _generic-relations: + +Generic relations +================= + +Adding a foreign key from one of your own models to +:class:`~django.contrib.contenttypes.models.ContentType` allows your model to +effectively tie itself to another model class, as in the example of the +:class:`~django.contrib.auth.models.Permission` model above. But it's possible +to go one step further and use +:class:`~django.contrib.contenttypes.models.ContentType` to enable truly +generic (sometimes called "polymorphic") relationships between models. + +A simple example is a tagging system, which might look like this:: + + from django.db import models + from django.contrib.contenttypes.models import ContentType + from django.contrib.contenttypes import generic + + class TaggedItem(models.Model): + tag = models.SlugField() + content_type = models.ForeignKey(ContentType) + object_id = models.PositiveIntegerField() + content_object = generic.GenericForeignKey('content_type', 'object_id') + + def __unicode__(self): + return self.tag + +A normal :class:`~django.db.models.fields.related.ForeignKey` can only "point +to" one other model, which means that if the ``TaggedItem`` model used a +:class:`~django.db.models.fields.related.ForeignKey` it would have to +choose one and only one model to store tags for. The contenttypes +application provides a special field type -- +:class:`django.contrib.contenttypes.generic.GenericForeignKey` -- which +works around this and allows the relationship to be with any +model. There are three parts to setting up a +:class:`~django.contrib.contenttypes.generic.GenericForeignKey`: + + 1. Give your model a :class:`~django.db.models.fields.related.ForeignKey` + to :class:`~django.contrib.contenttypes.models.ContentType`. + + 2. Give your model a field that can store a primary-key value from the + models you'll be relating to. (For most models, this means an + :class:`~django.db.models.fields.IntegerField` or + :class:`~django.db.models.fields.PositiveIntegerField`.) + + This field must be of the same type as the primary key of the models + that will be involved in the generic relation. For example, if you use + :class:`~django.db.models.fields.IntegerField`, you won't be able to + form a generic relation with a model that uses a + :class:`~django.db.models.fields.CharField` as a primary key. + + 3. Give your model a + :class:`~django.contrib.contenttypes.generic.GenericForeignKey`, and + pass it the names of the two fields described above. If these fields + are named "content_type" and "object_id", you can omit this -- those + are the default field names + :class:`~django.contrib.contenttypes.generic.GenericForeignKey` will + look for. + +This will enable an API similar to the one used for a normal +:class:`~django.db.models.fields.related.ForeignKey`; +each ``TaggedItem`` will have a ``content_object`` field that returns the +object it's related to, and you can also assign to that field or use it when +creating a ``TaggedItem``:: + + >>> from django.contrib.auth.models import User + >>> guido = User.objects.get(username='Guido') + >>> t = TaggedItem(content_object=guido, tag='bdfl') + >>> t.save() + >>> t.content_object + <User: Guido> + +Due to the way :class:`~django.contrib.contenttypes.generic.GenericForeignKey` +is implemented, you cannot use such fields directly with filters (``filter()`` +and ``exclude()``, for example) via the database API. They aren't normal field +objects. These examples will *not* work:: + + # This will fail + >>> TaggedItem.objects.filter(content_object=guido) + # This will also fail + >>> TaggedItem.objects.get(content_object=guido) + +Reverse generic relations +------------------------- + +If you know which models you'll be using most often, you can also add +a "reverse" generic relationship to enable an additional API. For example:: + + class Bookmark(models.Model): + url = models.URLField() + tags = generic.GenericRelation(TaggedItem) + +``Bookmark`` instances will each have a ``tags`` attribute, which can +be used to retrieve their associated ``TaggedItems``:: + + >>> b = Bookmark(url='http://www.djangoproject.com/') + >>> b.save() + >>> t1 = TaggedItem(content_object=b, tag='django') + >>> t1.save() + >>> t2 = TaggedItem(content_object=b, tag='python') + >>> t2.save() + >>> b.tags.all() + [<TaggedItem: django>, <TaggedItem: python>] + +If you don't add the reverse relationship, you can do the lookup manually:: + + >>> b = Bookmark.objects.get(url='http://www.djangoproject.com/) + >>> bookmark_type = ContentType.objects.get_for_model(b) + >>> TaggedItem.objects.filter(content_type__pk=bookmark_type.id, + ... object_id=b.id) + [<TaggedItem: django>, <TaggedItem: python>] + +Note that if you delete an object that has a +:class:`~django.contrib.contenttypes.generic.GenericRelation`, any objects +which have a :class:`~django.contrib.contenttypes.generic.GenericForeignKey` +pointing at it will be deleted as well. In the example above, this means that +if a ``Bookmark`` object were deleted, any ``TaggedItem`` objects pointing at +it would be deleted at the same time. + +Generic relations in forms and admin +------------------------------------ + +:mod:`django.contrib.contenttypes.generic` provides both a +:class:`~django.contrib.contenttypes.generic.GenericInlineFormSet` +and :class:`~django.contrib.contenttypes.generic.GenericInlineModelAdmin`. +This enables the use of generic relations in forms and the admin. See the +:ref:`model formset <topics-forms-modelforms>` and +:ref:`admin <ref-contrib-admin>` documentation for more information. + +.. class:: generic.GenericInlineModelAdmin + + The :class:`~django.contrib.contenttypes.generic.GenericInlineModelAdmin` + class inherits all properties from an + :class:`~django.contrib.admin.options.InlineModelAdmin` class. However, + it adds a couple of its own for working with the generic relation: + + .. attribute:: generic.GenericInlineModelAdmin.ct_field + + The name of the + :class:`~django.contrib.contenttypes.models.ContentType` foreign key + field on the model. Defaults to ``content_type``. + + .. attribute:: generic.GenericInlineModelAdmin.ct_fk_field + + The name of the integer field that represents the ID of the related + object. Defaults to ``object_id``. diff --git a/docs/csrf.txt b/docs/ref/contrib/csrf.txt similarity index 90% rename from docs/csrf.txt rename to docs/ref/contrib/csrf.txt index ba04fa67cd..cf0fe8a3bf 100644 --- a/docs/csrf.txt +++ b/docs/ref/contrib/csrf.txt @@ -1,7 +1,12 @@ +.. _ref-contrib-csrf: + ===================================== Cross Site Request Forgery protection ===================================== +.. module:: django.contrib.csrf + :synopsis: Protects against Cross Site Request Forgeries + The CsrfMiddleware class provides easy-to-use protection against `Cross Site Request Forgeries`_. This type of attack occurs when a malicious Web site creates a link or form button that is intended to perform some action @@ -12,13 +17,13 @@ The first defense against CSRF attacks is to ensure that GET requests are side-effect free. POST requests can then be protected by adding this middleware into your list of installed middleware. -.. _Cross Site Request Forgeries: http://www.squarefree.com/securitytips/web-developers.html#CSRF +.. _Cross Site Request Forgeries: http://www.squarefree.com/securitytips/web-developers.html#CSRF How to use it ============= Add the middleware ``'django.contrib.csrf.middleware.CsrfMiddleware'`` to -your list of middleware classes, ``MIDDLEWARE_CLASSES``. It needs to process +your list of middleware classes, :setting:`MIDDLEWARE_CLASSES`. It needs to process the response after the SessionMiddleware, so must come before it in the list. It also must process the response before things like compression happen to the response, so it must come after GZipMiddleware in the list. @@ -68,4 +73,4 @@ it sends fragments of HTML in JavaScript document.write statements) you might bypass the filter that adds the hidden field to the form, in which case form submission will always fail. It may still be possible to use the middleware, provided you can find some way to get the -CSRF token and ensure that is included when your form is submitted. +CSRF token and ensure that is included when your form is submitted. \ No newline at end of file diff --git a/docs/databrowse.txt b/docs/ref/contrib/databrowse.txt similarity index 58% rename from docs/databrowse.txt rename to docs/ref/contrib/databrowse.txt index 72e1c71720..c4da2fe929 100644 --- a/docs/databrowse.txt +++ b/docs/ref/contrib/databrowse.txt @@ -1,7 +1,12 @@ +.. _ref-contrib-databrowse: + ========== Databrowse ========== +.. module:: django.contrib.databrowse + :synopsis: Databrowse is a Django application that lets you browse your data. + Databrowse is a Django application that lets you browse your data. As the Django admin dynamically creates an admin interface by introspecting @@ -23,14 +28,15 @@ How to use Databrowse 1. Point Django at the default Databrowse templates. There are two ways to do this: - * Add ``'django.contrib.databrowse'`` to your ``INSTALLED_APPS`` - setting. This will work if your ``TEMPLATE_LOADERS`` setting includes - the ``app_directories`` template loader (which is the case by - default). See the `template loader docs`_ for more. + * Add ``'django.contrib.databrowse'`` to your :setting:`INSTALLED_APPS` + setting. This will work if your :setting:`TEMPLATE_LOADERS` setting + includes the ``app_directories`` template loader (which is the case by + default). See the :ref:`template loader docs <template-loaders>` for + more. * Otherwise, determine the full filesystem path to the - ``django/contrib/databrowse/templates`` directory, and add that - directory to your ``TEMPLATE_DIRS`` setting. + `:file:`django/contrib/databrowse/templates` directory, and add that + directory to your :setting:`TEMPLATE_DIRS` setting. 2. Register a number of models with the Databrowse site:: @@ -42,10 +48,11 @@ How to use Databrowse Note that you should register the model *classes*, not instances. - It doesn't matter where you put this, as long as it gets executed at - some point. A good place for it is in your URLconf file (``urls.py``). + It doesn't matter where you put this, as long as it gets executed at some + point. A good place for it is in your :ref:`URLconf file + <topics-http-urls>` (``urls.py``). - 3. Change your URLconf to import the ``databrowse`` module:: + 3. Change your URLconf to import the :mod:`~django.contrib.databrowse` module:: from django.contrib import databrowse @@ -66,21 +73,20 @@ code. Simply add the following import to your URLconf:: from django.contrib.auth.decorators import login_required -Then modify the URLconf so that the ``databrowse.site.root`` view is decorated -with ``login_required``:: +Then modify the :ref:`URLconf <topics-http-urls>` so that the +:func:`databrowse.site.root` view is decorated with +:func:`django.contrib.auth.decorators.login_required`:: (r'^databrowse/(.*)', login_required(databrowse.site.root)), -If you haven't already added support for user logins to your URLconf, as -described in the `user authentication docs`_, then you will need to do so -now with the following mapping:: +If you haven't already added support for user logins to your :ref:`URLconf +<topics-http-urls>`, as described in the :ref:`user authentication docs +<ref-contrib-auth>`, then you will need to do so now with the following +mapping:: (r'^accounts/login/$', 'django.contrib.auth.views.login'), The final step is to create the login form required by -``django.contrib.auth.views.login``. The `user authentication docs`_ -provide full details and a sample template that can be used for this -purpose. - -.. _template loader docs: ../templates_python/#loader-types -.. _user authentication docs: ../authentication/ +:func:`django.contrib.auth.views.login`. The +:ref:`user authentication docs <ref-contrib-auth>` provide full details and a +sample template that can be used for this purpose. diff --git a/docs/flatpages.txt b/docs/ref/contrib/flatpages.txt similarity index 51% rename from docs/flatpages.txt rename to docs/ref/contrib/flatpages.txt index f1a354c653..828a4fc0f2 100644 --- a/docs/flatpages.txt +++ b/docs/ref/contrib/flatpages.txt @@ -1,7 +1,12 @@ +.. _ref-contrib-flatpages: + ================= The flatpages app ================= +.. module:: django.contrib.flatpages + :synopsis: A framework for managing simple ?flat? HTML content in a database. + Django comes with an optional "flatpages" application. It lets you store simple "flat" HTML content in a database and handles the management for you via Django's admin interface and a Python API. @@ -21,6 +26,7 @@ content in a custom template. Here are some examples of flatpages on Django-powered sites: + * http://www.chicagocrime.org/about/ * http://www.everyblock.com/about/ * http://www.lawrence.com/about/contact/ @@ -29,17 +35,18 @@ Installation To install the flatpages app, follow these steps: - 1. Install the `sites framework`_ by adding ``'django.contrib.sites'`` to - your INSTALLED_APPS_ setting, if it's not already in there. - 2. Add ``'django.contrib.flatpages'`` to your INSTALLED_APPS_ setting. + 1. Install the :mod:`sites framework <django.contrib.sites>` by adding + ``'django.contrib.sites'`` to your :setting:`INSTALLED_APPS` setting, + if it's not already in there. + + 2. Add ``'django.contrib.flatpages'`` to your :setting:`INSTALLED_APPS` + setting. + 3. Add ``'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware'`` - to your MIDDLEWARE_CLASSES_ setting. - 4. Run the command ``manage.py syncdb``. - -.. _sites framework: ../sites/ -.. _INSTALLED_APPS: ../settings/#installed-apps -.. _MIDDLEWARE_CLASSES: ../settings/#middleware-classes - + to your :setting:`MIDDLEWARE_CLASSES` setting. + + 4. Run the command :djadmin:`manage.py syncdb <syncdb>`. + How it works ============ @@ -48,44 +55,47 @@ and ``django_flatpage_sites``. ``django_flatpage`` is a simple lookup table that simply maps a URL to a title and bunch of text content. ``django_flatpage_sites`` associates a flatpage with a site. -The ``FlatpageFallbackMiddleware`` does all of the work. Each time any Django -application raises a 404 error, this middleware checks the flatpages database -for the requested URL as a last resort. Specifically, it checks for a flatpage -with the given URL with a site ID that corresponds to the SITE_ID_ setting. +The :class:`~django.contrib.flatpages.middleware.FlatpageFallbackMiddleware` +does all of the work. Each time any Django application raises a 404 error, this +middleware checks the flatpages database for the requested URL as a last resort. +Specifically, it checks for a flatpage with the given URL with a site ID that +corresponds to the :setting:`SITE_ID` setting. If it finds a match, it follows this algorithm: * If the flatpage has a custom template, it loads that template. Otherwise, - it loads the template ``flatpages/default.html``. - * It passes that template a single context variable, ``flatpage``, which is - the flatpage object. It uses RequestContext_ in rendering the template. + it loads the template :file:`flatpages/default.html`. + + * It passes that template a single context variable, :data:`flatpage`, which + is the flatpage object. It uses + :class:`~django.template.context.RequestContext` in rendering the + template. If it doesn't find a match, the request continues to be processed as usual. The middleware only gets activated for 404s -- not for 500s or responses of any other status code. -Note that the order of ``MIDDLEWARE_CLASSES`` matters. Generally, you can put -``FlatpageFallbackMiddleware`` at the end of the list, because it's a last -resort. +Note that the order of :setting:`MIDDLEWARE_CLASSES` matters. Generally, you can +put :class:`~django.contrib.flatpages.middleware.FlatpageFallbackMiddleware` at +the end of the list, because it's a last resort. -For more on middleware, read the `middleware docs`_. +For more on middleware, read the :ref:`middleware docs +<topics-http-middleware>`. .. admonition:: Ensure that your 404 template works - Note that the ``FlatpageFallbackMiddleware`` only steps in once - another view has successfully produced a 404 response. If another - view or middleware class attempts to produce a 404 but ends up + Note that the + :class:`~django.contrib.flatpages.middleware.FlatpageFallbackMiddleware` + only steps in once another view has successfully produced a 404 response. + If another view or middleware class attempts to produce a 404 but ends up raising an exception instead (such as a ``TemplateDoesNotExist`` exception if your site does not have an appropriate template to use for HTTP 404 responses), the response will become an HTTP 500 - ("Internal Server Error") and the ``FlatpageFallbackMiddleware`` + ("Internal Server Error") and the + :class:`~django.contrib.flatpages.middleware.FlatpageFallbackMiddleware` will not attempt to serve a flat page. -.. _SITE_ID: ../settings/#site-id -.. _RequestContext: ../templates_python/#subclassing-context-djangocontext -.. _middleware docs: ../middleware/ - How to add, change and delete flatpages ======================================= @@ -99,28 +109,32 @@ other object in the system. Via the Python API ------------------ -Flatpages are represented by a standard `Django model`_, which lives in -`django/contrib/flatpages/models.py`_. You can access flatpage objects via the -`Django database API`_. +.. class:: models.FlatPage + + Flatpages are represented by a standard + :ref:`Django model <topics-db-models>`, + which lives in `django/contrib/flatpages/models.py`_. You can access + flatpage objects via the :ref:`Django database API <topics-db-queries>`. -.. _Django model: ../model-api/ .. _django/contrib/flatpages/models.py: http://code.djangoproject.com/browser/django/trunk/django/contrib/flatpages/models.py -.. _Django database API: ../db-api/ Flatpage templates ================== -By default, flatpages are rendered via the template ``flatpages/default.html``, -but you can override that for a particular flatpage. +By default, flatpages are rendered via the template +:file:`flatpages/default.html`, but you can override that for a particular +flatpage. -Creating the ``flatpages/default.html`` template is your responsibility; in -your template directory, just create a ``flatpages`` directory containing a -file ``default.html``. +Creating the :file:`flatpages/default.html` template is your responsibility; +in your template directory, just create a :file:`flatpages` directory +containing a file :file:`default.html`. -Flatpage templates are passed a single context variable, ``flatpage``, which is -the flatpage object. +Flatpage templates are passed a single context variable, :data:`flatpage`, +which is the flatpage object. -Here's a sample ``flatpages/default.html`` template:: +Here's a sample :file:`flatpages/default.html` template: + +.. code-block:: html+django <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> @@ -135,7 +149,5 @@ Here's a sample ``flatpages/default.html`` template:: Since you're already entering raw HTML into the admin page for a flatpage, both ``flatpage.title`` and ``flatpage.content`` are marked as **not** -requiring `automatic HTML escaping`_ in the template. - -.. _automatic HTML escaping: ../templates/#automatic-html-escaping - +requiring :ref:`automatic HTML escaping <automatic-html-escaping>` in the +template. diff --git a/docs/ref/contrib/formtools/form-preview.txt b/docs/ref/contrib/formtools/form-preview.txt new file mode 100644 index 0000000000..fa3fe16e7e --- /dev/null +++ b/docs/ref/contrib/formtools/form-preview.txt @@ -0,0 +1,110 @@ +.. _ref-contrib-formtools-form-preview: + +============ +Form preview +============ + +.. module:: django.contrib.formtools + :synopsis: Displays an HTML form, forces a preview, then does something + with the submission. + +Django comes with an optional "form preview" application that helps automate +the following workflow: + +"Display an HTML form, force a preview, then do something with the submission." + +To force a preview of a form submission, all you have to do is write a short +Python class. + +Overview +========= + +Given a :class:`django.forms.Form` subclass that you define, this +application takes care of the following workflow: + + 1. Displays the form as HTML on a Web page. + 2. Validates the form data when it's submitted via POST. + a. If it's valid, displays a preview page. + b. If it's not valid, redisplays the form with error messages. + 3. When the "confirmation" form is submitted from the preview page, calls + a hook that you define -- a + :meth:`~django.contrib.formtools.FormPreview.done()` method that gets + passed the valid data. + +The framework enforces the required preview by passing a shared-secret hash to +the preview page via hidden form fields. If somebody tweaks the form parameters +on the preview page, the form submission will fail the hash-comparison test. + +How to use ``FormPreview`` +========================== + + 1. Point Django at the default FormPreview templates. There are two ways to + do this: + + * Add ``'django.contrib.formtools'`` to your + :setting:`INSTALLED_APPS` setting. This will work if your + :setting:`TEMPLATE_LOADERS` setting includes the + ``app_directories`` template loader (which is the case by + default). See the :ref:`template loader docs <template-loaders>` + for more. + + * Otherwise, determine the full filesystem path to the + :file:`django/contrib/formtools/templates` directory, and add that + directory to your :setting:`TEMPLATE_DIRS` setting. + + 2. Create a :class:`~django.contrib.formtools.FormPreview` subclass that + overrides the :meth:`~django.contrib.formtools.FormPreview.done()` + method:: + + from django.contrib.formtools.preview import FormPreview + from myapp.models import SomeModel + + class SomeModelFormPreview(FormPreview): + + def done(self, request, cleaned_data): + # Do something with the cleaned_data, then redirect + # to a "success" page. + return HttpResponseRedirect('/form/success') + + This method takes an :class:`~django.http.HttpRequest` object and a + dictionary of the form data after it has been validated and cleaned. + It should return an :class:`~django.http.HttpResponseRedirect` that + is the end result of the form being submitted. + + 3. Change your URLconf to point to an instance of your + :class:`~django.contrib.formtools.FormPreview` subclass:: + + from myapp.preview import SomeModelFormPreview + from myapp.models import SomeModel + from django import forms + + ...and add the following line to the appropriate model in your URLconf:: + + (r'^post/$', SomeModelFormPreview(SomeModelForm)), + + where ``SomeModelForm`` is a Form or ModelForm class for the model. + + 4. Run the Django server and visit :file:`/post/` in your browser. + +``FormPreview`` classes +======================= + +.. class:: FormPreview + +A :class:`~django.contrib.formtools.FormPreview` class is a simple Python class +that represents the preview workflow. +:class:`~django.contrib.formtools.FormPreview` classes must subclass +``django.contrib.formtools.preview.FormPreview`` and override the +:meth:`~django.contrib.formtools.FormPreview.done()` method. They can live +anywhere in your codebase. + +``FormPreview`` templates +========================= + +By default, the form is rendered via the template :file:`formtools/form.html`, +and the preview page is rendered via the template :file:`formtools.preview.html`. +These values can be overridden for a particular form preview by setting +:attr:`~django.contrib.formtools.FormPreview.preview_template` and +:attr:`~django.contrib.formtools.FormPreview.form_template` attributes on the +FormPreview subclass. See :file:`django/contrib/formtools/templates` for the +default templates. diff --git a/docs/ref/contrib/formtools/form-wizard.txt b/docs/ref/contrib/formtools/form-wizard.txt new file mode 100644 index 0000000000..fe8d478d40 --- /dev/null +++ b/docs/ref/contrib/formtools/form-wizard.txt @@ -0,0 +1,316 @@ +.. _ref-contrib-formtools-form-wizard: + +=========== +Form wizard +=========== + +.. module:: django.contrib.formtools.wizard + :synopsis: Splits forms across multiple Web pages. + +**New in Django development version.** + +Django comes with an optional "form wizard" application that splits +:ref:`forms <topics-forms-index>` across multiple Web pages. It maintains +state in hashed HTML :samp:`<input type="hidden">` fields, and the data isn't +processed server-side until the final form is submitted. + +You might want to use this if you have a lengthy form that would be too +unwieldy for display on a single page. The first page might ask the user for +core information, the second page might ask for less important information, +etc. + +The term "wizard," in this context, is `explained on Wikipedia`_. + +.. _explained on Wikipedia: http://en.wikipedia.org/wiki/Wizard_%28software%29 +.. _forms: ../forms/ + +How it works +============ + +Here's the basic workflow for how a user would use a wizard: + + 1. The user visits the first page of the wizard, fills in the form and + submits it. + 2. The server validates the data. If it's invalid, the form is displayed + again, with error messages. If it's valid, the server calculates a + secure hash of the data and presents the user with the next form, + saving the validated data and hash in :samp:`<input type="hidden">` + fields. + 3. Step 1 and 2 repeat, for every subsequent form in the wizard. + 4. Once the user has submitted all the forms and all the data has been + validated, the wizard processes the data -- saving it to the database, + sending an e-mail, or whatever the application needs to do. + +Usage +===== + +This application handles as much machinery for you as possible. Generally, you +just have to do these things: + + 1. Define a number of :mod:`django.forms` + :class:`~django.forms.forms.Form` classes -- one per wizard page. + + 2. Create a :class:`~django.contrib.formtools.wizard.FormWizard` class + that specifies what to do once all of your forms have been submitted + and validated. This also lets you override some of the wizard's behavior. + + 3. Create some templates that render the forms. You can define a single, + generic template to handle every one of the forms, or you can define a + specific template for each form. + + 4. Point your URLconf at your + :class:`~django.contrib.formtools.wizard.FormWizard` class. + +Defining ``Form`` classes +========================= + +The first step in creating a form wizard is to create the :class:`~django.forms.forms.Form` classes. +These should be standard :mod:`django.forms` +:class:`~django.forms.forms.Form` classes, covered in the +:ref:`forms documentation <topics-forms-index>`. + +These classes can live anywhere in your codebase, but convention is to put them +in a file called :file:`forms.py` in your application. + +For example, let's write a "contact form" wizard, where the first page's form +collects the sender's e-mail address and subject, and the second page collects +the message itself. Here's what the :file:`forms.py` might look like:: + + from django import forms + + class ContactForm1(forms.Form): + subject = forms.CharField(max_length=100) + sender = forms.EmailField() + + class ContactForm2(forms.Form): + message = forms.CharField(widget=forms.Textarea) + +**Important limitation:** Because the wizard uses HTML hidden fields to store +data between pages, you may not include a :class:`~django.forms.fields.FileField` +in any form except the last one. + +Creating a ``FormWizard`` class +=============================== + +The next step is to create a :class:`~django.contrib.formtools.wizard.FormWizard` +class, which should be a subclass of ``django.contrib.formtools.wizard.FormWizard``. + +As your :class:`~django.forms.forms.Form` classes, this +:class:`~django.contrib.formtools.wizard.FormWizard` class can live anywhere +in your codebase, but convention is to put it in :file:`forms.py`. + +The only requirement on this subclass is that it implement a +:meth:`~django.contrib.formtools.wizard.FormWizard.done()` method, +which specifies what should happen when the data for *every* form is submitted +and validated. This method is passed two arguments: + + * ``request`` -- an :class:`~django.http.HttpRequest` object + * ``form_list`` -- a list of :mod:`django.forms` + :class:`~django.forms.forms.Form` classes + +In this simplistic example, rather than perform any database operation, the +method simply renders a template of the validated data:: + + from django.shortcuts import render_to_response + from django.contrib.formtools.wizard import FormWizard + + class ContactWizard(FormWizard): + def done(self, request, form_list): + return render_to_response('done.html', { + 'form_data': [form.cleaned_data for form in form_list], + }) + +Note that this method will be called via ``POST``, so it really ought to be a +good Web citizen and redirect after processing the data. Here's another +example:: + + from django.http import HttpResponseRedirect + from django.contrib.formtools.wizard import FormWizard + + class ContactWizard(FormWizard): + def done(self, request, form_list): + do_something_with_the_form_data(form_list) + return HttpResponseRedirect('/page-to-redirect-to-when-done/') + +See the section `Advanced FormWizard methods`_ below to learn about more +:class:`~django.contrib.formtools.wizard.FormWizard` hooks. + +Creating templates for the forms +================================ + +Next, you'll need to create a template that renders the wizard's forms. By +default, every form uses a template called :file:`forms/wizard.html`. (You can +change this template name by overriding +:meth:`~django.contrib.formtools.wizard..get_template()`, which is documented +below. This hook also allows you to use a different template for each form.) + +This template expects the following context: + + * ``step_field`` -- The name of the hidden field containing the step. + * ``step0`` -- The current step (zero-based). + * ``step`` -- The current step (one-based). + * ``step_count`` -- The total number of steps. + * ``form`` -- The :class:`~django.forms.forms.Form` instance for the + current step (either empty or with errors). + * ``previous_fields`` -- A string representing every previous data field, + plus hashes for completed forms, all in the form of hidden fields. Note + that you'll need to run this through the + :meth:`~django.template.defaultfilters.safe` template filter, to prevent + auto-escaping, because it's raw HTML. + +It will also be passed any objects in :data:`extra_context`, which is a +dictionary you can specify that contains extra values to add to the context. +You can specify it in two ways: + + * Set the :attr:`~django.contrib.formtools.wizard.FormWizard.extra_context` + attribute on your :class:`~django.contrib.formtools.wizard.FormWizard` + subclass to a dictionary. + + * Pass :attr:`~django.contrib.formtools.wizard.FormWizard.extra_context` + as extra parameters in the URLconf. + +Here's a full example template:: + + {% extends "base.html" %} + + {% block content %} + <p>Step {{ step }} of {{ step_count }}</p> + <form action="." method="post"> + <table> + {{ form }} + </table> + <input type="hidden" name="{{ step_field }}" value="{{ step0 }}" /> + {{ previous_fields|safe }} + <input type="submit"> + </form> + {% endblock %} + +Note that ``previous_fields``, ``step_field`` and ``step0`` are all required +for the wizard to work properly. + +Hooking the wizard into a URLconf +================================= + +Finally, give your new :class:`~django.contrib.formtools.wizard.FormWizard` +object a URL in ``urls.py``. The wizard takes a list of your form objects as +arguments:: + + from django.conf.urls.defaults import * + from mysite.testapp.forms import ContactForm1, ContactForm2, ContactWizard + + urlpatterns = patterns('', + (r'^contact/$', ContactWizard([ContactForm1, ContactForm2])), + ) + +Advanced FormWizard methods +=========================== + +.. class:: FormWizard + + Aside from the :meth:`~django.contrib.formtools.wizard.FormWizard.done()` + method, :class:`~django.contrib.formtools.wizard.FormWizard` offers a few + advanced method hooks that let you customize how your wizard works. + + Some of these methods take an argument ``step``, which is a zero-based counter + representing the current step of the wizard. (E.g., the first form is ``0`` and + the second form is ``1``.) + +.. method:: FormWizard.prefix_for_step + + Given the step, returns a :class:`~django.forms.forms.Form` prefix to + use. By default, this simply uses the step itself. For more, see the + :ref:`form prefix documentation <form-prefix>`. + + Default implementation:: + + def prefix_for_step(self, step): + return str(step) + +.. method:: FormWizard.render_hash_failure + + Renders a template if the hash check fails. It's rare that you'd need to + override this. + + Default implementation:: + + def render_hash_failure(self, request, step): + return self.render(self.get_form(step), request, step, + context={'wizard_error': 'We apologize, but your form has expired. Please continue filling out the form from this page.'}) + +.. method:: FormWizard.security_hash + + Calculates the security hash for the given request object and :class:`~django.forms.forms.Form` instance. + + By default, this uses an MD5 hash of the form data and your + :setting:`SECRET_KEY` setting. It's rare that somebody would need to override + this. + + Example:: + + def security_hash(self, request, form): + return my_hash_function(request, form) + +.. method:: FormWizard.parse_params + + A hook for saving state from the request object and ``args`` / ``kwargs`` that + were captured from the URL by your URLconf. + + By default, this does nothing. + + Example:: + + def parse_params(self, request, *args, **kwargs): + self.my_state = args[0] + +.. method:: FormWizard.get_template + + Returns the name of the template that should be used for the given step. + + By default, this returns :file:`'forms/wizard.html'`, regardless of step. + + Example:: + + def get_template(self, step): + return 'myapp/wizard_%s.html' % step + + If :meth:`~FormWizard.get_template` returns a list of strings, then the wizard will use the + template system's :func:`~django.template.loader.select_template()` + function, + :ref:`explained in the template docs <ref-templates-api-the-python-api>`. + This means the system will use the first template that exists on the + filesystem. For example:: + + def get_template(self, step): + return ['myapp/wizard_%s.html' % step, 'myapp/wizard.html'] + + .. _explained in the template docs: ../templates_python/#the-python-api + +.. method:: FormWizard.render_template + + Renders the template for the given step, returning an + :class:`~django.http.HttpResponseRedirect` object. + + Override this method if you want to add a custom context, return a different + MIME type, etc. If you only need to override the template name, use + :meth:`~FormWizard.get_template` instead. + + The template will be rendered with the context documented in the + "Creating templates for the forms" section above. + +.. method:: FormWizard.process_step + + Hook for modifying the wizard's internal state, given a fully validated + :class:`~django.forms.forms.Form` object. The Form is guaranteed to + have clean, valid data. + + This method should *not* modify any of that data. Rather, it might want to set + ``self.extra_context`` or dynamically alter ``self.form_list``, based on + previously submitted forms. + + Note that this method is called every time a page is rendered for *all* + submitted steps. + + The function signature:: + + def process_step(self, request, form, step): + # ... diff --git a/docs/ref/contrib/formtools/index.txt b/docs/ref/contrib/formtools/index.txt new file mode 100644 index 0000000000..92010a25db --- /dev/null +++ b/docs/ref/contrib/formtools/index.txt @@ -0,0 +1,12 @@ +.. _ref-contrib-formtools-index: + +django.contrib.formtools +======================== + +A set of high-level abstractions for Django forms (:mod:`django.forms`). + +.. toctree:: + :maxdepth: 1 + + form-preview + form-wizard diff --git a/docs/ref/contrib/humanize.txt b/docs/ref/contrib/humanize.txt new file mode 100644 index 0000000000..4a544f037c --- /dev/null +++ b/docs/ref/contrib/humanize.txt @@ -0,0 +1,91 @@ +.. _ref-contrib-humanize: + +======================== +django.contrib.humanize +======================== + +.. module:: django.contrib.humanize + :synopsis: A set of Django template filters useful for adding a "human + touch" to data. + +A set of Django template filters useful for adding a "human touch" to data. + +To activate these filters, add ``'django.contrib.humanize'`` to your +:setting:`INSTALLED_APPS` setting. Once you've done that, use +``{% load humanize %}`` in a template, and you'll have access to these filters: + +apnumber +-------- + +For numbers 1-9, returns the number spelled out. Otherwise, returns the +number. This follows Associated Press style. + +Examples: + + * ``1`` becomes ``'one'``. + * ``2`` becomes ``'two'``. + * ``10`` becomes ``10``. + +You can pass in either an integer or a string representation of an integer. + +intcomma +-------- + +Converts an integer to a string containing commas every three digits. + +Examples: + + * ``4500`` becomes ``'4,500'``. + * ``45000`` becomes ``'45,000'``. + * ``450000`` becomes ``'450,000'``. + * ``4500000`` becomes ``'4,500,000'``. + +You can pass in either an integer or a string representation of an integer. + +intword +------- + +Converts a large integer to a friendly text representation. Works best for +numbers over 1 million. + +Examples: + + * ``1000000`` becomes ``'1.0 million'``. + * ``1200000`` becomes ``'1.2 million'``. + * ``1200000000`` becomes ``'1.2 billion'``. + +Values up to 1000000000000000 (one quadrillion) are supported. + +You can pass in either an integer or a string representation of an integer. + +ordinal +------- + +Converts an integer to its ordinal as a string. + +Examples: + + * ``1`` becomes ``'1st'``. + * ``2`` becomes ``'2nd'``. + * ``3`` becomes ``'3rd'``. + +You can pass in either an integer or a string representation of an integer. + +naturalday +---------- + +**New in Django development version** + +For dates that are the current day or within one day, return "today", +"tomorrow" or "yesterday", as appropriate. Otherwise, format the date using +the passed in format string. + +**Argument:** Date formatting string as described in the :ttag:`now` tag. + +Examples (when 'today' is 17 Feb 2007): + + * ``16 Feb 2007`` becomes ``yesterday``. + * ``17 Feb 2007`` becomes ``today``. + * ``18 Feb 2007`` becomes ``tomorrow``. + * Any other day is formatted according to given argument or the + :setting:`DATE_FORMAT` setting if no argument is given. diff --git a/docs/add_ons.txt b/docs/ref/contrib/index.txt similarity index 53% rename from docs/add_ons.txt rename to docs/ref/contrib/index.txt index de1a9136b5..e6c693d905 100644 --- a/docs/add_ons.txt +++ b/docs/ref/contrib/index.txt @@ -1,3 +1,5 @@ +.. _ref-contrib-index: + ============================ The "django.contrib" add-ons ============================ @@ -19,14 +21,30 @@ those packages have. .. _"batteries included" philosophy: http://docs.python.org/tut/node12.html#batteries-included +.. toctree:: + :maxdepth: 1 + + admin + auth + contenttypes + csrf + databrowse + flatpages + formtools/index + humanize + localflavor + redirects + sitemaps + sites + syndication + webdesign + admin ===== The automatic Django administrative interface. For more information, see -`Tutorial 2`_ and the `admin documentation`_. - -.. _Tutorial 2: ../tutorial02/ -.. _admin documentation: ../admin/ +:ref:`Tutorial 2 <intro-tutorial02>` and the +:ref:`admin documentation <ref-contrib-admin>`. Requires the auth_ and contenttypes_ contrib packages to be installed. @@ -35,9 +53,7 @@ auth Django's authentication framework. -See the `authentication documentation`_. - -.. _authentication documentation: ../authentication/ +See :ref:`topics-auth`. comments ======== @@ -50,27 +66,21 @@ contenttypes A light framework for hooking into "types" of content, where each installed Django model is a separate content type. -See the `contenttypes documentation`_. - -.. _contenttypes documentation: ../contenttypes/ +See the :ref:`contenttypes documentation <ref-contrib-contenttypes>`. csrf ==== A middleware for preventing Cross Site Request Forgeries -See the `csrf documentation`_. - -.. _csrf documentation: ../csrf/ +See the :ref:`csrf documentation <ref-contrib-csrf>`. flatpages ========= A framework for managing simple "flat" HTML content in a database. -See the `flatpages documentation`_. - -.. _flatpages documentation: ../flatpages/ +See the :ref:`flatpages documentation <ref-contrib-flatpages>`. Requires the sites_ contrib package to be installed as well. @@ -86,97 +96,21 @@ An abstraction of the following workflow: "Display an HTML form, force a preview, then do something with the submission." -See the `form preview documentation`_. +See the :ref:`form preview documentation <ref-contrib-formtools-form-preview>`. -.. _form preview documentation: ../form_preview/ +django.contrib.formtools.wizard +-------------------------------- + +Splits forms across multiple Web pages. + +See the :ref:`form wizard documentation <ref-contrib-formtools-form-wizard>`. humanize ======== A set of Django template filters useful for adding a "human touch" to data. -To activate these filters, add ``'django.contrib.humanize'`` to your -``INSTALLED_APPS`` setting. Once you've done that, use ``{% load humanize %}`` -in a template, and you'll have access to these filters: -apnumber --------- - -For numbers 1-9, returns the number spelled out. Otherwise, returns the -number. This follows Associated Press style. - -Examples: - - * ``1`` becomes ``'one'``. - * ``2`` becomes ``'two'``. - * ``10`` becomes ``10``. - -You can pass in either an integer or a string representation of an integer. - -intcomma --------- - -Converts an integer to a string containing commas every three digits. - -Examples: - - * ``4500`` becomes ``'4,500'``. - * ``45000`` becomes ``'45,000'``. - * ``450000`` becomes ``'450,000'``. - * ``4500000`` becomes ``'4,500,000'``. - -You can pass in either an integer or a string representation of an integer. - -intword -------- - -Converts a large integer to a friendly text representation. Works best for -numbers over 1 million. - -Examples: - - * ``1000000`` becomes ``'1.0 million'``. - * ``1200000`` becomes ``'1.2 million'``. - * ``1200000000`` becomes ``'1.2 billion'``. - -Values up to 1000000000000000 (one quadrillion) are supported. - -You can pass in either an integer or a string representation of an integer. - -ordinal -------- - -Converts an integer to its ordinal as a string. - -Examples: - - * ``1`` becomes ``'1st'``. - * ``2`` becomes ``'2nd'``. - * ``3`` becomes ``'3rd'``. - -You can pass in either an integer or a string representation of an integer. - -naturalday ----------- - -**New in Django development version** - -For dates that are the current day or within one day, return "today", -"tomorrow" or "yesterday", as appropriate. Otherwise, format the date using -the passed in format string. - -**Argument:** Date formatting string as described in default tag now_. - -.. _now: ../templates/#now - -Examples (when 'today' is 17 Feb 2007): - - * ``16 Feb 2007`` becomes ``yesterday``. - * ``17 Feb 2007`` becomes ``today``. - * ``18 Feb 2007`` becomes ``tomorrow``. - * Any other day is formatted according to given argument or the - `DATE_FORMAT`_ setting if no argument is given. - -.. _DATE_FORMAT: ../settings/#date_format +See the :ref:`humanize documentation <ref-contrib-humanize>`. localflavor =========== @@ -185,9 +119,9 @@ A collection of various Django snippets that are useful only for a particular country or culture. For example, ``django.contrib.localflavor.us.forms`` contains a ``USZipCodeField`` that you can use to validate U.S. zip codes. -See the `localflavor documentation`_. +See the :ref:`localflavor documentation <ref-contrib-localflavor>`. -.. _localflavor documentation: ../localflavor/ +.. _ref-contrib-markup: markup ====== @@ -203,7 +137,7 @@ string representing the marked-up text. For example, the ``textile`` filter converts text that is marked-up in Textile format to HTML. To activate these filters, add ``'django.contrib.markup'`` to your -``INSTALLED_APPS`` setting. Once you've done that, use ``{% load markup %}`` in +:setting:`INSTALLED_APPS` setting. Once you've done that, use ``{% load markup %}`` in a template, and you'll have access to these filters. For more documentation, read the source code in django/contrib/markup/templatetags/markup.py. @@ -216,18 +150,14 @@ redirects A framework for managing redirects. -See the `redirects documentation`_. - -.. _redirects documentation: ../redirects/ +See the :ref:`redirects documentation <ref-contrib-redirects>`. sessions ======== A framework for storing data in anonymous sessions. -See the `sessions documentation`_. - -.. _sessions documentation: ../sessions/ +See the :ref:`sessions documentation <topics-http-sessions>`. sites ===== @@ -236,27 +166,21 @@ A light framework that lets you operate multiple Web sites off of the same database and Django installation. It gives you hooks for associating objects to one or more sites. -See the `sites documentation`_. - -.. _sites documentation: ../sites/ +See the :ref:`sites documentation <ref-contrib-sites>`. sitemaps ======== A framework for generating Google sitemap XML files. -See the `sitemaps documentation`_. - -.. _sitemaps documentation: ../sitemaps/ +See the :ref:`sitemaps documentation <ref-contrib-sitemaps>`. syndication =========== A framework for generating syndication feeds, in RSS and Atom, quite easily. -See the `syndication documentation`_. - -.. _syndication documentation: ../syndication_feeds/ +See the :ref:`syndication documentation <ref-contrib-syndication>`. webdesign ========= @@ -264,9 +188,7 @@ webdesign Helpers and utilities targeted primarily at Web *designers* rather than Web *developers*. -See the `Web design helpers documentation`_. - -.. _Web design helpers documentation: ../webdesign/ +See the :ref:`Web design helpers documentation <ref-contrib-webdesign>`. Other add-ons ============= diff --git a/docs/ref/contrib/localflavor.txt b/docs/ref/contrib/localflavor.txt new file mode 100644 index 0000000000..9b9a4a38a3 --- /dev/null +++ b/docs/ref/contrib/localflavor.txt @@ -0,0 +1,651 @@ +.. _ref-contrib-localflavor: + +========================== +The "local flavor" add-ons +========================== + +.. module:: django.contrib.localflavor + :synopsis: A collection of various Django snippets that are useful only for + a particular country or culture. + +Following its "batteries included" philosophy, Django comes with assorted +pieces of code that are useful for particular countries or cultures. These are +called the "local flavor" add-ons and live in the +:mod:`django.contrib.localflavor` package. + +Inside that package, country- or culture-specific code is organized into +subpackages, named using `ISO 3166 country codes`_. + +Most of the ``localflavor`` add-ons are localized form components deriving +from the :ref:`forms <topics-forms-index>` framework -- for example, a +:class:`~django.contrib.localflavor.us.forms.USStateField` that knows how to +validate U.S. state abbreviations, and a +:class:`~django.contrib.localflavor.fi.forms.FISocialSecurityNumber` that +knows how to validate Finnish social security numbers. + +To use one of these localized components, just import the relevant subpackage. +For example, here's how you can create a form with a field representing a +French telephone number:: + + from django import forms + from django.contrib.localflavor import fr + + class MyForm(forms.Form): + my_french_phone_no = fr.forms.FRPhoneNumberField() + +Supported countries +=================== + +Countries currently supported by :mod:`~django.contrib.localflavor` are: + + * Argentina_ + * Australia_ + * Austria_ + * Brazil_ + * Canada_ + * Chile_ + * Finland_ + * France_ + * Germany_ + * Holland_ + * Iceland_ + * India_ + * Italy_ + * Japan_ + * Mexico_ + * Norway_ + * Peru_ + * Poland_ + * Romania_ + * Slovakia_ + * `South Africa`_ + * Spain_ + * Switzerland_ + * `United Kingdom`_ + * `United States of America`_ + +The ``django.contrib.localflavor`` package also includes a ``generic`` subpackage, +containing useful code that is not specific to one particular country or +culture. Currently, it defines date and datetime input fields based on those +from :ref:`forms <topics-forms-index>`, but with non-US default formats. +Here's an example of how to use them:: + + from django import forms + from django.contrib.localflavor import generic + + class MyForm(forms.Form): + my_date_field = generic.forms.DateField() + +.. _ISO 3166 country codes: http://www.iso.org/iso/country_codes/iso_3166_code_lists/english_country_names_and_code_elements.htm +.. _Argentina: `Argentina (ar)`_ +.. _Australia: `Australia (au)`_ +.. _Austria: `Austria (at)`_ +.. _Brazil: `Brazil (br)`_ +.. _Canada: `Canada (ca)`_ +.. _Chile: `Chile (cl)`_ +.. _Finland: `Finland (fi)`_ +.. _France: `France (fr)`_ +.. _Germany: `Germany (de)`_ +.. _Holland: `Holland (nl)`_ +.. _Iceland: `Iceland (is\_)`_ +.. _India: `India (in\_)`_ +.. _Italy: `Italy (it)`_ +.. _Japan: `Japan (jp)`_ +.. _Mexico: `Mexico (mx)`_ +.. _Norway: `Norway (no)`_ +.. _Peru: `Peru (pe)`_ +.. _Poland: `Poland (pl)`_ +.. _Romania: `Romania (ro)`_ +.. _Slovakia: `Slovakia (sk)`_ +.. _South Africa: `South Africa (za)`_ +.. _Spain: `Spain (es)`_ +.. _Switzerland: `Switzerland (ch)`_ +.. _United Kingdom: `United Kingdom (uk)`_ +.. _United States of America: `United States of America (us)`_ + +Adding flavors +============== + +We'd love to add more of these to Django, so please `create a ticket`_ with +any code you'd like to contribute. One thing we ask is that you please use +Unicode objects (``u'mystring'``) for strings, rather than setting the encoding +in the file. See any of the existing flavors for examples. + +.. _create a ticket: http://code.djangoproject.com/simpleticket + +Argentina (``ar``) +============================================= + +.. class:: ar.forms.ARPostalCodeField + + A form field that validates input as either a classic four-digit Argentinian + postal code or a CPA_. + +.. _CPA: http://www.correoargentino.com.ar/consulta_cpa/home.php + +.. class:: ar.forms.ARDNIField + + A form field that validates input as a Documento Nacional de Identidad (DNI) + number. + +.. class:: ar.forms.ARCUITField + + A form field that validates input as a Codigo Unico de Identificacion + Tributaria (CUIT) number. + +.. class:: ar.forms.ARProvinceSelect + + A ``Select`` widget that uses a list of Argentina's provinces and autonomous + cities as its choices. + +Australia (``au``) +============================================= + +.. class:: au.forms.AUPostCodeField + + A form field that validates input as an Australian postcode. + +.. class:: au.forms.AUPhoneNumberField + + A form field that validates input as an Australian phone number. Valid numbers + have ten digits. + +.. class:: au.forms.AUStateSelect + + A ``Select`` widget that uses a list of Australian states/territories as its + choices. + +Austria (``at``) +================ + +.. class:: at.forms.ATZipCodeField + + A form field that validates its input as an Austrian zip code. + +.. class:: at.forms.ATStateSelect + + A ``Select`` widget that uses a list of Austrian states as its choices. + +.. class:: at.forms.ATSocialSecurityNumberField + + A form field that validates its input as an Austrian social security number. + +Brazil (``br``) +=============== + +.. class:: br.forms.BRPhoneNumberField + + A form field that validates input as a Brazilian phone number, with the format + XX-XXXX-XXXX. + +.. class:: br.forms.BRZipCodeField + + A form field that validates input as a Brazilian zip code, with the format + XXXXX-XXX. + +.. class:: br.forms.BRStateSelect + + A ``Select`` widget that uses a list of Brazilian states/territories as its + choices. + +Canada (``ca``) +=============== + +.. class:: ca.forms.CAPhoneNumberField + + A form field that validates input as a Canadian phone number, with the format + XXX-XXX-XXXX. + +.. class:: ca.forms.CAPostalCodeField + + A form field that validates input as a Canadian postal code, with the format + XXX XXX. + +.. class:: ca.forms.CAProvinceField + + A form field that validates input as a Canadian province name or abbreviation. + +.. class:: ca.forms.CASocialInsuranceNumberField + + A form field that validates input as a Canadian Social Insurance Number (SIN). + A valid number must have the format XXX-XXX-XXX and pass a `Luhn mod-10 + checksum`_. + +.. _Luhn mod-10 checksum: http://en.wikipedia.org/wiki/Luhn_algorithm + +.. class:: ca.forms.CAProvinceSelect + + A ``Select`` widget that uses a list of Canadian provinces and territories as + its choices. + +Chile (``cl``) +============== + +.. class:: cl.forms.CLRutField + + A form field that validates input as a Chilean national identification number + ('Rol Unico Tributario' or RUT). The valid format is XX.XXX.XXX-X. + +.. class:: cl.forms.CLRegionSelect + + A ``Select`` widget that uses a list of Chilean regions (Regiones) as its + choices. + +Finland (``fi``) +================ + +.. class:: fi.forms.FISocialSecurityNumber + + A form field that validates input as a Finnish social security number. + +.. class:: fi.forms.FIZipCodeField + + A form field that validates input as a Finnish zip code. Valid codes + consist of five digits. + +.. class:: fi.forms.FIMunicipalitySelect + + A ``Select`` widget that uses a list of Finnish municipalities as its + choices. + +France (``fr``) +=============== + +.. class:: fr.forms.FRPhoneNumberField + + A form field that validates input as a French local phone number. The + correct format is 0X XX XX XX XX. 0X.XX.XX.XX.XX and 0XXXXXXXXX validate + but are corrected to 0X XX XX XX XX. + +.. class:: fr.forms.FRZipCodeField + + A form field that validates input as a French zip code. Valid codes + consist of five digits. + +.. class:: fr.forms.FRDepartmentSelect + + A ``Select`` widget that uses a list of French departments as its choices. + +Germany (``de``) +================ + +.. class:: de.forms.DEIdentityCardNumberField + + A form field that validates input as a German identity card number + (Personalausweis_). Valid numbers have the format + XXXXXXXXXXX-XXXXXXX-XXXXXXX-X, with no group consisting entirely of zeroes. + +.. _Personalausweis: http://de.wikipedia.org/wiki/Personalausweis + +.. class:: de.forms.DEZipCodeField + + A form field that validates input as a German zip code. Valid codes + consist of five digits. + +.. class:: de.forms.DEStateSelect + + A ``Select`` widget that uses a list of German states as its choices. + +Holland (``nl``) +================ + +.. class:: nl.forms.NLPhoneNumberField + + A form field that validates input as a Dutch telephone number. + +.. class:: nl.forms.NLSofiNumberField + + A form field that validates input as a Dutch social security number + (SoFI/BSN). + +.. class:: nl.forms.NLZipCodeField + + A form field that validates input as a Dutch zip code. + +.. class:: nl.forms.NLProvinceSelect + + A ``Select`` widget that uses a list of Dutch provinces as its list of + choices. + +Iceland (``is_``) +================= + +.. class:: is_.forms.ISIdNumberField + + A form field that validates input as an Icelandic identification number + (kennitala). The format is XXXXXX-XXXX. + +.. class:: is_.forms.ISPhoneNumberField + + A form field that validates input as an Icelandtic phone number (seven + digits with an optional hyphen or space after the first three digits). + +.. class:: is_.forms.ISPostalCodeSelect + + A ``Select`` widget that uses a list of Icelandic postal codes as its + choices. + +India (``in_``) +=============== + +.. class:: in.forms.INStateField + + A form field that validates input as an Indian state/territory name or + abbreviation. Input is normalized to the standard two-letter vehicle + registration abbreviation for the given state or territory. + +.. class:: in.forms.INZipCodeField + + A form field that validates input as an Indian zip code, with the + format XXXXXXX. + +.. class:: in.forms.INStateSelect + + A ``Select`` widget that uses a list of Indian states/territories as its + choices. + +Italy (``it``) +============== + +.. class:: it.forms.ITSocialSecurityNumberField + + A form field that validates input as an Italian social security number + (`codice fiscale`_). + +.. _codice fiscale: http://www.agenziaentrate.it/ilwwcm/connect/Nsi/Servizi/Codice+fiscale+-+tessera+sanitaria/Codice+fiscale/NSI+Informazioni+sulla+codificazione+delle+persone+fisiche + +.. class:: it.forms.ITVatNumberField + + A form field that validates Italian VAT numbers (partita IVA). + +.. class:: it.forms.ITZipCodeField + + A form field that validates input as an Italian zip code. Valid codes + must have five digits. + +.. class:: it.forms.ITProvinceSelect + + A ``Select`` widget that uses a list of Italian provinces as its choices. + +.. class:: it.forms.ITRegionSelect + + A ``Select`` widget that uses a list of Italian regions as its choices. + +Japan (``jp``) +============== + +.. class:: jp.forms.JPPostalCodeField + + A form field that validates input as a Japanese postcode. It accepts seven + digits, with or without a hyphen. + +.. class:: jp.forms.JPPrefectureSelect + + A ``Select`` widget that uses a list of Japanese prefectures as its choices. + +Mexico (``mx``) +=============== + +.. class:: mx.forms.MXStateSelect + + A ``Select`` widget that uses a list of Mexican states as its choices. + +Norway (``no``) +=============== + +.. class:: no.forms.NOSocialSecurityNumber + + A form field that validates input as a Norwegian social security number + (personnummer_). + +.. _personnummer: http://no.wikipedia.org/wiki/Personnummer + +.. class:: no.forms.NOZipCodeField + + A form field that validates input as a Norwegian zip code. Valid codes + have four digits. + +.. class:: no.forms.NOMunicipalitySelect + + A ``Select`` widget that uses a list of Norwegian municipalities (fylker) as + its choices. + +Peru (``pe``) +============= + +.. class:: pt.forms.PEDNIField + + A form field that validates input as a DNI (Peruvian national identity) + number. + +.. class:: pt.forms.PERUCField + + A form field that validates input as an RUC (Registro Unico de + Contribuyentes) number. Valid RUC numbers have 11 digits. + +.. class:: pt.forms.PEDepartmentSelect + + A ``Select`` widget that uses a list of Peruvian Departments as its choices. + +Poland (``pl``) +=============== + +.. class:: pl.forms.PLNationalIdentificationNumberField + + A form field that validates input as a Polish national identification number + (PESEL_). + +.. _PESEL: http://en.wikipedia.org/wiki/PESEL + +.. class:: pl.forms.PLNationalBusinessRegisterField + + A form field that validates input as a Polish National Official Business + Register Number (REGON_), having either seven or nine digits. The checksum + algorithm used for REGONs is documented at + http://wipos.p.lodz.pl/zylla/ut/nip-rego.html. + +.. _REGON: http://www.stat.gov.pl/bip/regon_ENG_HTML.htm + +.. class:: pl.forms.PLPostalCodeField + + A form field that validates input as a Polish postal code. The valid format + is XX-XXX, where X is a digit. + +.. class:: pl.forms.PLTaxNumberField + + A form field that validates input as a Polish Tax Number (NIP). Valid + formats are XXX-XXX-XX-XX or XX-XX-XXX-XXX. The checksum algorithm used + for NIPs is documented at http://wipos.p.lodz.pl/zylla/ut/nip-rego.html. + +.. class:: pl.forms.PLAdministrativeUnitSelect + + A ``Select`` widget that uses a list of Polish administrative units as its + choices. + +.. class:: pl.forms.PLVoivodeshipSelect + + A ``Select`` widget that uses a list of Polish voivodeships (administrative + provinces) as its choices. + +Romania (``ro``) +================ + +.. class:: ro.forms.ROCIFField + + A form field that validates Romanian fiscal identification codes (CIF). The + return value strips the leading RO, if given. + +.. class:: ro.forms.ROCNPField + + A form field that validates Romanian personal numeric codes (CNP). + +.. class:: ro.forms.ROCountyField + + A form field that validates its input as a Romanian county (judet) name or + abbreviation. It normalizes the input to the standard vehicle registration + abbreviation for the given county. This field will only accept names written + with diacritics; consider using ROCountySelect as an alternative. + +.. class:: ro.forms.ROCountySelect + + A ``Select`` widget that uses a list of Romanian counties (judete) as its + choices. + +.. class:: ro.forms.ROIBANField + + A form field that validates its input as a Romanian International Bank + Account Number (IBAN). The valid format is ROXX-XXXX-XXXX-XXXX-XXXX-XXXX, + with or without hyphens. + +.. class:: ro.forms.ROPhoneNumberField + + A form field that validates Romanian phone numbers, short special numbers + excluded. + +.. class:: ro.forms.ROPostalCodeField + + A form field that validates Romanian postal codes. + +Slovakia (``sk``) +================= + +.. class:: sk.forms.SKPostalCodeField + + A form field that validates input as a Slovak postal code. Valid formats + are XXXXX or XXX XX, where X is a digit. + +.. class:: sk.forms.SKDistrictSelect + + A ``Select`` widget that uses a list of Slovak districts as its choices. + +.. class:: sk.forms.SKRegionSelect + + A ``Select`` widget that uses a list of Slovak regions as its choices. + +South Africa (``za``) +===================== + +.. class:: za.forms.ZAIDField + + A form field that validates input as a South African ID number. Validation + uses the Luhn checksum and a simplistic (i.e., not entirely accurate) check + for birth date. + +.. class:: za.forms.ZAPostCodeField + + A form field that validates input as a South African postcode. Valid + postcodes must have four digits. + +Spain (``es``) +============== + +.. class:: es.forms.ESIdentityCardNumberField + + A form field that validates input as a Spanish NIF/NIE/CIF (Fiscal + Identification Number) code. + +.. class:: es.forms.ESCCCField + + A form field that validates input as a Spanish bank account number (Codigo + Cuenta Cliente or CCC). A valid CCC number has the format + EEEE-OOOO-CC-AAAAAAAAAA, where the E, O, C and A digits denote the entity, + office, checksum and account, respectively. The first checksum digit + validates the entity and office. The second checksum digit validates the + account. It is also valid to use a space as a delimiter, or to use no + delimiter. + +.. class:: es.forms.ESPhoneNumberField + + A form field that validates input as a Spanish phone number. Valid numbers + have nine digits, the first of which is 6, 8 or 9. + +.. class:: es.forms.ESPostalCodeField + + A form field that validates input as a Spanish postal code. Valid codes + have five digits, the first two being in the range 01 to 52, representing + the province. + +.. class:: es.forms.ESProvinceSelect + + A ``Select`` widget that uses a list of Spanish provinces as its choices. + +.. class:: es.forms.ESRegionSelect + + A ``Select`` widget that uses a list of Spanish regions as its choices. + +Switzerland (``ch``) +==================== + +.. class:: ch.forms.CHIdentityCardNumberField + + A form field that validates input as a Swiss identity card number. + A valid number must confirm to the X1234567<0 or 1234567890 format and + have the correct checksums -- see http://adi.kousz.ch/artikel/IDCHE.htm. + +.. class:: ch.forms.CHPhoneNumberField + + A form field that validates input as a Swiss phone number. The correct + format is 0XX XXX XX XX. 0XX.XXX.XX.XX and 0XXXXXXXXX validate but are + corrected to 0XX XXX XX XX. + +.. class:: ch.forms.CHZipCodeField + + A form field that validates input as a Swiss zip code. Valid codes + consist of four digits. + +.. class:: ch.forms.CHStateSelect + + A ``Select`` widget that uses a list of Swiss states as its choices. + +United Kingdom (``uk``) +======================= + +.. class:: uk.forms.UKPostcodeField + + A form field that validates input as a UK postcode. The regular + expression used is sourced from the schema for British Standard BS7666 + address types at http://www.govtalk.gov.uk/gdsc/schemas/bs7666-v2-0.xsd. + +.. class:: ch.forms.UKCountySelect + + A ``Select`` widget that uses a list of UK counties/regions as its choices. + +.. class:: ch.forms.UKNationSelect + + A ``Select`` widget that uses a list of UK nations as its choices. + +United States of America (``us``) +================================= + +.. class:: us.forms.USPhoneNumberField + + A form field that validates input as a U.S. phone number. + +.. class:: us.forms.USSocialSecurityNumberField + + A form field that validates input as a U.S. Social Security Number (SSN). + A valid SSN must obey the following rules: + + * Format of XXX-XX-XXXX + * No group of digits consisting entirely of zeroes + * Leading group of digits cannot be 666 + * Number not in promotional block 987-65-4320 through 987-65-4329 + * Number not one known to be invalid due to widespread promotional + use or distribution (e.g., the Woolworth's number or the 1962 + promotional number) + +.. class:: us.forms.USStateField + + A form field that validates input as a U.S. state name or abbreviation. It + normalizes the input to the standard two-letter postal service abbreviation + for the given state. + +.. class:: us.forms.USZipCodeField + + A form field that validates input as a U.S. ZIP code. Valid formats are + XXXXX or XXXXX-XXXX. + +.. class:: us.forms.USStateSelect + + A form ``Select`` widget that uses a list of U.S. states/territories as its + choices. diff --git a/docs/redirects.txt b/docs/ref/contrib/redirects.txt similarity index 66% rename from docs/redirects.txt rename to docs/ref/contrib/redirects.txt index 4df60d473f..6f9c57c09d 100644 --- a/docs/redirects.txt +++ b/docs/ref/contrib/redirects.txt @@ -1,7 +1,12 @@ +.. _ref-contrib-redirects: + ================= The redirects app ================= +.. module:: django.contrib.redirects + :synopsis: A framework for managing redirects. + Django comes with an optional redirects application. It lets you store simple redirects in a database and handles the redirecting for you. @@ -10,13 +15,11 @@ Installation To install the redirects app, follow these steps: - 1. Add ``'django.contrib.redirects'`` to your INSTALLED_APPS_ setting. + 1. Add ``'django.contrib.redirects'`` to your :setting:`INSTALLED_APPS` + setting. 2. Add ``'django.contrib.redirects.middleware.RedirectFallbackMiddleware'`` - to your MIDDLEWARE_CLASSES_ setting. - 3. Run the command ``manage.py syncdb``. - -.. _INSTALLED_APPS: ../settings/#installed-apps -.. _MIDDLEWARE_CLASSES: ../settings/#middleware-classes + to your :setting:`MIDDLEWARE_CLASSES` setting. + 3. Run the command :djadmin:`manage.py syncdb <syncdb>`. How it works ============ @@ -27,8 +30,8 @@ is a simple lookup table with ``site_id``, ``old_path`` and ``new_path`` fields. The ``RedirectFallbackMiddleware`` does all of the work. Each time any Django application raises a 404 error, this middleware checks the redirects database for the requested URL as a last resort. Specifically, it checks for a redirect -with the given ``old_path`` with a site ID that corresponds to the SITE_ID_ -setting. +with the given ``old_path`` with a site ID that corresponds to the +:setting:`SITE_ID` setting. * If it finds a match, and ``new_path`` is not empty, it redirects to ``new_path``. @@ -40,14 +43,12 @@ setting. The middleware only gets activated for 404s -- not for 500s or responses of any other status code. -Note that the order of ``MIDDLEWARE_CLASSES`` matters. Generally, you can put -``RedirectFallbackMiddleware`` at the end of the list, because it's a last -resort. +Note that the order of :setting:`MIDDLEWARE_CLASSES` matters. Generally, you +can put ``RedirectFallbackMiddleware`` at the end of the list, because it's a +last resort. -For more on middleware, read the `middleware docs`_. - -.. _SITE_ID: ../settings/#site-id -.. _middleware docs: ../middleware/ +For more on middleware, read the :ref:`middleware docs +<topics-http-middleware>`. How to add, change and delete redirects ======================================= @@ -62,10 +63,10 @@ other object in the system. Via the Python API ------------------ -Redirects are represented by a standard `Django model`_, which lives in -`django/contrib/redirects/models.py`_. You can access redirect -objects via the `Django database API`_. +.. class:: models.Redirect + + Redirects are represented by a standard :ref:`Django model <topics-db-models>`, + which lives in `django/contrib/redirects/models.py`_. You can access redirect + objects via the :ref:`Django database API <topics-db-queries>`. -.. _Django model: ../model-api/ .. _django/contrib/redirects/models.py: http://code.djangoproject.com/browser/django/trunk/django/contrib/redirects/models.py -.. _Django database API: ../db-api/ diff --git a/docs/ref/contrib/sitemaps.txt b/docs/ref/contrib/sitemaps.txt new file mode 100644 index 0000000000..c95ded6712 --- /dev/null +++ b/docs/ref/contrib/sitemaps.txt @@ -0,0 +1,343 @@ +.. _ref-contrib-sitemaps: + +===================== +The sitemap framework +===================== + +.. module:: django.contrib.sitemaps + :synopsis: A framework for generating Google sitemap XML files. + +Django comes with a high-level sitemap-generating framework that makes +creating sitemap_ XML files easy. + +.. _sitemap: http://www.sitemaps.org/ + +Overview +======== + +A sitemap is an XML file on your Web site that tells search-engine indexers how +frequently your pages change and how "important" certain pages are in relation +to other pages on your site. This information helps search engines index your +site. + +The Django sitemap framework automates the creation of this XML file by letting +you express this information in Python code. + +It works much like Django's :ref:`syndication framework +<ref-contrib-syndication>`. To create a sitemap, just write a +:class:`~django.contrib.sitemaps.Sitemap` class and point to it in your +:ref:`URLconf <topics-http-urls>`. + +Installation +============ + +To install the sitemap app, follow these steps: + + 1. Add ``'django.contrib.sitemaps'`` to your :setting:`INSTALLED_APPS` + setting. + + 2. Make sure ``'django.template.loaders.app_directories.load_template_source'`` + is in your :setting:`TEMPLATE_LOADERS` setting. It's in there by default, + so you'll only need to change this if you've changed that setting. + + 3. Make sure you've installed the + :mod:`sites framework <django.contrib.sites>`. + +(Note: The sitemap application doesn't install any database tables. The only +reason it needs to go into :setting:`INSTALLED_APPS` is so that the +:func:`~django.template.loaders.app_directories.load_template_source` template +loader can find the default templates.) + +Initialization +============== + +To activate sitemap generation on your Django site, add this line to your +:ref:`URLconf <topics-http-urls>`:: + + (r'^sitemap.xml$', 'django.contrib.sitemaps.views.sitemap', {'sitemaps': sitemaps}) + +This tells Django to build a sitemap when a client accesses :file:`/sitemap.xml`. + +The name of the sitemap file is not important, but the location is. Search +engines will only index links in your sitemap for the current URL level and +below. For instance, if :file:`sitemap.xml` lives in your root directory, it may +reference any URL in your site. However, if your sitemap lives at +:file:`/content/sitemap.xml`, it may only reference URLs that begin with +:file:`/content/`. + +The sitemap view takes an extra, required argument: ``{'sitemaps': sitemaps}``. +``sitemaps`` should be a dictionary that maps a short section label (e.g., +``blog`` or ``news``) to its :class:`~django.contrib.sitemaps.Sitemap` class +(e.g., ``BlogSitemap`` or ``NewsSitemap``). It may also map to an *instance* of +a :class:`~django.contrib.sitemaps.Sitemap` class (e.g., +``BlogSitemap(some_var)``). + +Sitemap classes +=============== + +A :class:`~django.contrib.sitemaps.Sitemap` class is a simple Python +class that represents a "section" of entries in your sitemap. For example, +one :class:`~django.contrib.sitemaps.Sitemap` class could represent +all the entries of your weblog, while another could represent all of the +events in your events calendar. + +In the simplest case, all these sections get lumped together into one +:file:`sitemap.xml`, but it's also possible to use the framework to generate a +sitemap index that references individual sitemap files, one per section. (See +`Creating a sitemap index`_ below.) + +:class:`~django.contrib.sitemaps.Sitemap` classes must subclass +``django.contrib.sitemaps.Sitemap``. They can live anywhere in your codebase. + +A simple example +================ + +Let's assume you have a blog system, with an ``Entry`` model, and you want your +sitemap to include all the links to your individual blog entries. Here's how +your sitemap class might look:: + + from django.contrib.sitemaps import Sitemap + from mysite.blog.models import Entry + + class BlogSitemap(Sitemap): + changefreq = "never" + priority = 0.5 + + def items(self): + return Entry.objects.filter(is_draft=False) + + def lastmod(self, obj): + return obj.pub_date + +Note: + + * :attr:`~Sitemap.changefreq` and :attr:`~Sitemap.priority` are class + attributes corresponding to ``<changefreq>`` and ``<priority>`` elements, + respectively. They can be made callable as functions, as + :attr:`~Sitemap.lastmod` was in the example. + * :attr:`~Sitemap.items()` is simply a method that returns a list of + objects. The objects returned will get passed to any callable methods + corresponding to a sitemap property (:attr:`~Sitemap.location`, + :attr:`~Sitemap.lastmod`, :attr:`~Sitemap.changefreq`, and + :attr:`~Sitemap.priority`). + * :attr:`~Sitemap.lastmod` should return a Python ``datetime`` object. + * There is no :attr:`~Sitemap.location` method in this example, but you + can provide it in order to specify the URL for your object. By default, + :attr:`~Sitemap.location()` calls ``get_absolute_url()`` on each object + and returns the result. + +Sitemap class reference +======================= + +.. class:: Sitemap + + A ``Sitemap`` class can define the following methods/attributes: + + .. attribute:: Sitemap.items + + **Required.** A method that returns a list of objects. The framework + doesn't care what *type* of objects they are; all that matters is that + these objects get passed to the :attr:`~Sitemap.location()`, + :attr:`~Sitemap.lastmod()`, :attr:`~Sitemap.changefreq()` and + :attr:`~Sitemap.priority()` methods. + + .. attribute:: Sitemap.location + + **Optional.** Either a method or attribute. + + If it's a method, it should return the absolute URL for a given object as + returned by :attr:`~Sitemap.items()`. + + If it's an attribute, its value should be a string representing an absolute URL + to use for *every* object returned by :attr:`~Sitemap.items()`. + + In both cases, "absolute URL" means a URL that doesn't include the protocol or + domain. Examples: + + * Good: :file:`'/foo/bar/'` + * Bad: :file:`'example.com/foo/bar/'` + * Bad: :file:`'http://example.com/foo/bar/'` + + If :attr:`~Sitemap.location` isn't provided, the framework will call the + ``get_absolute_url()`` method on each object as returned by + :attr:`~Sitemap.items()`. + + .. attribute:: Sitemap.lastmod + + **Optional.** Either a method or attribute. + + If it's a method, it should take one argument -- an object as returned by + :attr:`~Sitemap.items()` -- and return that object's last-modified date/time, as a Python + ``datetime.datetime`` object. + + If it's an attribute, its value should be a Python ``datetime.datetime`` object + representing the last-modified date/time for *every* object returned by + :attr:`~Sitemap.items()`. + + .. attribute:: Sitemap.changefreq + + **Optional.** Either a method or attribute. + + If it's a method, it should take one argument -- an object as returned by + :attr:`~Sitemap.items()` -- and return that object's change frequency, as a Python string. + + If it's an attribute, its value should be a string representing the change + frequency of *every* object returned by :attr:`~Sitemap.items()`. + + Possible values for :attr:`~Sitemap.changefreq`, whether you use a method or attribute, are: + + * ``'always'`` + * ``'hourly'`` + * ``'daily'`` + * ``'weekly'`` + * ``'monthly'`` + * ``'yearly'`` + * ``'never'`` + + .. method:: Sitemap.priority + + **Optional.** Either a method or attribute. + + If it's a method, it should take one argument -- an object as returned by + :attr:`~Sitemap.items()` -- and return that object's priority, as either a string or float. + + If it's an attribute, its value should be either a string or float representing + the priority of *every* object returned by :attr:`~Sitemap.items()`. + + Example values for :attr:`~Sitemap.priority`: ``0.4``, ``1.0``. The default priority of a + page is ``0.5``. See the `sitemaps.org documentation`_ for more. + + .. _sitemaps.org documentation: http://www.sitemaps.org/protocol.html#prioritydef + +Shortcuts +========= + +The sitemap framework provides a couple convenience classes for common cases: + +.. class:: FlatPageSitemap + + The :class:`django.contrib.sitemaps.FlatPageSitemap` class looks at all + :mod:`flatpages <django.contrib.flatpages>` defined for the current + :setting:`SITE_ID` (see the + :mod:`sites documentation <django.contrib.sites>`) and + creates an entry in the sitemap. These entries include only the + :attr:`~Sitemap.location` attribute -- not :attr:`~Sitemap.lastmod`, + :attr:`~Sitemap.changefreq` or :attr:`~Sitemap.priority`. + +.. class:: GenericSitemap + + The :class:`django.contrib.sitemaps.GenericSitemap` class works with any + :ref:`generic views <ref-generic-views>` you already have. + To use it, create an instance, passing in the same :data:`info_dict` you pass to + the generic views. The only requirement is that the dictionary have a + :data:`queryset` entry. It may also have a :data:`date_field` entry that specifies a + date field for objects retrieved from the :data:`queryset`. This will be used for + the :attr:`~Sitemap.lastmod` attribute in the generated sitemap. You may + also pass :attr:`~Sitemap.priority` and :attr:`~Sitemap.changefreq` + keyword arguments to the :class:`~django.contrib.sitemaps.GenericSitemap` + constructor to specify these attributes for all URLs. + +Example +------- + +Here's an example of a :ref:`URLconf <topics-http-urls>` using both:: + + from django.conf.urls.defaults import * + from django.contrib.sitemaps import FlatPageSitemap, GenericSitemap + from mysite.blog.models import Entry + + info_dict = { + 'queryset': Entry.objects.all(), + 'date_field': 'pub_date', + } + + sitemaps = { + 'flatpages': FlatPageSitemap, + 'blog': GenericSitemap(info_dict, priority=0.6), + } + + urlpatterns = patterns('', + # some generic view using info_dict + # ... + + # the sitemap + (r'^sitemap.xml$', 'django.contrib.sitemaps.views.sitemap', {'sitemaps': sitemaps}) + ) + +.. _URLconf: ../url_dispatch/ + +Creating a sitemap index +======================== + +The sitemap framework also has the ability to create a sitemap index that +references individual sitemap files, one per each section defined in your +:data:`sitemaps` dictionary. The only differences in usage are: + + * You use two views in your URLconf: :func:`django.contrib.sitemaps.views.index` + and :func:`django.contrib.sitemaps.views.sitemap`. + * The :func:`django.contrib.sitemaps.views.sitemap` view should take a + :data:`section` keyword argument. + +Here is what the relevant URLconf lines would look like for the example above:: + + (r'^sitemap.xml$', 'django.contrib.sitemaps.views.index', {'sitemaps': sitemaps}) + (r'^sitemap-(?P<section>.+).xml$', 'django.contrib.sitemaps.views.sitemap', {'sitemaps': sitemaps}) + +This will automatically generate a :file:`sitemap.xml` file that references both +:file:`sitemap-flatpages.xml` and :file:`sitemap-blog.xml`. The +:class:`~django.contrib.sitemaps.Sitemap` classes and the :data:`sitemaps` dict +don't change at all. + +If one of your sitemaps is going to have more than 50,000 URLs you should +create an index file. Your sitemap will be paginated and the index will +reflect that. + +Pinging Google +============== + +You may want to "ping" Google when your sitemap changes, to let it know to +reindex your site. The framework provides a function to do just that: +:func:`django.contrib.sitemaps.ping_google()`. + +.. function:: ping_google + + :func:`ping_google` takes an optional argument, :data:`sitemap_url`, + which should be the absolute URL of your site's sitemap (e.g., + :file:`'/sitemap.xml'`). If this argument isn't provided, + :func:`ping_google` will attempt to figure out your + sitemap by performing a reverse looking in your URLconf. + + :func:`ping_google` raises the exception + :exc:`django.contrib.sitemaps.SitemapNotFound` if it cannot determine your + sitemap URL. + +One useful way to call :func:`ping_google` is from a model's ``save()`` +method:: + + from django.contrib.sitemaps import ping_google + + class Entry(models.Model): + # ... + def save(self): + super(Entry, self).save() + try: + ping_google() + except Exception: + # Bare 'except' because we could get a variety + # of HTTP-related exceptions. + pass + +A more efficient solution, however, would be to call :func:`ping_google` from a +cron script, or some other scheduled task. The function makes an HTTP request +to Google's servers, so you may not want to introduce that network overhead +each time you call ``save()``. + +Pinging Google via `manage.py` +------------------------------ + +**New in Django development version** + +Once the sitemaps application is added to your project, you may also +ping the Google server's through the command line manage.py interface:: + + python manage.py ping_google [/sitemap.xml] diff --git a/docs/sites.txt b/docs/ref/contrib/sites.txt similarity index 60% rename from docs/sites.txt rename to docs/ref/contrib/sites.txt index 9516b43995..5a29370561 100644 --- a/docs/sites.txt +++ b/docs/ref/contrib/sites.txt @@ -1,7 +1,13 @@ +.. _ref-contrib-sites: + ===================== The "sites" framework ===================== +.. module:: django.contrib.sites + :synopsis: Lets you operate multiple web sites from the same database and + Django project + Django comes with an optional "sites" framework. It's a hook for associating objects and functionality to particular Web sites, and it's a holding place for the domain names and "verbose" names of your Django-powered sites. @@ -9,12 +15,15 @@ the domain names and "verbose" names of your Django-powered sites. Use it if your single Django installation powers more than one site and you need to differentiate between those sites in some way. -The whole sites framework is based on two simple concepts: +The whole sites framework is based on a simple model: - * The ``Site`` model, found in ``django.contrib.sites``, has ``domain`` and - ``name`` fields. - * The ``SITE_ID`` setting specifies the database ID of the ``Site`` object - associated with that particular settings file. +.. class:: django.contrib.sites.models.Site + +This model has :attr:`~django.contrib.sites.models.Site.domain` and +:attr:`~django.contrib.sites.models.Site.name` fields. The :setting:`SITE_ID` +setting specifies the database ID of the +:class:`~django.contrib.sites.models.Site` object associated with that +particular settings file. How you use this is up to you, but Django uses it in a couple of ways automatically via simple conventions. @@ -40,7 +49,8 @@ multiple copies of the same story in the database. The better solution is simple: Both sites use the same article database, and an article is associated with one or more sites. In Django model terminology, -that's represented by a ``ManyToManyField`` in the ``Article`` model:: +that's represented by a :class:`~django.db.models.ManyToManyField` in the +``Article`` model:: from django.db import models from django.contrib.sites.models import Site @@ -77,8 +87,9 @@ This accomplishes several things quite nicely: Associating content with a single site -------------------------------------- -Similarly, you can associate a model to the ``Site`` model in a many-to-one -relationship, using ``ForeignKey``. +Similarly, you can associate a model to the :class:`~django.contrib.sites.models.Site` +model in a many-to-one relationship, using +:class:`~django.db.models.fields.related.ForeignKey`. For example, if an article is only allowed on a single site, you'd use a model like this:: @@ -123,8 +134,9 @@ domain:: else: # Do something else. -The idiom of retrieving the ``Site`` object for the value of -``settings.SITE_ID`` is quite common, so the ``Site`` model's manager has a +The idiom of retrieving the :class:`~django.contrib.sites.models.Site` object +for the value of :setting:`settings.SITE_ID <SITE_ID>` is quite common, so +the :class:`~django.contrib.sites.models.Site` model's manager has a ``get_current()`` method. This example is equivalent to the previous one:: from django.contrib.sites.models import Site @@ -146,9 +158,11 @@ reader signs up on a Web form, and he immediately gets an e-mail saying, It'd be inefficient and redundant to implement this signup-processing code twice, so the sites use the same code behind the scenes. But the "thank you for -signing up" notice needs to be different for each site. By using ``Site`` +signing up" notice needs to be different for each site. By using +:class:`~django.contrib.sites.models.Site` objects, we can abstract the "thank you" notice to use the values of the -current site's ``name`` and ``domain``. +current site's :attr:`~django.contrib.sites.models.Site.name` and +:attr:`~django.contrib.sites.models.Site.domain`. Here's an example of what the form-handling view looks like:: @@ -173,7 +187,7 @@ subscribing to LJWorld.com alerts." Same goes for the e-mail's message body. Note that an even more flexible (but more heavyweight) way of doing this would be to use Django's template system. Assuming Lawrence.com and LJWorld.com have -different template directories (``TEMPLATE_DIRS``), you could simply farm out +different template directories (:setting:`TEMPLATE_DIRS`), you could simply farm out to the template system like so:: from django.core.mail import send_mail @@ -189,12 +203,12 @@ to the template system like so:: # ... -In this case, you'd have to create ``subject.txt`` and ``message.txt`` template +In this case, you'd have to create :file:`subject.txt` and :file:`message.txt` template files for both the LJWorld.com and Lawrence.com template directories. That gives you more flexibility, but it's also more complex. -It's a good idea to exploit the ``Site`` objects as much as possible, to remove -unneeded complexity and redundancy. +It's a good idea to exploit the :class:`~django.contrib.sites.models.Site`` +objects as much as possible, to remove unneeded complexity and redundancy. Getting the current domain for full URLs ---------------------------------------- @@ -241,12 +255,17 @@ clear the cache using ``Site.objects.clear_cache()``:: The ``CurrentSiteManager`` ========================== -If ``Site``\s play a key role in your application, consider using the helpful -``CurrentSiteManager`` in your model(s). It's a model manager_ that -automatically filters its queries to include only objects associated with the -current ``Site``. +.. class:: django.contrib.sites.managers.CurrentSiteManager -Use ``CurrentSiteManager`` by adding it to your model explicitly. For example:: +If :class:`~django.contrib.sites.models.Site`\s play a key role in your application, +consider using the helpful +:class:`~django.contrib.sites.managers.CurrentSiteManager` in your model(s). +It's a model :ref:`manager <topics-db-managers>` that automatically filters +its queries to include only objects associated with the current +:class:`~django.contrib.sites.models.Site`. + +Use :class:`~django.contrib.sites.managers.CurrentSiteManager` by adding it to +your model explicitly. For example:: from django.db import models from django.contrib.sites.models import Site @@ -261,20 +280,24 @@ Use ``CurrentSiteManager`` by adding it to your model explicitly. For example:: on_site = CurrentSiteManager() With this model, ``Photo.objects.all()`` will return all ``Photo`` objects in -the database, but ``Photo.on_site.all()`` will return only the ``Photo`` -objects associated with the current site, according to the ``SITE_ID`` setting. +the database, but ``Photo.on_site.all()`` will return only the ``Photo`` objects +associated with the current site, according to the :setting:`SITE_ID` setting. Put another way, these two statements are equivalent:: Photo.objects.filter(site=settings.SITE_ID) Photo.on_site.all() -How did ``CurrentSiteManager`` know which field of ``Photo`` was the ``Site``? -It defaults to looking for a field called ``site``. If your model has a -``ForeignKey`` or ``ManyToManyField`` called something *other* than ``site``, -you need to explicitly pass that as the parameter to ``CurrentSiteManager``. -The following model, which has a field called ``publish_on``, demonstrates -this:: +How did :class:`~django.contrib.sites.managers.CurrentSiteManager` know which +field of ``Photo`` was the :class:`~django.contrib.sites.models.Site`? It +defaults to looking for a field called +:class:`~django.contrib.sites.models.Site`. If your model has a +:class:`~django.db.models.fields.related.ForeignKey` or +:class:`~django.db.models.fields.related.ManyToManyField` called something +*other* than :class:`~django.contrib.sites.models.Site`, you need to explicitly +pass that as the parameter to +:class:`~django.contrib.sites.managers.CurrentSiteManager`. The following model, +which has a field called ``publish_on``, demonstrates this:: from django.db import models from django.contrib.sites.models import Site @@ -288,21 +311,19 @@ this:: objects = models.Manager() on_site = CurrentSiteManager('publish_on') -If you attempt to use ``CurrentSiteManager`` and pass a field name that doesn't -exist, Django will raise a ``ValueError``. +If you attempt to use :class:`~django.contrib.sites.managers.CurrentSiteManager` +and pass a field name that doesn't exist, Django will raise a :exc:`ValueError`. Finally, note that you'll probably want to keep a normal (non-site-specific) -``Manager`` on your model, even if you use ``CurrentSiteManager``. As explained -in the `manager documentation`_, if you define a manager manually, then Django -won't create the automatic ``objects = models.Manager()`` manager for you. -Also, note that certain parts of Django -- namely, the Django admin site and +``Manager`` on your model, even if you use +:class:`~django.contrib.sites.managers.CurrentSiteManager`. As explained +in the :ref:`manager documentation <topics-db-managers>`, if you define a manager +manually, then Django won't create the automatic ``objects = models.Manager()`` +manager for you.Also, note that certain parts of Django -- namely, the Django admin site and generic views -- use whichever manager is defined *first* in the model, so if you want your admin site to have access to all objects (not just site-specific ones), put ``objects = models.Manager()`` in your model, before you define -``CurrentSiteManager``. - -.. _manager: ../model-api/#managers -.. _manager documentation: ../model-api/#managers +:class:`~django.contrib.sites.managers.CurrentSiteManager`. How Django uses the sites framework =================================== @@ -311,58 +332,70 @@ Although it's not required that you use the sites framework, it's strongly encouraged, because Django takes advantage of it in a few places. Even if your Django installation is powering only a single site, you should take the two seconds to create the site object with your ``domain`` and ``name``, and point -to its ID in your ``SITE_ID`` setting. +to its ID in your :setting:`SITE_ID` setting. Here's how Django uses the sites framework: - * In the `redirects framework`_, each redirect object is associated with a - particular site. When Django searches for a redirect, it takes into - account the current ``SITE_ID``. +* In the :mod:`redirects framework <django.contrib.redirects>`, each + redirect object is associated with a particular site. When Django searches + for a redirect, it takes into account the current :setting:`SITE_ID`. - * In the comments framework, each comment is associated with a particular - site. When a comment is posted, its ``site`` is set to the current - ``SITE_ID``, and when comments are listed via the appropriate template - tag, only the comments for the current site are displayed. +* In the comments framework, each comment is associated with a particular + site. When a comment is posted, its + :class:`~django.contrib.sites.models.Site` is set to the current + :setting:`SITE_ID`, and when comments are listed via the appropriate + template tag, only the comments for the current site are displayed. + +* In the :mod:`flatpages framework <django.contrib.flatpages>`, each + flatpage is associated with a particular site. When a flatpage is created, + you specify its :class:`~django.contrib.sites.models.Site`, and the + :class:`~django.contrib.flatpages.middleware.FlatpageFallbackMiddleware` + checks the current :setting:`SITE_ID` in retrieving flatpages to display. - * In the `flatpages framework`_, each flatpage is associated with a - particular site. When a flatpage is created, you specify its ``site``, - and the ``FlatpageFallbackMiddleware`` checks the current ``SITE_ID`` in - retrieving flatpages to display. +* In the :mod:`syndication framework <django.contrib.syndication>`, the + templates for ``title`` and ``description`` automatically have access to a + variable ``{{ site }}``, which is the + :class:`~django.contrib.sites.models.Site` object representing the current + site. Also, the hook for providing item URLs will use the ``domain`` from + the current :class:`~django.contrib.sites.models.Site` object if you don't + specify a fully-qualified domain. - * In the `syndication framework`_, the templates for ``title`` and - ``description`` automatically have access to a variable ``{{ site }}``, - which is the ``Site`` object representing the current site. Also, the - hook for providing item URLs will use the ``domain`` from the current - ``Site`` object if you don't specify a fully-qualified domain. +* In the :mod:`authentication framework <django.contrib.auth>`, the + :func:`django.contrib.auth.views.login` view passes the current + :class:`~django.contrib.sites.models.Site` name to the template as + ``{{ site_name }}``. - * In the `authentication framework`_, the ``django.contrib.auth.views.login`` - view passes the current ``Site`` name to the template as ``{{ site_name }}``. +* The shortcut view (:func:`django.views.defaults.shortcut`) uses the domain + of the current :class:`~django.contrib.sites.models.Site` object when + calculating an object's URL. - * The shortcut view (``django.views.defaults.shortcut``) uses the domain of - the current ``Site`` object when calculating an object's URL. +* In the admin framework, the "view on site" link uses the current + :class:`~django.contrib.sites.models.Site` to work out the domain for the + site that it will redirect to. - * In the admin framework, the ''view on site'' link uses the current - ``Site`` to work out the domain for the site that it will redirect to. - -.. _redirects framework: ../redirects/ -.. _flatpages framework: ../flatpages/ -.. _syndication framework: ../syndication_feeds/ -.. _authentication framework: ../authentication/ ``RequestSite`` objects ======================= +.. _requestsite-objects: + **New in Django development version** -Some ``django.contrib`` applications take advantage of the sites framework but -are architected in a way that doesn't *require* the sites framework to be -installed in your database. (Some people don't want to, or just aren't *able* -to install the extra database table that the sites framework requires.) For -those cases, the framework provides a ``RequestSite`` class, which can be used -as a fallback when the database-backed sites framework is not available. +Some :ref:`django.contrib <ref-contrib-index>` applications take advantage of +the sites framework but are architected in a way that doesn't *require* the +sites framework to be installed in your database. (Some people don't want to, or +just aren't *able* to install the extra database table that the sites framework +requires.) For those cases, the framework provides a +:class:`~django.contrib.sites.models.RequestSite` class, which can be used as a +fallback when the database-backed sites framework is not available. -A ``RequestSite`` object has a similar interface to a normal ``Site`` object, -except its ``__init__()`` method takes an ``HttpRequest`` object. It's able to -deduce the ``domain`` and ``name`` by looking at the request's domain. It has -``save()`` and ``delete()`` methods to match the interface of ``Site``, but -the methods raise ``NotImplementedError``. +A :class:`~django.contrib.sites.models.RequestSite` object has a similar +interface to a normal :class:`~django.contrib.sites.models.Site` object, except +its :meth:`~django.contrib.sites.models.RequestSite.__init__()` method takes an +:class:`~django.http.HttpRequest` object. It's able to deduce the +:attr:`~django.contrib.sites.models.RequestSite.domain` and +:attr:`~django.contrib.sites.models.RequestSite.name` by looking at the +request's domain. It has :meth:`~django.contrib.sites.models.RequestSite.save()` +and :meth:`~django.contrib.sites.models.RequestSite.delete()` methods to match +the interface of :class:`~django.contrib.sites.models.Site`, but the methods +raise :exc:`NotImplementedError`. diff --git a/docs/syndication_feeds.txt b/docs/ref/contrib/syndication.txt similarity index 72% rename from docs/syndication_feeds.txt rename to docs/ref/contrib/syndication.txt index ceb56a4788..6624793460 100644 --- a/docs/syndication_feeds.txt +++ b/docs/ref/contrib/syndication.txt @@ -1,7 +1,13 @@ +.. _ref-contrib-syndication: + ============================== The syndication feed framework ============================== +.. module:: django.contrib.syndication + :synopsis: A framework for generating syndication feeds, in RSS and Atom, + quite easily. + Django comes with a high-level syndication-feed-generating framework that makes creating RSS_ and Atom_ feeds easy. @@ -24,33 +30,33 @@ The high-level feed-generating framework is a view that's hooked to ``/feeds/`` by default. Django uses the remainder of the URL (everything after ``/feeds/``) to determine which feed to output. -To create a feed, just write a ``Feed`` class and point to it in your URLconf_. - -.. _URLconf: ../url_dispatch/ +To create a feed, just write a :class:`~django.contrib.syndication.feeds.Feed` +class and point to it in your :ref:`URLconf <topics-http-urls>`. Initialization -------------- If you're not using the latest Django development version, you'll need to make -sure Django's sites framework is installed -- including its database table. -(See the `sites framework documentation`_ for more information.) This has -changed in the Django development version; the syndication feed framework no -longer requires the sites framework. +sure Django's sites framework is installed -- including its database table. (See +the :mod:`sites framework documentation <django.contrib.sites>` for more +information.) This has changed in the Django development version; the +syndication feed framework no longer requires the sites framework. To activate syndication feeds on your Django site, add this line to your -URLconf_:: +:ref:`URLconf <topics-http-urls>`:: - (r'^feeds/(?P<url>.*)/$', 'django.contrib.syndication.views.feed', {'feed_dict': feeds}), + (r'^feeds/(?P<url>.*)/$', 'django.contrib.syndication.views.feed', {'feed_dict': feeds}), This tells Django to use the RSS framework to handle all URLs starting with -``"feeds/"``. (You can change that ``"feeds/"`` prefix to fit your own needs.) +:file:`"feeds/"`. (You can change that :file:`"feeds/"` prefix to fit your own +needs.) This URLconf line has an extra argument: ``{'feed_dict': feeds}``. Use this extra argument to pass the syndication framework the feeds that should be published under that URL. -Specifically, ``feed_dict`` should be a dictionary that maps a feed's slug -(short URL label) to its ``Feed`` class. +Specifically, :data:`feed_dict` should be a dictionary that maps a feed's slug +(short URL label) to its :class:`~django.contrib.syndication.feeds.Feed` class. You can define the ``feed_dict`` in the URLconf itself. Here's a full example URLconf:: @@ -76,22 +82,21 @@ The above example registers two feeds: * The feed represented by ``LatestEntriesByCategory`` will live at ``feeds/categories/``. -Once that's set up, you just need to define the ``Feed`` classes themselves. - -.. _sites framework documentation: ../sites/ -.. _URLconf: ../url_dispatch/ -.. _settings file: ../settings/ +Once that's set up, you just need to define the +:class:`~django.contrib.syndication.feeds.Feed` classes themselves. Feed classes ------------ -A ``Feed`` class is a simple Python class that represents a syndication feed. -A feed can be simple (e.g., a "site news" feed, or a basic feed displaying -the latest entries of a blog) or more complex (e.g., a feed displaying all the -blog entries in a particular category, where the category is variable). +A :class:`~django.contrib.syndication.feeds.Feed` class is a simple Python class +that represents a syndication feed. A feed can be simple (e.g., a "site news" +feed, or a basic feed displaying the latest entries of a blog) or more complex +(e.g., a feed displaying all the blog entries in a particular category, where +the category is variable). -``Feed`` classes must subclass ``django.contrib.syndication.feeds.Feed``. They -can live anywhere in your codebase. +:class:`~django.contrib.syndication.feeds.Feed` classes must subclass +``django.contrib.syndication.feeds.Feed``. They can live anywhere in your +codebase. A simple example ---------------- @@ -112,71 +117,83 @@ latest five news items:: Note: - * The class subclasses ``django.contrib.syndication.feeds.Feed``. - * ``title``, ``link`` and ``description`` correspond to the standard - RSS ``<title>``, ``<link>`` and ``<description>`` elements, respectively. - * ``items()`` is, simply, a method that returns a list of objects that - should be included in the feed as ``<item>`` elements. Although this - example returns ``NewsItem`` objects using Django's - `object-relational mapper`_, ``items()`` doesn't have to return model - instances. Although you get a few bits of functionality "for free" by - using Django models, ``items()`` can return any type of object you want. - * If you're creating an Atom feed, rather than an RSS feed, set the - ``subtitle`` attribute instead of the ``description`` attribute. See - `Publishing Atom and RSS feeds in tandem`_, later, for an example. +* The class subclasses ``django.contrib.syndication.feeds.Feed``. + +* :attr:`title`, :attr:`link` and :attr:`description` correspond to the + standard RSS ``<title>``, ``<link>`` and ``<description>`` elements, + respectively. + +* :meth:`items()` is, simply, a method that returns a list of objects that + should be included in the feed as ``<item>`` elements. Although this + example returns ``NewsItem`` objects using Django's + :ref:`object-relational mapper <ref-models-querysets>`, :meth:`items()` + doesn't have to return model instances. Although you get a few bits of + functionality "for free" by using Django models, :meth:`items()` can + return any type of object you want. + +* If you're creating an Atom feed, rather than an RSS feed, set the + :attr:`subtitle` attribute instead of the :attr:`description` attribute. + See `Publishing Atom and RSS feeds in tandem`_, later, for an example. One thing's left to do. In an RSS feed, each ``<item>`` has a ``<title>``, -``<link>`` and ``<description>``. We need to tell the framework what data to -put into those elements. +``<link>`` and ``<description>``. We need to tell the framework what data to put +into those elements. * To specify the contents of ``<title>`` and ``<description>``, create - `Django templates`_ called ``feeds/latest_title.html`` and - ``feeds/latest_description.html``, where ``latest`` is the ``slug`` - specified in the URLconf for the given feed. Note the ``.html`` extension - is required. The RSS system renders that template for each item, passing - it two template context variables: + :ref:`Django templates <topics-templates>` called + :file:`feeds/latest_title.html`` and + :file:`feeds/latest_description.html`, where :attr:`latest` is the + :attr:`slug` specified in the URLconf for the given feed. Note the + ``.html`` extension is required. The RSS system renders that template for + each item, passing it two template context variables: - * ``{{ obj }}`` -- The current object (one of whichever objects you - returned in ``items()``). - * ``{{ site }}`` -- A ``django.contrib.sites.models.Site`` object - representing the current site. This is useful for - ``{{ site.domain }}`` or ``{{ site.name }}``. Note that if you're - using the latest Django development version and do *not* have the - Django sites framework installed, this will be set to a - ``django.contrib.sites.models.RequestSite`` object. See the - `RequestSite section of the sites framework documentation`_ for - more. + * ``{{ obj }}`` -- The current object (one of whichever objects you + returned in :meth:`items()`). + + * ``{{ site }}`` -- A :class:`django.contrib.sites.models.Site` object + representing the current site. This is useful for ``{{ site.domain + }}`` or ``{{ site.name }}``. Note that if you're using the latest + Django development version and do *not* have the Django sites + framework installed, this will be set to a + :class:`django.contrib.sites.models.RequestSite` object. See the + :ref:`RequestSite section of the sites framework documentation + <requestsite-objects>` for more. If you don't create a template for either the title or description, the - framework will use the template ``"{{ obj }}"`` by default -- that is, - the normal string representation of the object. You can also change the - names of these two templates by specifying ``title_template`` and - ``description_template`` as attributes of your ``Feed`` class. - * To specify the contents of ``<link>``, you have two options. For each - item in ``items()``, Django first tries executing a - ``get_absolute_url()`` method on that object. If that method doesn't - exist, it tries calling a method ``item_link()`` in the ``Feed`` class, - passing it a single parameter, ``item``, which is the object itself. - Both ``get_absolute_url()`` and ``item_link()`` should return the item's - URL as a normal Python string. As with ``get_absolute_url()``, the - result of ``item_link()`` will be included directly in the URL, so you - are responsible for doing all necessary URL quoting and conversion to - ASCII inside the method itself. + framework will use the template ``"{{ obj }}"`` by default -- that is, the + normal string representation of the object. You can also change the names + of these two templates by specifying ``title_template`` and + ``description_template`` as attributes of your + :class:`~django.contrib.syndication.feeds.Feed` class. - * For the LatestEntries example above, we could have very simple feed templates: + * To specify the contents of ``<link>``, you have two options. For each item + in :meth:`items()`, Django first tries executing a ``get_absolute_url()`` + method on that object. If that method doesn't exist, it tries calling a + method :meth:`item_link()` in the + :class:`~django.contrib.syndication.feeds.Feed` class, passing it a single + parameter, :attr:`item`, which is the object itself. Both + ``get_absolute_url()`` and :meth:`item_link()` should return the item's + URL as a normal Python string. As with ``get_absolute_url()``, the result + of :meth:`item_link()` will be included directly in the URL, so you are + responsible for doing all necessary URL quoting and conversion to ASCII + inside the method itself. - * latest_title.html:: + * For the LatestEntries example above, we could have very simple feed + templates: - {{ obj.title }} + * latest_title.html: - * latest_description.html:: + .. code-block:: html+django - {{ obj.description }} + {{ obj.title }} + + * latest_description.html: + + .. code-block:: html+django + + {{ obj.description }} .. _chicagocrime.org: http://www.chicagocrime.org/ -.. _object-relational mapper: ../db-api/ -.. _Django templates: ../templates/ -.. _RequestSite section of the sites framework documentation: ../sites/#requestsite-objects A complex example ----------------- @@ -184,15 +201,16 @@ A complex example The framework also supports more complex feeds, via parameters. For example, `chicagocrime.org`_ offers an RSS feed of recent crimes for every -police beat in Chicago. It'd be silly to create a separate ``Feed`` class for -each police beat; that would violate the `DRY principle`_ and would couple data -to programming logic. Instead, the syndication framework lets you make generic +police beat in Chicago. It'd be silly to create a separate +:class:`~django.contrib.syndication.feeds.Feed` class for each police beat; that +would violate the :ref:`DRY principle <dry>` and would couple data to +programming logic. Instead, the syndication framework lets you make generic feeds that output items based on information in the feed's URL. On chicagocrime.org, the police-beat feeds are accessible via URLs like this: - * ``/rss/beats/0613/`` -- Returns recent crimes for beat 0613. - * ``/rss/beats/1424/`` -- Returns recent crimes for beat 1424. + * :file:`/rss/beats/0613/` -- Returns recent crimes for beat 0613. + * :file:`/rss/beats/1424/` -- Returns recent crimes for beat 1424. The slug here is ``"beats"``. The syndication framework sees the extra URL bits after the slug -- ``0613`` and ``1424`` -- and gives you a hook to tell it what @@ -223,70 +241,74 @@ An example makes this clear. Here's the code for these beat-specific feeds:: return "Crimes recently reported in police beat %s" % obj.beat def items(self, obj): - return Crime.objects.filter(beat__id__exact=obj.id).order_by('-crime_date')[:30] + return Crime.objects.filter(beat__id__exact=obj.id).order_by('-crime_date')[:30] Here's the basic algorithm the RSS framework follows, given this class and a -request to the URL ``/rss/beats/0613/``: +request to the URL :file:`/rss/beats/0613/`: - * The framework gets the URL ``/rss/beats/0613/`` and notices there's - an extra bit of URL after the slug. It splits that remaining string by - the slash character (``"/"``) and calls the ``Feed`` class' - ``get_object()`` method, passing it the bits. In this case, bits is - ``['0613']``. For a request to ``/rss/beats/0613/foo/bar/``, bits would - be ``['0613', 'foo', 'bar']``. + * The framework gets the URL :file:`/rss/beats/0613/` and notices there's an + extra bit of URL after the slug. It splits that remaining string by the + slash character (``"/"``) and calls the + :class:`~django.contrib.syndication.feeds.Feed` class' + :meth:`get_object()` method, passing it the bits. In this case, bits is + ``['0613']``. For a request to :file:`/rss/beats/0613/foo/bar/`, bits + would be ``['0613', 'foo', 'bar']``. - * ``get_object()`` is responsible for retrieving the given beat, from the - given ``bits``. In this case, it uses the Django database API to retrieve - the beat. Note that ``get_object()`` should raise - ``django.core.exceptions.ObjectDoesNotExist`` if given invalid + * :meth:`get_object()` is responsible for retrieving the given beat, from + the given ``bits``. In this case, it uses the Django database API to + retrieve the beat. Note that :meth:`get_object()` should raise + :exc:`django.core.exceptions.ObjectDoesNotExist` if given invalid parameters. There's no ``try``/``except`` around the ``Beat.objects.get()`` call, because it's not necessary; that function - raises ``Beat.DoesNotExist`` on failure, and ``Beat.DoesNotExist`` is a - subclass of ``ObjectDoesNotExist``. Raising ``ObjectDoesNotExist`` in - ``get_object()`` tells Django to produce a 404 error for that request. + raises :exc:`Beat.DoesNotExist` on failure, and :exc:`Beat.DoesNotExist` + is a subclass of :exc:`ObjectDoesNotExist`. Raising + :exc:`ObjectDoesNotExist` in :meth:`get_object()` tells Django to produce + a 404 error for that request. - **New in Django development version:** The ``get_object()`` method also - has a chance to handle the ``/rss/beats/`` url. In this case, ``bits`` - will be an empty list. In our example, ``len(bits) != 1`` and an - ``ObjectDoesNotExist`` exception will be raised, so ``/rss/beats/`` will - generate a 404 page. But you can handle this case however you like. For - example, you could generate a combined feed for all beats. + **New in Django development version:** The :meth:`get_object()` method + also has a chance to handle the :file:`/rss/beats/` url. In this case, + :data:`bits` will be an empty list. In our example, ``len(bits) != 1`` and + an :exc:`ObjectDoesNotExist` exception will be raised, so + :file:`/rss/beats/` will generate a 404 page. But you can handle this case + however you like. For example, you could generate a combined feed for all + beats. * To generate the feed's ``<title>``, ``<link>`` and ``<description>``, - Django uses the ``title()``, ``link()`` and ``description()`` methods. In - the previous example, they were simple string class attributes, but this - example illustrates that they can be either strings *or* methods. For - each of ``title``, ``link`` and ``description``, Django follows this - algorithm: + Django uses the :meth:`title()`, :meth:`link()` and :meth:`description()` + methods. In the previous example, they were simple string class + attributes, but this example illustrates that they can be either strings + *or* methods. For each of :attr:`title`, :attr:`link` and + :attr:`description`, Django follows this algorithm: - * First, it tries to call a method, passing the ``obj`` argument, - where ``obj`` is the object returned by ``get_object()``. - * Failing that, it tries to call a method with no arguments. - * Failing that, it uses the class attribute. + * First, it tries to call a method, passing the ``obj`` argument, where + ``obj`` is the object returned by :meth:`get_object()`. + + * Failing that, it tries to call a method with no arguments. + + * Failing that, it uses the class attribute. - Inside the ``link()`` method, we handle the possibility that ``obj`` + Inside the :meth:`link()` method, we handle the possibility that ``obj`` might be ``None``, which can occur when the URL isn't fully specified. In some cases, you might want to do something else in this case, which would mean you'd need to check for ``obj`` existing in other methods as well. - (The ``link()`` method is called very early in the feed generation + (The :meth:`link()` method is called very early in the feed generation process, so it's a good place to bail out early.) - * Finally, note that ``items()`` in this example also takes the ``obj`` - argument. The algorithm for ``items`` is the same as described in the - previous step -- first, it tries ``items(obj)``, then ``items()``, then - finally an ``items`` class attribute (which should be a list). + * Finally, note that :meth:`items()` in this example also takes the ``obj`` + argument. The algorithm for :attr:`items` is the same as described in the + previous step -- first, it tries :meth:`items(obj)`, then :meth:`items()`, + then finally an :attr:`items` class attribute (which should be a list). The ``ExampleFeed`` class below gives full documentation on methods and -attributes of ``Feed`` classes. - -.. _DRY principle: http://c2.com/cgi/wiki?DontRepeatYourself +attributes of :class:`~django.contrib.syndication.feeds.Feed` classes. Specifying the type of feed --------------------------- By default, feeds produced in this framework use RSS 2.0. -To change that, add a ``feed_type`` attribute to your ``Feed`` class, like so:: +To change that, add a ``feed_type`` attribute to your +:class:`~django.contrib.syndication.feeds.Feed` class, like so:: from django.utils.feedgenerator import Atom1Feed @@ -297,16 +319,16 @@ Note that you set ``feed_type`` to a class object, not an instance. Currently available feed types are: - * ``django.utils.feedgenerator.Rss201rev2Feed`` (RSS 2.01. Default.) - * ``django.utils.feedgenerator.RssUserland091Feed`` (RSS 0.91.) - * ``django.utils.feedgenerator.Atom1Feed`` (Atom 1.0.) + * :class:`django.utils.feedgenerator.Rss201rev2Feed` (RSS 2.01. Default.) + * :class:`django.utils.feedgenerator.RssUserland091Feed` (RSS 0.91.) + * :class:`django.utils.feedgenerator.Atom1Feed` (Atom 1.0.) Enclosures ---------- To specify enclosures, such as those used in creating podcast feeds, use the -``item_enclosure_url``, ``item_enclosure_length`` and -``item_enclosure_mime_type`` hooks. See the ``ExampleFeed`` class below for +:attr:`item_enclosure_url`, :attr:`item_enclosure_length` and +:attr:`item_enclosure_mime_type` hooks. See the ``ExampleFeed`` class below for usage examples. Language @@ -314,31 +336,28 @@ Language Feeds created by the syndication framework automatically include the appropriate ``<language>`` tag (RSS 2.0) or ``xml:lang`` attribute (Atom). This -comes directly from your `LANGUAGE_CODE setting`_. - -.. _LANGUAGE_CODE setting: ../settings/#language-code +comes directly from your :setting:`LANGUAGE_CODE setting`. URLs ---- -The ``link`` method/attribute can return either an absolute URL (e.g. -``"/blog/"``) or a URL with the fully-qualified domain and protocol (e.g. -``"http://www.example.com/blog/"``). If ``link`` doesn't return the domain, +The :attr:`link` method/attribute can return either an absolute URL (e.g. +:file:`"/blog/"`) or a URL with the fully-qualified domain and protocol (e.g. +``"http://www.example.com/blog/"``). If :attr:`link` doesn't return the domain, the syndication framework will insert the domain of the current site, according -to your `SITE_ID setting`_. +to your :setting:`SITE_ID setting <SITE_ID>`. Atom feeds require a ``<link rel="self">`` that defines the feed's current location. The syndication framework populates this automatically, using the -domain of the current site according to the SITE_ID setting. - -.. _SITE_ID setting: ../settings/#site-id +domain of the current site according to the :setting:`SITE_ID` setting. Publishing Atom and RSS feeds in tandem --------------------------------------- Some developers like to make available both Atom *and* RSS versions of their -feeds. That's easy to do with Django: Just create a subclass of your ``Feed`` -class and set the ``feed_type`` to something different. Then update your +feeds. That's easy to do with Django: Just create a subclass of your +:class:`~django.contrib.syndication.feeds.Feed` +class and set the :attr:`feed_type` to something different. Then update your URLconf to add the extra versions. Here's a full example:: @@ -360,17 +379,18 @@ Here's a full example:: subtitle = RssSiteNewsFeed.description .. Note:: - In this example, the RSS feed uses a ``description`` while the Atom feed - uses a ``subtitle``. That's because Atom feeds don't provide for a - feed-level "description," but they *do* provide for a "subtitle." + In this example, the RSS feed uses a :attr:`description` while the Atom + feed uses a :attr:`subtitle`. That's because Atom feeds don't provide for + a feed-level "description," but they *do* provide for a "subtitle." - If you provide a ``description`` in your ``Feed`` class, Django will *not* - automatically put that into the ``subtitle`` element, because a subtitle - and description are not necessarily the same thing. Instead, you should - define a ``subtitle`` attribute. + If you provide a :attr:`description` in your + :class:`~django.contrib.syndication.feeds.Feed` class, Django will *not* + automatically put that into the :attr:`subtitle` element, because a + subtitle and description are not necessarily the same thing. Instead, you + should define a :attr:`subtitle` attribute. - In the above example, we simply set the Atom feed's ``subtitle`` to the - RSS feed's ``description``, because it's quite short already. + In the above example, we simply set the Atom feed's :attr:`subtitle` to the + RSS feed's :attr:`description`, because it's quite short already. And the accompanying URLconf:: @@ -392,7 +412,10 @@ And the accompanying URLconf:: Feed class reference -------------------- -This example illustrates all possible attributes and methods for a ``Feed`` class:: +.. class:: django.contrib.syndication.feeds.Feed + +This example illustrates all possible attributes and methods for a +:class:`~django.contrib.syndication.feeds.Feed` class:: from django.contrib.syndication.feeds import Feed from django.utils import feedgenerator @@ -808,26 +831,30 @@ also create custom feed generator subclasses for use with the ``feed_type`` ``SyndicationFeed`` classes --------------------------- -The ``feedgenerator`` module contains a base class ``SyndicationFeed`` and -several subclasses: +The :mod:`~django.utils.feedgenerator` module contains a base class: - * ``RssUserland091Feed`` - * ``Rss201rev2Feed`` - * ``Atom1Feed`` +.. class:: django.utils.feedgenerator.SyndicationFeed + +and several subclasses: + +.. class:: django.utils.feedgenerator.RssUserland091Feed +.. class:: django.utils.feedgenerator.Rss201rev2Feed +.. class:: django.utils.feedgenerator.Atom1Feed Each of these three classes knows how to render a certain type of feed as XML. They share this interface: -``SyndicationFeed.__init__(**kwargs)`` +.. method:: SyndicationFeed.__init__(**kwargs) + Initialize the feed with the given dictionary of metadata, which applies to the entire feed. Required keyword arguments are: * ``title`` * ``link`` * ``description`` - - There's also a bunch of other optional keywords: + There's also a bunch of other optional keywords: + * ``language`` * ``author_email`` * ``author_name`` @@ -838,18 +865,19 @@ They share this interface: * ``feed_copyright`` * ``feed_guid`` * ``ttl`` - + Any extra keyword arguments you pass to ``__init__`` will be stored in ``self.feed`` for use with `custom feed generators`_. All parameters should be Unicode objects, except ``categories``, which should be a sequence of Unicode objects. -``SyndicationFeed.add_item(**kwargs)`` +.. method:: SyndicationFeed.add_item(**kwargs) + Add an item to the feed with the given parameters. Required keyword arguments are: - + * ``title`` * ``link`` * ``description`` @@ -873,14 +901,15 @@ They share this interface: * ``pubdate`` should be a `Python datetime object`_. * ``enclosure`` should be an instance of ``feedgenerator.Enclosure``. - * ``categories`` should be a sequence of Unicode objects. - -``SyndicationFeed.write(outfile, encoding)`` - Outputs the feed in the given ``encoding`` to ``outfile``, which must be a - file-like object. + * ``categories`` should be a sequence of Unicode objects. -``SyndicationFeed.writeString(encoding)`` - Returns the feed as a string in the given ``encoding``. +.. method:: SyndicationFeed.write(outfile, encoding) + + Outputs the feed in the given encoding to outfile, which is a file-like object. + +.. method:: SyndicationFeed.writeString(encoding) + + Returns the feed as a string in the given encoding. For example, to create an Atom 1.0 feed and print it to standard output:: diff --git a/docs/webdesign.txt b/docs/ref/contrib/webdesign.txt similarity index 74% rename from docs/webdesign.txt rename to docs/ref/contrib/webdesign.txt index 8e6eae89dd..e69ad49232 100644 --- a/docs/webdesign.txt +++ b/docs/ref/contrib/webdesign.txt @@ -1,22 +1,27 @@ +.. _ref-contrib-webdesign: + ======================== django.contrib.webdesign ======================== -The ``django.contrib.webdesign`` package, part of the `"django.contrib" add-ons`_, -provides various Django helpers that are particularly useful to Web *designers* -(as opposed to developers). +.. module:: django.contrib.webdesign + :synopsis: Helpers and utilities targeted primarily at Web *designers* + rather than Web *developers*. + +The ``django.contrib.webdesign`` package, part of the +:ref:`"django.contrib" add-ons <ref-contrib-index>`, provides various Django +helpers that are particularly useful to Web *designers* (as opposed to +developers). At present, the package contains only a single template tag. If you have ideas -for Web-designer-friendly functionality in Django, please `suggest them`_. - -.. _"django.contrib" add-ons: ../add_ons/ -.. _suggest them: ../contributing/ +for Web-designer-friendly functionality in Django, please +:ref:`suggest them <internals-contributing>`. Template tags ============= To use these template tags, add ``'django.contrib.webdesign'`` to your -``INSTALLED_APPS`` setting. Once you've done that, use +:setting:`INSTALLED_APPS` setting. Once you've done that, use ``{% load webdesign %}`` in a template to give your template access to the tags. diff --git a/docs/databases.txt b/docs/ref/databases.txt similarity index 91% rename from docs/databases.txt rename to docs/ref/databases.txt index 0fb6381c5c..c3c079b01d 100644 --- a/docs/databases.txt +++ b/docs/ref/databases.txt @@ -1,3 +1,5 @@ +.. _ref-databases: + =============================== Notes about supported databases =============================== @@ -100,14 +102,15 @@ This ensures all tables and columns will use UTF-8 by default. Connecting to the database -------------------------- -Refer to the `settings documentation`_. +Refer to the :ref:`settings documentation <ref-settings>`. Connection settings are used in this order: - 1. ``DATABASE_OPTIONS`` - 2. ``DATABASE_NAME``, ``DATABASE_USER``, ``DATABASE_PASSWORD``, ``DATABASE_HOST``, - ``DATABASE_PORT`` - 3. MySQL option files. + 1. :setting:`DATABASE_OPTIONS`. + 2. :setting:`DATABASE_NAME`, :setting:`DATABASE_USER`, + :setting:`DATABASE_PASSWORD`, :setting:`DATABASE_HOST`, + :setting:`DATABASE_PORT` + 3. MySQL option files. In other words, if you set the name of the database in ``DATABASE_OPTIONS``, this will take precedence over ``DATABASE_NAME``, which would override @@ -132,7 +135,6 @@ Several other MySQLdb connection options may be useful, such as ``ssl``, ``use_unicode``, ``init_command``, and ``sql_mode``. Consult the `MySQLdb documentation`_ for more details. -.. _settings documentation: ../settings/#database-engine .. _MySQL option file: http://dev.mysql.com/doc/refman/5.0/en/option-files.html .. _MySQLdb documentation: http://mysql-python.sourceforge.net/ @@ -172,6 +174,8 @@ storage engine, you have a couple of options. .. _AlterModelOnSyncDB: http://code.djangoproject.com/wiki/AlterModelOnSyncDB +.. _oracle-notes: + Oracle notes ============ @@ -185,18 +189,18 @@ operators. You will also need the `cx_Oracle`_ driver, version 4.3.1 or newer. In order for the ``python manage.py syncdb`` command to work, your Oracle database user must have privileges to run the following commands: - * CREATE TABLE - * CREATE SEQUENCE - * CREATE PROCEDURE - * CREATE TRIGGER - + * CREATE TABLE + * CREATE SEQUENCE + * CREATE PROCEDURE + * CREATE TRIGGER + To run Django's test suite, the user needs these *additional* privileges: - * CREATE USER - * DROP USER - * CREATE TABLESPACE - * DROP TABLESPACE - + * CREATE USER + * DROP USER + * CREATE TABLESPACE + * DROP TABLESPACE + Connecting to the database -------------------------- @@ -210,8 +214,8 @@ Your Django settings.py file should look something like this for Oracle:: DATABASE_PORT = '' If you don't use a ``tnsnames.ora`` file or a similar naming method that -recognizes the SID ("xe" in this example), then fill in both ``DATABASE_HOST`` -and ``DATABASE_PORT`` like so:: +recognizes the SID ("xe" in this example), then fill in both +:setting:`DATABASE_HOST` and :setting:`DATABASE_PORT` like so:: DATABASE_ENGINE = 'oracle' DATABASE_NAME = 'xe' @@ -220,7 +224,7 @@ and ``DATABASE_PORT`` like so:: DATABASE_HOST = 'dbprod01ned.mycompany.com' DATABASE_PORT = '1540' -You should supply both ``DATABASE_HOST`` and ``DATABASE_PORT``, or leave both +You should supply both :setting:`DATABASE_HOST` and :setting:`DATABASE_PORT`, or leave both as empty strings. Tablespace options @@ -239,9 +243,7 @@ supplying the ``db_tablespace`` option inside the model's ``class Meta``. Additionally, you can pass the ``db_tablespace`` option to a ``Field`` constructor to specify an alternate tablespace for the ``Field``'s column index. If no index would be created for the column, the ``db_tablespace`` -option is ignored. - -:: +option is ignored:: class TablespaceExample(models.Model): name = models.CharField(max_length=30, db_index=True, db_tablespace="indexes") @@ -258,9 +260,9 @@ many-to-many table would be stored in the ``indexes`` tablespace. The ``data`` field would also generate an index, but no tablespace for it is specified, so it would be stored in the model tablespace ``tables`` by default. -**New in the Django development version:** Use the ``DEFAULT_TABLESPACE`` and -``DEFAULT_INDEX_TABLESPACE`` settings to specify default values for the -db_tablespace options. These are useful for setting a tablespace for the +**New in the Django development version:** Use the :setting:`DEFAULT_TABLESPACE` +and :setting:`DEFAULT_INDEX_TABLESPACE` settings to specify default values for +the db_tablespace options. These are useful for setting a tablespace for the built-in Django apps and other applications whose code you cannot control. Django does not create the tablespaces for you. Please refer to `Oracle's diff --git a/docs/django-admin.txt b/docs/ref/django-admin.txt similarity index 85% rename from docs/django-admin.txt rename to docs/ref/django-admin.txt index f827a7243b..d6cb4e62f3 100644 --- a/docs/django-admin.txt +++ b/docs/ref/django-admin.txt @@ -1,3 +1,5 @@ +.. _ref-django-admin: + ============================= django-admin.py and manage.py ============================= @@ -11,18 +13,18 @@ two things for you before delegating to ``django-admin.py``: * It puts your project's package on ``sys.path``. - * It sets the ``DJANGO_SETTINGS_MODULE`` environment variable so that it - points to your project's ``settings.py`` file. + * It sets the :envvar:`DJANGO_SETTINGS_MODULE` environment variable so that + it points to your project's ``settings.py`` file. The ``django-admin.py`` script should be on your system path if you installed -Django via its ``setup.py`` utility. If it's not on your path, you can find it in -``site-packages/django/bin`` within your Python installation. Consider +Django via its ``setup.py`` utility. If it's not on your path, you can find it +in ``site-packages/django/bin`` within your Python installation. Consider symlinking it from some place on your path, such as ``/usr/local/bin``. -For Windows users, who do not have symlinking functionality available, you -can copy ``django-admin.py`` to a location on your existing path or edit the -``PATH`` settings (under ``Settings - Control Panel - System - Advanced - Environment...``) -to point to its installed location. +For Windows users, who do not have symlinking functionality available, you can +copy ``django-admin.py`` to a location on your existing path or edit the +``PATH`` settings (under ``Settings - Control Panel - System - Advanced - +Environment...``) to point to its installed location. Generally, when working on a single Django project, it's easier to use ``manage.py``. Use ``django-admin.py`` with ``DJANGO_SETTINGS_MODULE``, or the @@ -35,9 +37,10 @@ be consistent, but any example can use ``manage.py`` just as well. Usage ===== -``django-admin.py <subcommand> [options]`` +.. code-block:: bash -``manage.py <subcommand> [options]`` + django-admin.py <subcommand> [options] + manage.py <subcommand> [options] ``subcommand`` should be one of the subcommands listed in this document. ``options``, which is optional, should be zero or more of the options available @@ -46,6 +49,8 @@ for the given subcommand. Getting runtime help -------------------- +.. django-admin-option:: --help + In Django 0.96, run ``django-admin.py --help`` to display a help message that includes a terse list of all available subcommands and options. @@ -64,26 +69,42 @@ contains the string ``'mysite.blog'``, the app name is ``blog``. Determining the version ----------------------- +.. django-admin-option:: --version + Run ``django-admin.py --version`` to display the current Django version. Examples of output:: - 0.95 + 0.95 0.96 0.97-pre-SVN-6069 +Displaying debug output +----------------------- + +.. django-admin-option:: --verbosity <amount> + +Use ``--verbosity`` to specify the amount of notification and debug information +that ``django-admin.py`` should print to the console. + + * ``0`` means no output. + * ``1`` means normal output (default). + * ``2`` means verbose output. + + Available subcommands ===================== -adminindex <appname appname ...> --------------------------------- +adminindex +---------- + +.. django-admin:: adminindex <appname appname ...> Prints the admin-index template snippet for the given app name(s). Use admin-index template snippets if you want to customize the look and feel of -your admin's index page. See `Tutorial 2`_ for more information. - -.. _Tutorial 2: ../tutorial02/ +your admin's index page. See :ref:`Tutorial 2 <intro-tutorial02>` for more +information. cleanup ------- @@ -99,7 +120,7 @@ compilemessages **New in Django development version** Compiles .po files created with ``makemessages`` to .mo files for use with -the builtin gettext support. See the `i18n documentation`_ for details. +the builtin gettext support. See :ref:`topics-i18n`. --locale ~~~~~~~~ @@ -111,17 +132,19 @@ Example usage:: django-admin.py compilemessages --locale=br_PT -createcachetable <tablename> ----------------------------- +createcachetable +---------------- + +.. django-admin:: createcachetable <tablename> Creates a cache table named ``tablename`` for use with the database cache -backend. See the `cache documentation`_ for more information. - -.. _cache documentation: ../cache/ +backend. See :ref:`topics-cache` for more information. createsuperuser --------------- +.. django-admin:: createsuperuser + **New in Django development version** Creates a superuser account (a user who has all permissions). This is @@ -134,19 +157,22 @@ the new superuser account. When run non-interactively, no password will be set, and the superuser account will not be able to log in until a password has been manually set for it. +.. django-admin-option:: --username +.. django-admin-option:: --email + The username and e-mail address for the new account can be supplied by using the ``--username`` and ``--email`` arguments on the command line. If either of those is not supplied, ``createsuperuser`` will prompt for it when running interactively. -This command is only available if Django's `authentication system`_ -(``django.contrib.auth``) is installed. - -.. _authentication system: ../authentication/ +This command is only available if Django's :ref:`authentication system +<topics-auth>` (``django.contrib.auth``) is installed. dbshell ------- +.. django-admin:: dbshell + Runs the command-line client for the database engine specified in your ``DATABASE_ENGINE`` setting, with the connection parameters specified in your ``DATABASE_USER``, ``DATABASE_PASSWORD``, etc., settings. @@ -163,8 +189,10 @@ manually. diffsettings ------------ +.. django-admin:: diffsettings + Displays differences between the current settings file and Django's default -settings. +settings. Settings that don't appear in the defaults are followed by ``"###"``. For example, the default settings don't define ``ROOT_URLCONF``, so @@ -173,8 +201,10 @@ example, the default settings don't define ``ROOT_URLCONF``, so Note that Django's default settings live in ``django/conf/global_settings.py``, if you're ever curious to see the full list of defaults. -dumpdata <appname appname ...> ------------------------------- +dumpdata +-------- + +.. django-admin:: dumpdata <appname appname ...> Outputs to standard output all data in the database associated with the named application(s). @@ -184,14 +214,11 @@ If no application name is provided, all installed applications will be dumped. The output of ``dumpdata`` can be used as input for ``loaddata``. Note that ``dumpdata`` uses the default manager on the model for selecting the -records to dump. If you're using a `custom manager`_ as the default manager -and it filters some of the available records, not all of the objects will be -dumped. +records to dump. If you're using a :ref:`custom manager <custom-managers>` as +the default manager and it filters some of the available records, not all of the +objects will be dumped. -.. _custom manager: ../model-api/#custom-managers - ---exclude -~~~~~~~~~ +.. django-admin-option:: --exclude **New in Django development version** @@ -199,40 +226,31 @@ Exclude a specific application from the applications whose contents is output. For example, to specifically exclude the `auth` application from the output, you would call:: - django-admin.py dumpdata --exclude=auth + django-admin.py dumpdata --exclude=auth If you want to exclude multiple applications, use multiple ``--exclude`` directives:: - django-admin.py dumpdata --exclude=auth --exclude=contenttype + django-admin.py dumpdata --exclude=auth --exclude=contenttype ---format -~~~~~~~~ -By default, ``dumpdata`` will format its output in JSON, but you can use the -``--format`` option to specify another format. Currently supported formats are -listed in `Serialization formats`_. +.. django-admin-option:: --format <fmt> -Example usage:: + By default, ``dumpdata`` will format its output in JSON, but you can use the + ``--format`` option to specify another format. Currently supported formats + are listed in :ref:`serialization-formats`. - django-admin.py dumpdata --format=xml +.. django-admin-option:: --indent <num> -.. _Serialization formats: ../serialization/#serialization-formats - ---indent -~~~~~~~~ - -By default, ``dumpdata`` will output all data on a single line. This isn't easy -for humans to read, so you can use the ``--indent`` option to pretty-print the -output with a number of indentation spaces. - -Example usage:: - - django-admin.py dumpdata --indent=4 + By default, ``dumpdata`` will output all data on a single line. This isn't + easy for humans to read, so you can use the ``--indent`` option to + pretty-print the output with a number of indentation spaces. flush ----- +.. django-admin: flush + Returns the database to the state it was in immediately after syncdb was executed. This means that all data will be removed from the database, any post-synchronization handlers will be re-executed, and the ``initial_data`` @@ -245,26 +263,11 @@ models and/or weren't in ``INSTALLED_APPS``). Now, the command only clears tables that are represented by Django models and are activated in ``INSTALLED_APPS``. ---noinput -~~~~~~~~~ +.. django-admin-option:: --noinput -Use the ``--noinput`` option to suppress all user prompting, such as -"Are you sure?" confirmation messages. This is useful if ``django-admin.py`` -is being executed as an unattended, automated script. - ---verbosity -~~~~~~~~~~~ - -Use ``--verbosity`` to specify the amount of notification and debug information -that ``django-admin.py`` should print to the console. - - * ``0`` means no output. - * ``1`` means normal output (default). - * ``2`` means verbose output. - -Example usage:: - - django-admin.py flush --verbosity=2 + Use the ``--noinput`` option to suppress all user prompting, such as "Are + you sure?" confirmation messages. This is useful if ``django-admin.py`` is + being executed as an unattended, automated script. inspectdb --------- @@ -395,12 +398,10 @@ makemessages Runs over the entire source tree of the current directory and pulls out all strings marked for translation. It creates (or updates) a message file in the -conf/locale (in the Django tree) or locale (for project and application) +conf/locale (in the django tree) or locale (for project and application) directory. After making changes to the messages files you need to compile them with ``compilemessages`` for use with the builtin gettext support. See the -`i18n documentation`_ for details. - -.. _i18n documentation: ../i18n/#how-to-create-language-files +:ref:`i18n documentation <how-to-create-language-files>` for details. --all ~~~~~ @@ -473,12 +474,11 @@ is being executed as an unattended, automated script. runfcgi [options] ----------------- -Starts a set of FastCGI processes suitable for use with any Web server -that supports the FastCGI protocol. See the `FastCGI deployment -documentation`_ for details. Requires the Python FastCGI module from +Starts a set of FastCGI processes suitable for use with any Web server that +supports the FastCGI protocol. See the :ref:`FastCGI deployment documentation +<howto-deployment-fastcgi>` for details. Requires the Python FastCGI module from `flup`_. -.. _FastCGI deployment documentation: ../fastcgi/ .. _flup: http://www.saddi.com/software/flup/ runserver [optional port number, or ipaddr:port] @@ -562,10 +562,15 @@ Serving static files with the development server By default, the development server doesn't serve any static files for your site (such as CSS files, images, things under ``MEDIA_URL`` and so forth). If -you want to configure Django to serve static media, read the `serving static files`_ -documentation. +you want to configure Django to serve static media, read :ref:`howto-static-files`. -.. _serving static files: ../static_files/ +Turning off auto-reload +~~~~~~~~~~~~~~~~~~~~~~~ + +To disable auto-reloading of code while the development server is running, use the +``--noreload`` option, like so:: + + django-admin.py runserver --noreload shell ----- @@ -707,10 +712,8 @@ is being executed as an unattended, automated script. test ---- -Runs tests for all installed models. See `Testing Django applications`_ -for more information. - -.. _testing Django applications: ../testing/ +Runs tests for all installed models. See :ref:`topics-testing` for more +information. --noinput ~~~~~~~~~ @@ -747,7 +750,7 @@ For example, this command:: ...would perform the following steps: - 1. Create a test database, as described in `testing Django applications`_. + 1. Create a test database, as described in :ref:`topics-testing`. 2. Populate the test database with fixture data from the given fixtures. (For more on fixtures, see the documentation for ``loaddata`` above.) 3. Runs the Django development server (as in ``runserver``), pointed at @@ -755,9 +758,9 @@ For example, this command:: This is useful in a number of ways: - * When you're writing `unit tests`_ of how your views act with certain - fixture data, you can use ``testserver`` to interact with the views in - a Web browser, manually. + * When you're writing :ref:`unit tests <topics-testing>` of how your views + act with certain fixture data, you can use ``testserver`` to interact with + the views in a Web browser, manually. * Let's say you're developing your Django application and have a "pristine" copy of a database that you'd like to interact with. You can dump your @@ -771,8 +774,6 @@ Note that this server does *not* automatically detect changes to your Python source code (as ``runserver`` does). It does, however, detect changes to templates. -.. _unit tests: ../testing/ - --addrport [port number or ipaddr:port] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -887,34 +888,6 @@ distribution. It enables tab-completion of ``django-admin.py`` and * Type ``sql``, then [TAB], to see all available options whose names start with ``sql``. -Customized actions -================== -**New in Django development version** -Applications can register their own actions with ``manage.py``. For example, -you might want to add a ``manage.py`` action for a Django app that you're -distributing. - -To do this, just add a ``management/commands`` directory to your application. -Each Python module in that directory will be auto-discovered and registered as -a command that can be executed as an action when you run ``manage.py``:: - - blog/ - __init__.py - models.py - management/ - __init__.py - commands/ - __init__.py - explode.py - views.py - -In this example, the ``explode`` command will be made available to any project -that includes the ``blog`` application in ``settings.INSTALLED_APPS``. - -The ``explode.py`` module has only one requirement -- it must define a class -called ``Command`` that extends ``django.core.management.base.BaseCommand``. - -For more details on how to define your own commands, look at the code for the -existing ``django-admin.py`` commands, in ``/django/core/management/commands``. +See :ref:`howto-custom-management-commands` for how to add customized actions. diff --git a/docs/ref/files/file.txt b/docs/ref/files/file.txt new file mode 100644 index 0000000000..bc59311792 --- /dev/null +++ b/docs/ref/files/file.txt @@ -0,0 +1,117 @@ +.. _ref-files-file: + +The ``File`` object +=================== + +.. currentmodule:: django.core.files + +.. class:: File(file_object) + +``File`` attributes and methods +------------------------------- + +Django's ``File`` has the following attributes and methods: + +``File.path`` +~~~~~~~~~~~~~ + +The absolute path to the file's location on a local filesystem. + +:ref:`Custom file storage systems <howto-custom-file-storage>` may not store +files locally; files stored on these systems will have a ``path`` of ``None``. + +``File.url`` +~~~~~~~~~~~~ + +The URL where the file can be retrieved. This is often useful in :ref:`templates +<topics-templates>`; for example, a bit of a template for displaying a ``Car`` +(see above) might look like:: + + <img src='{{ car.photo.url }}' alt='{{ car.name }}' /> + +``File.size`` +~~~~~~~~~~~~~ + +The size of the file in bytes. + +``File.open(mode=None)`` +~~~~~~~~~~~~~~~~~~~~~~~~ + +Open or reopen the file (which by definition also does ``File.seek(0)``). The +``mode`` argument allows the same values as Python's standard ``open()``. + +When reopening a file, ``mode`` will override whatever mode the file was +originally opened with; ``None`` means to reopen with the original mode. + +``File.read(num_bytes=None)`` +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Read content from the file. The optional ``size`` is the number of bytes to +read; if not specified, the file will be read to the end. + +``File.__iter__()`` +~~~~~~~~~~~~~~~~~~~ + +Iterate over the file yielding one line at a time. + +``File.chunks(chunk_size=None)`` +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Iterate over the file yielding "chunks" of a given size. ``chunk_size`` defaults +to 64 KB. + +This is especially useful with very large files since it allows them to be +streamed off disk and avoids storing the whole file in memory. + +``File.multiple_chunks(chunk_size=None)`` +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Returns ``True`` if the file is large enough to require multiple chunks to +access all of its content give some ``chunk_size``. + +``File.write(content)`` +~~~~~~~~~~~~~~~~~~~~~~~ + +Writes the specified content string to the file. Depending on the storage system +behind the scenes, this content might not be fully committed until ``close()`` +is called on the file. + +``File.close()`` +~~~~~~~~~~~~~~~~ + +Close the file. + +Additional ``ImageField`` attributes +------------------------------------ + +``File.width`` and ``File.height`` +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +These attributes provide the dimensions of the image. + +Additional methods on files attached to objects +----------------------------------------------- + +Any ``File`` that's associated with an object (as with ``Car.photo``, above) +will also have a couple of extra methods: + +``File.save(name, content, save=True)`` +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Saves a new file with the file name and contents provided. This will not replace +the existing file, but will create a new file and update the object to point to +it. If ``save`` is ``True``, the model's ``save()`` method will be called once +the file is saved. That is, these two lines:: + + >>> car.photo.save('myphoto.jpg', contents, save=False) + >>> car.save() + +are the same as this one line:: + + >>> car.photo.save('myphoto.jpg', contents, save=True) + +``File.delete(save=True)`` +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Remove the file from the model instance and delete the underlying file. The +``save`` argument works as above. diff --git a/docs/ref/files/index.txt b/docs/ref/files/index.txt new file mode 100644 index 0000000000..bdc327b2d7 --- /dev/null +++ b/docs/ref/files/index.txt @@ -0,0 +1,13 @@ +.. _ref-files-index: + +File handling reference +======================= + +.. module:: django.core.files + :synopsis: File handling and storage + +.. toctree:: + :maxdepth: 1 + + file + storage \ No newline at end of file diff --git a/docs/ref/files/storage.txt b/docs/ref/files/storage.txt new file mode 100644 index 0000000000..a09cd2f86d --- /dev/null +++ b/docs/ref/files/storage.txt @@ -0,0 +1,50 @@ +.. _ref-files-storage: + +File storage API +================ + +``Storage.exists(name)`` +~~~~~~~~~~~~~~~~~~~~~~~~ + +``True`` if a file exists given some ``name``. + +``Storage.path(name)`` +~~~~~~~~~~~~~~~~~~~~~~ + +The local filesystem path where the file can be opened using Python's standard +``open()``. For storage systems that aren't accessible from the local +filesystem, this will raise ``NotImplementedError`` instead. + +``Storage.size(name)`` +~~~~~~~~~~~~~~~~~~~~~~ + +Returns the total size, in bytes, of the file referenced by ``name``. + +``Storage.url(name)`` +~~~~~~~~~~~~~~~~~~~~~ + +Returns the URL where the contents of the file referenced by ``name`` can be +accessed. + +``Storage.open(name, mode='rb')`` +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Opens the file given by ``name``. Note that although the returned file is +guaranteed to be a ``File`` object, it might actually be some subclass. In the +case of remote file storage this means that reading/writing could be quite slow, +so be warned. + +``Storage.save(name, content)`` +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Saves a new file using the storage system, preferably with the name specified. +If there already exists a file with this name ``name``, the storage system may +modify the filename as necessary to get a unique name. The actual name of the +stored file will be returned. + +``Storage.delete(name)`` +~~~~~~~~~~~~~~~~~~~~~~~~ + +Deletes the file referenced by ``name``. This method won't raise an exception if +the file doesn't exist. + diff --git a/docs/ref/forms/api.txt b/docs/ref/forms/api.txt new file mode 100644 index 0000000000..f8d8a9940a --- /dev/null +++ b/docs/ref/forms/api.txt @@ -0,0 +1,688 @@ +.. _ref-forms-api: + +============= +The Forms API +============= + +.. currentmodule:: django.forms + +.. admonition:: About this document + + This document covers the gritty details of Django's forms API. You should + read the :ref:`introduction to working with forms <topics-forms-index>` + first. + +.. _ref-forms-api-bound-unbound: + +Bound and unbound forms +----------------------- + +A :class:`Form` instance is either **bound** to a set of data, or **unbound**. + + * If it's **bound** to a set of data, it's capable of validating that data + and rendering the form as HTML with the data displayed in the HTML. + + * If it's **unbound**, it cannot do validation (because there's no data to + validate!), but it can still render the blank form as HTML. + +To create an unbound :class:`Form` instance, simply instantiate the class:: + + >>> f = ContactForm() + +To bind data to a form, pass the data as a dictionary as the first parameter to +your :class:`Form` class constructor:: + + >>> data = {'subject': 'hello', + ... 'message': 'Hi there', + ... 'sender': 'foo@example.com', + ... 'cc_myself': True} + >>> f = ContactForm(data) + +In this dictionary, the keys are the field names, which correspond to the +attributes in your :class:`Form` class. The values are the data you're trying to +validate. These will usually be strings, but there's no requirement that they be +strings; the type of data you pass depends on the :class:`Field`, as we'll see +in a moment. + +.. attribute:: Form.is_bound + +If you need to distinguish between bound and unbound form instances at runtime, +check the value of the form's :attr:`~Form.is_bound` attribute:: + + >>> f = ContactForm() + >>> f.is_bound + False + >>> f = ContactForm({'subject': 'hello'}) + >>> f.is_bound + True + +Note that passing an empty dictionary creates a *bound* form with empty data:: + + >>> f = ContactForm({}) + >>> f.is_bound + True + +If you have a bound :class:`Form` instance and want to change the data somehow, +or if you want to bind an unbound :class:`Form` instance to some data, create +another :class:`Form` instance. There is no way to change data in a +:class:`Form` instance. Once a :class:`Form` instance has been created, you +should consider its data immutable, whether it has data or not. + +Using forms to validate data +---------------------------- + +.. method:: Form.is_valid() + +The primary task of a :class:`Form` object is to validate data. With a bound +:class:`Form` instance, call the :meth:`~Form.is_valid` method to run validation +and return a boolean designating whether the data was valid:: + + >>> data = {'subject': 'hello', + ... 'message': 'Hi there', + ... 'sender': 'foo@example.com', + ... 'cc_myself': True} + >>> f = ContactForm(data) + >>> f.is_valid() + True + +Let's try with some invalid data. In this case, ``subject`` is blank (an error, +because all fields are required by default) and ``sender`` is not a valid +e-mail address:: + + >>> data = {'subject': '', + ... 'message': 'Hi there', + ... 'sender': 'invalid e-mail address', + ... 'cc_myself': True} + >>> f = ContactForm(data) + >>> f.is_valid() + False + +.. attribute:: Form.errors + +Access the :attr:`~Form.errors` attribute to get a dictionary of error +messages:: + + >>> f.errors + {'sender': [u'Enter a valid e-mail address.'], 'subject': [u'This field is required.']} + +In this dictionary, the keys are the field names, and the values are lists of +Unicode strings representing the error messages. The error messages are stored +in lists because a field can have multiple error messages. + +You can access :attr:`~Form.errors` without having to call +:meth:`~Form.is_valid` first. The form's data will be validated the first time +either you call :meth:`~Form.is_valid` or access :attr:`~Form.errors`. + +The validation routines will only get called once, regardless of how many times +you access :attr:`~Form.errors` or call :meth:`~Form.is_valid`. This means that +if validation has side effects, those side effects will only be triggered once. + +Behavior of unbound forms +~~~~~~~~~~~~~~~~~~~~~~~~~ + +It's meaningless to validate a form with no data, but, for the record, here's +what happens with unbound forms:: + + >>> f = ContactForm() + >>> f.is_valid() + False + >>> f.errors + {} + +Accessing "clean" data +---------------------- + +Each ``Field`` in a ``Form`` class is responsible not only for validating data, +but also for "cleaning" it -- normalizing it to a consistent format. This is a +nice feature, because it allows data for a particular field to be input in +a variety of ways, always resulting in consistent output. + +For example, ``DateField`` normalizes input into a Python ``datetime.date`` +object. Regardless of whether you pass it a string in the format +``'1994-07-15'``, a ``datetime.date`` object or a number of other formats, +``DateField`` will always normalize it to a ``datetime.date`` object as long as +it's valid. + +Once you've created a ``Form`` instance with a set of data and validated it, +you can access the clean data via the ``cleaned_data`` attribute of the ``Form`` +object:: + + >>> data = {'subject': 'hello', + ... 'message': 'Hi there', + ... 'sender': 'foo@example.com', + ... 'cc_myself': True} + >>> f = ContactForm(data) + >>> f.is_valid() + True + >>> f.cleaned_data + {'cc_myself': True, 'message': u'Hi there', 'sender': u'foo@example.com', 'subject': u'hello'} + +.. note:: + **New in Django development version** The ``cleaned_data`` attribute was + called ``clean_data`` in earlier releases. + +Note that any text-based field -- such as ``CharField`` or ``EmailField`` -- +always cleans the input into a Unicode string. We'll cover the encoding +implications later in this document. + +If your data does *not* validate, your ``Form`` instance will not have a +``cleaned_data`` attribute:: + + >>> data = {'subject': '', + ... 'message': 'Hi there', + ... 'sender': 'invalid e-mail address', + ... 'cc_myself': True} + >>> f = ContactForm(data) + >>> f.is_valid() + False + >>> f.cleaned_data + Traceback (most recent call last): + ... + AttributeError: 'ContactForm' object has no attribute 'cleaned_data' + +``cleaned_data`` will always *only* contain a key for fields defined in the +``Form``, even if you pass extra data when you define the ``Form``. In this +example, we pass a bunch of extra fields to the ``ContactForm`` constructor, +but ``cleaned_data`` contains only the form's fields:: + + >>> data = {'subject': 'hello', + ... 'message': 'Hi there', + ... 'sender': 'foo@example.com', + ... 'cc_myself': True, + ... 'extra_field_1': 'foo', + ... 'extra_field_2': 'bar', + ... 'extra_field_3': 'baz'} + >>> f = ContactForm(data) + >>> f.is_valid() + True + >>> f.cleaned_data # Doesn't contain extra_field_1, etc. + {'cc_myself': True, 'message': u'Hi there', 'sender': u'foo@example.com', 'subject': u'hello'} + +``cleaned_data`` will include a key and value for *all* fields defined in the +``Form``, even if the data didn't include a value for fields that are not +required. In this example, the data dictionary doesn't include a value for the +``nick_name`` field, but ``cleaned_data`` includes it, with an empty value:: + + >>> class OptionalPersonForm(Form): + ... first_name = CharField() + ... last_name = CharField() + ... nick_name = CharField(required=False) + >>> data = {'first_name': u'John', 'last_name': u'Lennon'} + >>> f = OptionalPersonForm(data) + >>> f.is_valid() + True + >>> f.cleaned_data + {'nick_name': u'', 'first_name': u'John', 'last_name': u'Lennon'} + +In this above example, the ``cleaned_data`` value for ``nick_name`` is set to an +empty string, because ``nick_name`` is ``CharField``, and ``CharField``\s treat +empty values as an empty string. Each field type knows what its "blank" value +is -- e.g., for ``DateField``, it's ``None`` instead of the empty string. For +full details on each field's behavior in this case, see the "Empty value" note +for each field in the "Built-in ``Field`` classes" section below. + +You can write code to perform validation for particular form fields (based on +their name) or for the form as a whole (considering combinations of various +fields). More information about this is in :ref:`ref-forms-validation`. + +Outputting forms as HTML +------------------------ + +The second task of a ``Form`` object is to render itself as HTML. To do so, +simply ``print`` it:: + + >>> f = ContactForm() + >>> print f + <tr><th><label for="id_subject">Subject:</label></th><td><input id="id_subject" type="text" name="subject" maxlength="100" /></td></tr> + <tr><th><label for="id_message">Message:</label></th><td><input type="text" name="message" id="id_message" /></td></tr> + <tr><th><label for="id_sender">Sender:</label></th><td><input type="text" name="sender" id="id_sender" /></td></tr> + <tr><th><label for="id_cc_myself">Cc myself:</label></th><td><input type="checkbox" name="cc_myself" id="id_cc_myself" /></td></tr> + +If the form is bound to data, the HTML output will include that data +appropriately. For example, if a field is represented by an +``<input type="text">``, the data will be in the ``value`` attribute. If a +field is represented by an ``<input type="checkbox">``, then that HTML will +include ``checked="checked"`` if appropriate:: + + >>> data = {'subject': 'hello', + ... 'message': 'Hi there', + ... 'sender': 'foo@example.com', + ... 'cc_myself': True} + >>> f = ContactForm(data) + >>> print f + <tr><th><label for="id_subject">Subject:</label></th><td><input id="id_subject" type="text" name="subject" maxlength="100" value="hello" /></td></tr> + <tr><th><label for="id_message">Message:</label></th><td><input type="text" name="message" id="id_message" value="Hi there" /></td></tr> + <tr><th><label for="id_sender">Sender:</label></th><td><input type="text" name="sender" id="id_sender" value="foo@example.com" /></td></tr> + <tr><th><label for="id_cc_myself">Cc myself:</label></th><td><input type="checkbox" name="cc_myself" id="id_cc_myself" checked="checked" /></td></tr> + +This default output is a two-column HTML table, with a ``<tr>`` for each field. +Notice the following: + + * For flexibility, the output does *not* include the ``<table>`` and + ``</table>`` tags, nor does it include the ``<form>`` and ``</form>`` + tags or an ``<input type="submit">`` tag. It's your job to do that. + + * Each field type has a default HTML representation. ``CharField`` and + ``EmailField`` are represented by an ``<input type="text">``. + ``BooleanField`` is represented by an ``<input type="checkbox">``. Note + these are merely sensible defaults; you can specify which HTML to use for + a given field by using widgets, which we'll explain shortly. + + * The HTML ``name`` for each tag is taken directly from its attribute name + in the ``ContactForm`` class. + + * The text label for each field -- e.g. ``'Subject:'``, ``'Message:'`` and + ``'Cc myself:'`` is generated from the field name by converting all + underscores to spaces and upper-casing the first letter. Again, note + these are merely sensible defaults; you can also specify labels manually. + + * Each text label is surrounded in an HTML ``<label>`` tag, which points + to the appropriate form field via its ``id``. Its ``id``, in turn, is + generated by prepending ``'id_'`` to the field name. The ``id`` + attributes and ``<label>`` tags are included in the output by default, to + follow best practices, but you can change that behavior. + +Although ``<table>`` output is the default output style when you ``print`` a +form, other output styles are available. Each style is available as a method on +a form object, and each rendering method returns a Unicode object. + +``as_p()`` +~~~~~~~~~~ + +``Form.as_p()`` renders the form as a series of ``<p>`` tags, with each ``<p>`` +containing one field:: + + >>> f = ContactForm() + >>> f.as_p() + u'<p><label for="id_subject">Subject:</label> <input id="id_subject" type="text" name="subject" maxlength="100" /></p>\n<p><label for="id_message">Message:</label> <input type="text" name="message" id="id_message" /></p>\n<p><label for="id_sender">Sender:</label> <input type="text" name="sender" id="id_sender" /></p>\n<p><label for="id_cc_myself">Cc myself:</label> <input type="checkbox" name="cc_myself" id="id_cc_myself" /></p>' + >>> print f.as_p() + <p><label for="id_subject">Subject:</label> <input id="id_subject" type="text" name="subject" maxlength="100" /></p> + <p><label for="id_message">Message:</label> <input type="text" name="message" id="id_message" /></p> + <p><label for="id_sender">Sender:</label> <input type="text" name="sender" id="id_sender" /></p> + <p><label for="id_cc_myself">Cc myself:</label> <input type="checkbox" name="cc_myself" id="id_cc_myself" /></p> + +``as_ul()`` +~~~~~~~~~~~ + +``Form.as_ul()`` renders the form as a series of ``<li>`` tags, with each +``<li>`` containing one field. It does *not* include the ``<ul>`` or ``</ul>``, +so that you can specify any HTML attributes on the ``<ul>`` for flexibility:: + + >>> f = ContactForm() + >>> f.as_ul() + u'<li><label for="id_subject">Subject:</label> <input id="id_subject" type="text" name="subject" maxlength="100" /></li>\n<li><label for="id_message">Message:</label> <input type="text" name="message" id="id_message" /></li>\n<li><label for="id_sender">Sender:</label> <input type="text" name="sender" id="id_sender" /></li>\n<li><label for="id_cc_myself">Cc myself:</label> <input type="checkbox" name="cc_myself" id="id_cc_myself" /></li>' + >>> print f.as_ul() + <li><label for="id_subject">Subject:</label> <input id="id_subject" type="text" name="subject" maxlength="100" /></li> + <li><label for="id_message">Message:</label> <input type="text" name="message" id="id_message" /></li> + <li><label for="id_sender">Sender:</label> <input type="text" name="sender" id="id_sender" /></li> + <li><label for="id_cc_myself">Cc myself:</label> <input type="checkbox" name="cc_myself" id="id_cc_myself" /></li> + +``as_table()`` +~~~~~~~~~~~~~~ + +Finally, ``Form.as_table()`` outputs the form as an HTML ``<table>``. This is +exactly the same as ``print``. In fact, when you ``print`` a form object, it +calls its ``as_table()`` method behind the scenes:: + + >>> f = ContactForm() + >>> f.as_table() + u'<tr><th><label for="id_subject">Subject:</label></th><td><input id="id_subject" type="text" name="subject" maxlength="100" /></td></tr>\n<tr><th><label for="id_message">Message:</label></th><td><input type="text" name="message" id="id_message" /></td></tr>\n<tr><th><label for="id_sender">Sender:</label></th><td><input type="text" name="sender" id="id_sender" /></td></tr>\n<tr><th><label for="id_cc_myself">Cc myself:</label></th><td><input type="checkbox" name="cc_myself" id="id_cc_myself" /></td></tr>' + >>> print f.as_table() + <tr><th><label for="id_subject">Subject:</label></th><td><input id="id_subject" type="text" name="subject" maxlength="100" /></td></tr> + <tr><th><label for="id_message">Message:</label></th><td><input type="text" name="message" id="id_message" /></td></tr> + <tr><th><label for="id_sender">Sender:</label></th><td><input type="text" name="sender" id="id_sender" /></td></tr> + <tr><th><label for="id_cc_myself">Cc myself:</label></th><td><input type="checkbox" name="cc_myself" id="id_cc_myself" /></td></tr> + +.. _ref-forms-api-configuring-label: + +Configuring HTML ``<label>`` tags +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +An HTML ``<label>`` tag designates which label text is associated with which +form element. This small enhancement makes forms more usable and more accessible +to assistive devices. It's always a good idea to use ``<label>`` tags. + +By default, the form rendering methods include HTML ``id`` attributes on the +form elements and corresponding ``<label>`` tags around the labels. The ``id`` +attribute values are generated by prepending ``id_`` to the form field names. +This behavior is configurable, though, if you want to change the ``id`` +convention or remove HTML ``id`` attributes and ``<label>`` tags entirely. + +Use the ``auto_id`` argument to the ``Form`` constructor to control the label +and ``id`` behavior. This argument must be ``True``, ``False`` or a string. + +If ``auto_id`` is ``False``, then the form output will not include ``<label>`` +tags nor ``id`` attributes:: + + >>> f = ContactForm(auto_id=False) + >>> print f.as_table() + <tr><th>Subject:</th><td><input type="text" name="subject" maxlength="100" /></td></tr> + <tr><th>Message:</th><td><input type="text" name="message" /></td></tr> + <tr><th>Sender:</th><td><input type="text" name="sender" /></td></tr> + <tr><th>Cc myself:</th><td><input type="checkbox" name="cc_myself" /></td></tr> + >>> print f.as_ul() + <li>Subject: <input type="text" name="subject" maxlength="100" /></li> + <li>Message: <input type="text" name="message" /></li> + <li>Sender: <input type="text" name="sender" /></li> + <li>Cc myself: <input type="checkbox" name="cc_myself" /></li> + >>> print f.as_p() + <p>Subject: <input type="text" name="subject" maxlength="100" /></p> + <p>Message: <input type="text" name="message" /></p> + <p>Sender: <input type="text" name="sender" /></p> + <p>Cc myself: <input type="checkbox" name="cc_myself" /></p> + +If ``auto_id`` is set to ``True``, then the form output *will* include +``<label>`` tags and will simply use the field name as its ``id`` for each form +field:: + + >>> f = ContactForm(auto_id=True) + >>> print f.as_table() + <tr><th><label for="subject">Subject:</label></th><td><input id="subject" type="text" name="subject" maxlength="100" /></td></tr> + <tr><th><label for="message">Message:</label></th><td><input type="text" name="message" id="message" /></td></tr> + <tr><th><label for="sender">Sender:</label></th><td><input type="text" name="sender" id="sender" /></td></tr> + <tr><th><label for="cc_myself">Cc myself:</label></th><td><input type="checkbox" name="cc_myself" id="cc_myself" /></td></tr> + >>> print f.as_ul() + <li><label for="subject">Subject:</label> <input id="subject" type="text" name="subject" maxlength="100" /></li> + <li><label for="message">Message:</label> <input type="text" name="message" id="message" /></li> + <li><label for="sender">Sender:</label> <input type="text" name="sender" id="sender" /></li> + <li><label for="cc_myself">Cc myself:</label> <input type="checkbox" name="cc_myself" id="cc_myself" /></li> + >>> print f.as_p() + <p><label for="subject">Subject:</label> <input id="subject" type="text" name="subject" maxlength="100" /></p> + <p><label for="message">Message:</label> <input type="text" name="message" id="message" /></p> + <p><label for="sender">Sender:</label> <input type="text" name="sender" id="sender" /></p> + <p><label for="cc_myself">Cc myself:</label> <input type="checkbox" name="cc_myself" id="cc_myself" /></p> + +If ``auto_id`` is set to a string containing the format character ``'%s'``, +then the form output will include ``<label>`` tags, and will generate ``id`` +attributes based on the format string. For example, for a format string +``'field_%s'``, a field named ``subject`` will get the ``id`` value +``'field_subject'``. Continuing our example:: + + >>> f = ContactForm(auto_id='id_for_%s') + >>> print f.as_table() + <tr><th><label for="id_for_subject">Subject:</label></th><td><input id="id_for_subject" type="text" name="subject" maxlength="100" /></td></tr> + <tr><th><label for="id_for_message">Message:</label></th><td><input type="text" name="message" id="id_for_message" /></td></tr> + <tr><th><label for="id_for_sender">Sender:</label></th><td><input type="text" name="sender" id="id_for_sender" /></td></tr> + <tr><th><label for="id_for_cc_myself">Cc myself:</label></th><td><input type="checkbox" name="cc_myself" id="id_for_cc_myself" /></td></tr> + >>> print f.as_ul() + <li><label for="id_for_subject">Subject:</label> <input id="id_for_subject" type="text" name="subject" maxlength="100" /></li> + <li><label for="id_for_message">Message:</label> <input type="text" name="message" id="id_for_message" /></li> + <li><label for="id_for_sender">Sender:</label> <input type="text" name="sender" id="id_for_sender" /></li> + <li><label for="id_for_cc_myself">Cc myself:</label> <input type="checkbox" name="cc_myself" id="id_for_cc_myself" /></li> + >>> print f.as_p() + <p><label for="id_for_subject">Subject:</label> <input id="id_for_subject" type="text" name="subject" maxlength="100" /></p> + <p><label for="id_for_message">Message:</label> <input type="text" name="message" id="id_for_message" /></p> + <p><label for="id_for_sender">Sender:</label> <input type="text" name="sender" id="id_for_sender" /></p> + <p><label for="id_for_cc_myself">Cc myself:</label> <input type="checkbox" name="cc_myself" id="id_for_cc_myself" /></p> + +If ``auto_id`` is set to any other true value -- such as a string that doesn't +include ``%s`` -- then the library will act as if ``auto_id`` is ``True``. + +By default, ``auto_id`` is set to the string ``'id_%s'``. + +Normally, a colon (``:``) will be appended after any label name when a form is +rendered. It's possible to change the colon to another character, or omit it +entirely, using the ``label_suffix`` parameter:: + + >>> f = ContactForm(auto_id='id_for_%s', label_suffix='') + >>> print f.as_ul() + <li><label for="id_for_subject">Subject</label> <input id="id_for_subject" type="text" name="subject" maxlength="100" /></li> + <li><label for="id_for_message">Message</label> <input type="text" name="message" id="id_for_message" /></li> + <li><label for="id_for_sender">Sender</label> <input type="text" name="sender" id="id_for_sender" /></li> + <li><label for="id_for_cc_myself">Cc myself</label> <input type="checkbox" name="cc_myself" id="id_for_cc_myself" /></li> + >>> f = ContactForm(auto_id='id_for_%s', label_suffix=' ->') + >>> print f.as_ul() + <li><label for="id_for_subject">Subject -></label> <input id="id_for_subject" type="text" name="subject" maxlength="100" /></li> + <li><label for="id_for_message">Message -></label> <input type="text" name="message" id="id_for_message" /></li> + <li><label for="id_for_sender">Sender -></label> <input type="text" name="sender" id="id_for_sender" /></li> + <li><label for="id_for_cc_myself">Cc myself -></label> <input type="checkbox" name="cc_myself" id="id_for_cc_myself" /></li> + +Note that the label suffix is added only if the last character of the +label isn't a punctuation character (``.``, ``!``, ``?`` or ``:``) + +Notes on field ordering +~~~~~~~~~~~~~~~~~~~~~~~ + +In the ``as_p()``, ``as_ul()`` and ``as_table()`` shortcuts, the fields are +displayed in the order in which you define them in your form class. For +example, in the ``ContactForm`` example, the fields are defined in the order +``subject``, ``message``, ``sender``, ``cc_myself``. To reorder the HTML +output, just change the order in which those fields are listed in the class. + +How errors are displayed +~~~~~~~~~~~~~~~~~~~~~~~~ + +If you render a bound ``Form`` object, the act of rendering will automatically +run the form's validation if it hasn't already happened, and the HTML output +will include the validation errors as a ``<ul class="errorlist">`` near the +field. The particular positioning of the error messages depends on the output +method you're using:: + + >>> data = {'subject': '', + ... 'message': 'Hi there', + ... 'sender': 'invalid e-mail address', + ... 'cc_myself': True} + >>> f = ContactForm(data, auto_id=False) + >>> print f.as_table() + <tr><th>Subject:</th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="text" name="subject" maxlength="100" /></td></tr> + <tr><th>Message:</th><td><input type="text" name="message" value="Hi there" /></td></tr> + <tr><th>Sender:</th><td><ul class="errorlist"><li>Enter a valid e-mail address.</li></ul><input type="text" name="sender" value="invalid e-mail address" /></td></tr> + <tr><th>Cc myself:</th><td><input checked="checked" type="checkbox" name="cc_myself" /></td></tr> + >>> print f.as_ul() + <li><ul class="errorlist"><li>This field is required.</li></ul>Subject: <input type="text" name="subject" maxlength="100" /></li> + <li>Message: <input type="text" name="message" value="Hi there" /></li> + <li><ul class="errorlist"><li>Enter a valid e-mail address.</li></ul>Sender: <input type="text" name="sender" value="invalid e-mail address" /></li> + <li>Cc myself: <input checked="checked" type="checkbox" name="cc_myself" /></li> + >>> print f.as_p() + <p><ul class="errorlist"><li>This field is required.</li></ul></p> + <p>Subject: <input type="text" name="subject" maxlength="100" /></p> + <p>Message: <input type="text" name="message" value="Hi there" /></p> + <p><ul class="errorlist"><li>Enter a valid e-mail address.</li></ul></p> + <p>Sender: <input type="text" name="sender" value="invalid e-mail address" /></p> + <p>Cc myself: <input checked="checked" type="checkbox" name="cc_myself" /></p> + +Customizing the error list format +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +By default, forms use ``django.forms.util.ErrorList`` to format validation +errors. If you'd like to use an alternate class for displaying errors, you can +pass that in at construction time:: + + >>> from django.forms.util import ErrorList + >>> class DivErrorList(ErrorList): + ... def __unicode__(self): + ... return self.as_divs() + ... def as_divs(self): + ... if not self: return u'' + ... return u'<div class="errorlist">%s</div>' % ''.join([u'<div class="error">%s</div>' % e for e in self]) + >>> f = ContactForm(data, auto_id=False, error_class=DivErrorList) + >>> f.as_p() + <div class="errorlist"><div class="error">This field is required.</div></div> + <p>Subject: <input type="text" name="subject" maxlength="100" /></p> + <p>Message: <input type="text" name="message" value="Hi there" /></p> + <div class="errorlist"><div class="error">Enter a valid e-mail address.</div></div> + <p>Sender: <input type="text" name="sender" value="invalid e-mail address" /></p> + <p>Cc myself: <input checked="checked" type="checkbox" name="cc_myself" /></p> + +More granular output +~~~~~~~~~~~~~~~~~~~~ + +The ``as_p()``, ``as_ul()`` and ``as_table()`` methods are simply shortcuts for +lazy developers -- they're not the only way a form object can be displayed. + +To display the HTML for a single field in your form, use dictionary lookup +syntax using the field's name as the key, and print the resulting object:: + + >>> f = ContactForm() + >>> print f['subject'] + <input id="id_subject" type="text" name="subject" maxlength="100" /> + >>> print f['message'] + <input type="text" name="message" id="id_message" /> + >>> print f['sender'] + <input type="text" name="sender" id="id_sender" /> + >>> print f['cc_myself'] + <input type="checkbox" name="cc_myself" id="id_cc_myself" /> + +Call ``str()`` or ``unicode()`` on the field to get its rendered HTML as a +string or Unicode object, respectively:: + + >>> str(f['subject']) + '<input id="id_subject" type="text" name="subject" maxlength="100" />' + >>> unicode(f['subject']) + u'<input id="id_subject" type="text" name="subject" maxlength="100" />' + +The field-specific output honors the form object's ``auto_id`` setting:: + + >>> f = ContactForm(auto_id=False) + >>> print f['message'] + <input type="text" name="message" /> + >>> f = ContactForm(auto_id='id_%s') + >>> print f['message'] + <input type="text" name="message" id="id_message" /> + +For a field's list of errors, access the field's ``errors`` attribute. This +is a list-like object that is displayed as an HTML ``<ul class="errorlist">`` +when printed:: + + >>> data = {'subject': 'hi', 'message': '', 'sender': '', 'cc_myself': ''} + >>> f = ContactForm(data, auto_id=False) + >>> print f['message'] + <input type="text" name="message" /> + >>> f['message'].errors + [u'This field is required.'] + >>> print f['message'].errors + <ul class="errorlist"><li>This field is required.</li></ul> + >>> f['subject'].errors + [] + >>> print f['subject'].errors + + >>> str(f['subject'].errors) + '' + +.. _binding-uploaded-files: + +Binding uploaded files to a form +-------------------------------- + +**New in Django development version** + +Dealing with forms that have ``FileField`` and ``ImageField`` fields +is a little more complicated than a normal form. + +Firstly, in order to upload files, you'll need to make sure that your +``<form>`` element correctly defines the ``enctype`` as +``"multipart/form-data"``:: + + <form enctype="multipart/form-data" method="post" action="/foo/"> + +Secondly, when you use the form, you need to bind the file data. File +data is handled separately to normal form data, so when your form +contains a ``FileField`` and ``ImageField``, you will need to specify +a second argument when you bind your form. So if we extend our +ContactForm to include an ``ImageField`` called ``mugshot``, we +need to bind the file data containing the mugshot image:: + + # Bound form with an image field + >>> from django.core.files.uploadedfile import SimpleUploadedFile + >>> data = {'subject': 'hello', + ... 'message': 'Hi there', + ... 'sender': 'foo@example.com', + ... 'cc_myself': True} + >>> file_data = {'mugshot': SimpleUploadedFile('face.jpg', <file data>)} + >>> f = ContactFormWithMugshot(data, file_data) + +In practice, you will usually specify ``request.FILES`` as the source +of file data (just like you use ``request.POST`` as the source of +form data):: + + # Bound form with an image field, data from the request + >>> f = ContactFormWithMugshot(request.POST, request.FILES) + +Constructing an unbound form is the same as always -- just omit both +form data *and* file data:: + + # Unbound form with a image field + >>> f = ContactFormWithMugshot() + +Testing for multipart forms +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +If you're writing reusable views or templates, you may not know ahead of time +whether your form is a multipart form or not. The ``is_multipart()`` method +tells you whether the form requires multipart encoding for submission:: + + >>> f = ContactFormWithMugshot() + >>> f.is_multipart() + True + +Here's an example of how you might use this in a template:: + + {% if form.is_multipart %} + <form enctype="multipart/form-data" method="post" action="/foo/"> + {% else %} + <form method="post" action="/foo/"> + {% endif %} + {{ form }} + </form> + +Subclassing forms +----------------- + +If you have multiple ``Form`` classes that share fields, you can use +subclassing to remove redundancy. + +When you subclass a custom ``Form`` class, the resulting subclass will +include all fields of the parent class(es), followed by the fields you define +in the subclass. + +In this example, ``ContactFormWithPriority`` contains all the fields from +``ContactForm``, plus an additional field, ``priority``. The ``ContactForm`` +fields are ordered first:: + + >>> class ContactFormWithPriority(ContactForm): + ... priority = forms.CharField() + >>> f = ContactFormWithPriority(auto_id=False) + >>> print f.as_ul() + <li>Subject: <input type="text" name="subject" maxlength="100" /></li> + <li>Message: <input type="text" name="message" /></li> + <li>Sender: <input type="text" name="sender" /></li> + <li>Cc myself: <input type="checkbox" name="cc_myself" /></li> + <li>Priority: <input type="text" name="priority" /></li> + +It's possible to subclass multiple forms, treating forms as "mix-ins." In this +example, ``BeatleForm`` subclasses both ``PersonForm`` and ``InstrumentForm`` +(in that order), and its field list includes the fields from the parent +classes:: + + >>> class PersonForm(Form): + ... first_name = CharField() + ... last_name = CharField() + >>> class InstrumentForm(Form): + ... instrument = CharField() + >>> class BeatleForm(PersonForm, InstrumentForm): + ... haircut_type = CharField() + >>> b = BeatleForm(auto_id=False) + >>> print b.as_ul() + <li>First name: <input type="text" name="first_name" /></li> + <li>Last name: <input type="text" name="last_name" /></li> + <li>Instrument: <input type="text" name="instrument" /></li> + <li>Haircut type: <input type="text" name="haircut_type" /></li> + +.. _form-prefix: + +Prefixes for forms +------------------ + +.. attribute:: Form.prefix + +You can put several Django forms inside one ``<form>`` tag. To give each +``Form`` its own namespace, use the ``prefix`` keyword argument:: + + >>> mother = PersonForm(prefix="mother") + >>> father = PersonForm(prefix="father") + >>> print mother.as_ul() + <li><label for="id_mother-first_name">First name:</label> <input type="text" name="mother-first_name" id="id_mother-first_name" /></li> + <li><label for="id_mother-last_name">Last name:</label> <input type="text" name="mother-last_name" id="id_mother-last_name" /></li> + >>> print father.as_ul() + <li><label for="id_father-first_name">First name:</label> <input type="text" name="father-first_name" id="id_father-first_name" /></li> + <li><label for="id_father-last_name">Last name:</label> <input type="text" name="father-last_name" id="id_father-last_name" /></li> diff --git a/docs/ref/forms/fields.txt b/docs/ref/forms/fields.txt new file mode 100644 index 0000000000..161c550d37 --- /dev/null +++ b/docs/ref/forms/fields.txt @@ -0,0 +1,751 @@ +.. _ref-forms-fields: + +=========== +Form fields +=========== + +.. module:: django.forms.fields + :synopsis: Django's built-in form fields. + +.. currentmodule:: django.forms + +.. class:: Field(**kwargs) + +When you create a ``Form`` class, the most important part is defining the +fields of the form. Each field has custom validation logic, along with a few +other hooks. + +.. method:: Field.clean(value) + +Although the primary way you'll use ``Field`` classes is in ``Form`` classes, +you can also instantiate them and use them directly to get a better idea of +how they work. Each ``Field`` instance has a ``clean()`` method, which takes +a single argument and either raises a ``django.forms.ValidationError`` +exception or returns the clean value:: + + >>> f = forms.EmailField() + >>> f.clean('foo@example.com') + u'foo@example.com' + >>> f.clean(u'foo@example.com') + u'foo@example.com' + >>> f.clean('invalid e-mail address') + Traceback (most recent call last): + ... + ValidationError: [u'Enter a valid e-mail address.'] + +If you've used Django's old forms/validation framework, take care in noticing +this ``ValidationError`` is different than the previous ``ValidationError``. +This one lives at ``django.forms.ValidationError`` rather than +``django.core.validators.ValidationError``. + +Core field arguments +-------------------- + +Each ``Field`` class constructor takes at least these arguments. Some +``Field`` classes take additional, field-specific arguments, but the following +should *always* be accepted: + +``required`` +~~~~~~~~~~~~ + +.. attribute:: Field.required + +By default, each ``Field`` class assumes the value is required, so if you pass +an empty value -- either ``None`` or the empty string (``""``) -- then +``clean()`` will raise a ``ValidationError`` exception:: + + >>> f = forms.CharField() + >>> f.clean('foo') + u'foo' + >>> f.clean('') + Traceback (most recent call last): + ... + ValidationError: [u'This field is required.'] + >>> f.clean(None) + Traceback (most recent call last): + ... + ValidationError: [u'This field is required.'] + >>> f.clean(' ') + u' ' + >>> f.clean(0) + u'0' + >>> f.clean(True) + u'True' + >>> f.clean(False) + u'False' + +To specify that a field is *not* required, pass ``required=False`` to the +``Field`` constructor:: + + >>> f = forms.CharField(required=False) + >>> f.clean('foo') + u'foo' + >>> f.clean('') + u'' + >>> f.clean(None) + u'' + >>> f.clean(0) + u'0' + >>> f.clean(True) + u'True' + >>> f.clean(False) + u'False' + +If a ``Field`` has ``required=False`` and you pass ``clean()`` an empty value, +then ``clean()`` will return a *normalized* empty value rather than raising +``ValidationError``. For ``CharField``, this will be a Unicode empty string. +For other ``Field`` classes, it might be ``None``. (This varies from field to +field.) + +``label`` +~~~~~~~~~ + +.. attribute:: Field.label + +The ``label`` argument lets you specify the "human-friendly" label for this +field. This is used when the ``Field`` is displayed in a ``Form``. + +As explained in "Outputting forms as HTML" above, the default label for a +``Field`` is generated from the field name by converting all underscores to +spaces and upper-casing the first letter. Specify ``label`` if that default +behavior doesn't result in an adequate label. + +Here's a full example ``Form`` that implements ``label`` for two of its fields. +We've specified ``auto_id=False`` to simplify the output:: + + >>> class CommentForm(forms.Form): + ... name = forms.CharField(label='Your name') + ... url = forms.URLField(label='Your Web site', required=False) + ... comment = forms.CharField() + >>> f = CommentForm(auto_id=False) + >>> print f + <tr><th>Your name:</th><td><input type="text" name="name" /></td></tr> + <tr><th>Your Web site:</th><td><input type="text" name="url" /></td></tr> + <tr><th>Comment:</th><td><input type="text" name="comment" /></td></tr> + +``initial`` +~~~~~~~~~~~ + +.. attribute:: Field.initial + +The ``initial`` argument lets you specify the initial value to use when +rendering this ``Field`` in an unbound ``Form``. + +The use-case for this is when you want to display an "empty" form in which a +field is initialized to a particular value. For example:: + + >>> class CommentForm(forms.Form): + ... name = forms.CharField(initial='Your name') + ... url = forms.URLField(initial='http://') + ... comment = forms.CharField() + >>> f = CommentForm(auto_id=False) + >>> print f + <tr><th>Name:</th><td><input type="text" name="name" value="Your name" /></td></tr> + <tr><th>Url:</th><td><input type="text" name="url" value="http://" /></td></tr> + <tr><th>Comment:</th><td><input type="text" name="comment" /></td></tr> + +You may be thinking, why not just pass a dictionary of the initial values as +data when displaying the form? Well, if you do that, you'll trigger validation, +and the HTML output will include any validation errors:: + + >>> class CommentForm(forms.Form): + ... name = forms.CharField() + ... url = forms.URLField() + ... comment = forms.CharField() + >>> default_data = {'name': 'Your name', 'url': 'http://'} + >>> f = CommentForm(default_data, auto_id=False) + >>> print f + <tr><th>Name:</th><td><input type="text" name="name" value="Your name" /></td></tr> + <tr><th>Url:</th><td><ul class="errorlist"><li>Enter a valid URL.</li></ul><input type="text" name="url" value="http://" /></td></tr> + <tr><th>Comment:</th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="text" name="comment" /></td></tr> + +This is why ``initial`` values are only displayed for unbound forms. For bound +forms, the HTML output will use the bound data. + +Also note that ``initial`` values are *not* used as "fallback" data in +validation if a particular field's value is not given. ``initial`` values are +*only* intended for initial form display:: + + >>> class CommentForm(forms.Form): + ... name = forms.CharField(initial='Your name') + ... url = forms.URLField(initial='http://') + ... comment = forms.CharField() + >>> data = {'name': '', 'url': '', 'comment': 'Foo'} + >>> f = CommentForm(data) + >>> f.is_valid() + False + # The form does *not* fall back to using the initial values. + >>> f.errors + {'url': [u'This field is required.'], 'name': [u'This field is required.']} + +``widget`` +~~~~~~~~~~ + +.. attribute:: Field.widget + +The ``widget`` argument lets you specify a ``Widget`` class to use when +rendering this ``Field``. See :ref:`ref-forms-widgets` for more information. + +``help_text`` +~~~~~~~~~~~~~ + +.. attribute:: Field.help_text + +The ``help_text`` argument lets you specify descriptive text for this +``Field``. If you provide ``help_text``, it will be displayed next to the +``Field`` when the ``Field`` is rendered by one of the convenience ``Form`` +methods (e.g., ``as_ul()``). + +Here's a full example ``Form`` that implements ``help_text`` for two of its +fields. We've specified ``auto_id=False`` to simplify the output:: + + >>> class HelpTextContactForm(forms.Form): + ... subject = forms.CharField(max_length=100, help_text='100 characters max.') + ... message = forms.CharField() + ... sender = forms.EmailField(help_text='A valid e-mail address, please.') + ... cc_myself = forms.BooleanField(required=False) + >>> f = HelpTextContactForm(auto_id=False) + >>> print f.as_table() + <tr><th>Subject:</th><td><input type="text" name="subject" maxlength="100" /><br />100 characters max.</td></tr> + <tr><th>Message:</th><td><input type="text" name="message" /></td></tr> + <tr><th>Sender:</th><td><input type="text" name="sender" /><br />A valid e-mail address, please.</td></tr> + <tr><th>Cc myself:</th><td><input type="checkbox" name="cc_myself" /></td></tr> + >>> print f.as_ul() + <li>Subject: <input type="text" name="subject" maxlength="100" /> 100 characters max.</li> + <li>Message: <input type="text" name="message" /></li> + <li>Sender: <input type="text" name="sender" /> A valid e-mail address, please.</li> + <li>Cc myself: <input type="checkbox" name="cc_myself" /></li> + >>> print f.as_p() + <p>Subject: <input type="text" name="subject" maxlength="100" /> 100 characters max.</p> + <p>Message: <input type="text" name="message" /></p> + <p>Sender: <input type="text" name="sender" /> A valid e-mail address, please.</p> + <p>Cc myself: <input type="checkbox" name="cc_myself" /></p> + +``error_messages`` +~~~~~~~~~~~~~~~~~~ + +.. attribute:: Field.error_messages + +**New in Django development version** + +The ``error_messages`` argument lets you override the default messages that the +field will raise. Pass in a dictionary with keys matching the error messages you +want to override. For example, here is the default error message:: + + >>> generic = forms.CharField() + >>> generic.clean('') + Traceback (most recent call last): + ... + ValidationError: [u'This field is required.'] + +And here is a custom error message:: + + >>> name = forms.CharField(error_messages={'required': 'Please enter your name'}) + >>> name.clean('') + Traceback (most recent call last): + ... + ValidationError: [u'Please enter your name'] + +In the `built-in Field classes`_ section below, each ``Field`` defines the +error message keys it uses. + +Dynamic initial values +---------------------- + +The ``initial`` argument to ``Field`` (explained above) lets you hard-code the +initial value for a ``Field`` -- but what if you want to declare the initial +value at runtime? For example, you might want to fill in a ``username`` field +with the username of the current session. + +To accomplish this, use the ``initial`` argument to a ``Form``. This argument, +if given, should be a dictionary mapping field names to initial values. Only +include the fields for which you're specifying an initial value; it's not +necessary to include every field in your form. For example:: + + >>> class CommentForm(forms.Form): + ... name = forms.CharField() + ... url = forms.URLField() + ... comment = forms.CharField() + >>> f = CommentForm(initial={'name': 'your username'}, auto_id=False) + >>> print f + <tr><th>Name:</th><td><input type="text" name="name" value="your username" /></td></tr> + <tr><th>Url:</th><td><input type="text" name="url" /></td></tr> + <tr><th>Comment:</th><td><input type="text" name="comment" /></td></tr> + >>> f = CommentForm(initial={'name': 'another username'}, auto_id=False) + >>> print f + <tr><th>Name:</th><td><input type="text" name="name" value="another username" /></td></tr> + <tr><th>Url:</th><td><input type="text" name="url" /></td></tr> + <tr><th>Comment:</th><td><input type="text" name="comment" /></td></tr> + +Just like the ``initial`` parameter to ``Field``, these values are only +displayed for unbound forms, and they're not used as fallback values if a +particular value isn't provided. + +Finally, note that if a ``Field`` defines ``initial`` *and* you include +``initial`` when instantiating the ``Form``, then the latter ``initial`` will +have precedence. In this example, ``initial`` is provided both at the field +level and at the form instance level, and the latter gets precedence:: + + >>> class CommentForm(forms.Form): + ... name = forms.CharField(initial='class') + ... url = forms.URLField() + ... comment = forms.CharField() + >>> f = CommentForm(initial={'name': 'instance'}, auto_id=False) + >>> print f + <tr><th>Name:</th><td><input type="text" name="name" value="instance" /></td></tr> + <tr><th>Url:</th><td><input type="text" name="url" /></td></tr> + <tr><th>Comment:</th><td><input type="text" name="comment" /></td></tr> + + +Built-in ``Field`` classes +-------------------------- + +Naturally, the ``forms`` library comes with a set of ``Field`` classes that +represent common validation needs. This section documents each built-in field. + +For each field, we describe the default widget used if you don't specify +``widget``. We also specify the value returned when you provide an empty value +(see the section on ``required`` above to understand what that means). + +``BooleanField`` +~~~~~~~~~~~~~~~~ + +.. class:: BooleanField(**kwargs) + + * Default widget: ``CheckboxInput`` + * Empty value: ``False`` + * Normalizes to: A Python ``True`` or ``False`` value. + * Validates that the check box is checked (i.e. the value is ``True``) if + the field has ``required=True``. + * Error message keys: ``required`` + +**New in Django development version:** The empty value for a ``CheckboxInput`` +(and hence the standard ``BooleanField``) has changed to return ``False`` +instead of ``None`` in the development version. + +.. note:: + Since all ``Field`` subclasses have ``required=True`` by default, the + validation condition here is important. If you want to include a checkbox + in your form that can be either checked or unchecked, you must remember to + pass in ``required=False`` when creating the ``BooleanField``. + +``CharField`` +~~~~~~~~~~~~~ + +.. class:: CharField(**kwargs) + + * Default widget: ``TextInput`` + * Empty value: ``''`` (an empty string) + * Normalizes to: A Unicode object. + * Validates ``max_length`` or ``min_length``, if they are provided. + Otherwise, all inputs are valid. + * Error message keys: ``required``, ``max_length``, ``min_length`` + +Has two optional arguments for validation: + +.. attribute:: CharField.max_length +.. attribute:: CharField.min_length + If provided, these arguments ensure that the string is at most or at least + the given length. + +``ChoiceField`` +~~~~~~~~~~~~~~~ + +.. class:: ChoiceField(**kwargs) + + * Default widget: ``Select`` + * Empty value: ``''`` (an empty string) + * Normalizes to: A Unicode object. + * Validates that the given value exists in the list of choices. + * Error message keys: ``required``, ``invalid_choice`` + +Takes one extra required argument: + +.. attribute:: ChoiceField.choices + An iterable (e.g., a list or tuple) of 2-tuples to use as choices for this + field. + +``DateField`` +~~~~~~~~~~~~~ + +.. class:: DateField(**kwargs) + + * Default widget: ``TextInput`` + * Empty value: ``None`` + * Normalizes to: A Python ``datetime.date`` object. + * Validates that the given value is either a ``datetime.date``, + ``datetime.datetime`` or string formatted in a particular date format. + * Error message keys: ``required``, ``invalid`` + +Takes one optional argument: + +.. attribute:: DateField.input_formats + A list of formats used to attempt to convert a string to a valid + ``datetime.date`` object. + +If no ``input_formats`` argument is provided, the default input formats are:: + + '%Y-%m-%d', '%m/%d/%Y', '%m/%d/%y', # '2006-10-25', '10/25/2006', '10/25/06' + '%b %d %Y', '%b %d, %Y', # 'Oct 25 2006', 'Oct 25, 2006' + '%d %b %Y', '%d %b, %Y', # '25 Oct 2006', '25 Oct, 2006' + '%B %d %Y', '%B %d, %Y', # 'October 25 2006', 'October 25, 2006' + '%d %B %Y', '%d %B, %Y', # '25 October 2006', '25 October, 2006' + +``DateTimeField`` +~~~~~~~~~~~~~~~~~ + +.. class:: DateTimeField(**kwargs) + + * Default widget: ``DateTimeInput`` + * Empty value: ``None`` + * Normalizes to: A Python ``datetime.datetime`` object. + * Validates that the given value is either a ``datetime.datetime``, + ``datetime.date`` or string formatted in a particular datetime format. + * Error message keys: ``required``, ``invalid`` + +Takes one optional argument: + +.. attribute:: DateTimeField.input_formats + A list of formats used to attempt to convert a string to a valid + ``datetime.datetime`` object. + +If no ``input_formats`` argument is provided, the default input formats are:: + + '%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59' + '%Y-%m-%d %H:%M', # '2006-10-25 14:30' + '%Y-%m-%d', # '2006-10-25' + '%m/%d/%Y %H:%M:%S', # '10/25/2006 14:30:59' + '%m/%d/%Y %H:%M', # '10/25/2006 14:30' + '%m/%d/%Y', # '10/25/2006' + '%m/%d/%y %H:%M:%S', # '10/25/06 14:30:59' + '%m/%d/%y %H:%M', # '10/25/06 14:30' + '%m/%d/%y', # '10/25/06' + +**New in Django development version:** The ``DateTimeField`` used to use a +``TextInput`` widget by default. This has now changed. + +``DecimalField`` +~~~~~~~~~~~~~~~~ + +.. class:: DecimalField(**kwargs) + +**New in Django development version** + + * Default widget: ``TextInput`` + * Empty value: ``None`` + * Normalizes to: A Python ``decimal``. + * Validates that the given value is a decimal. Leading and trailing + whitespace is ignored. + * Error message keys: ``required``, ``invalid``, ``max_value``, + ``min_value``, ``max_digits``, ``max_decimal_places``, + ``max_whole_digits`` + +Takes four optional arguments: + +.. attribute:: DecimalField.max_value +.. attribute:: DecimalField.min_value + These attributes define the limits for the fields value. + +.. attribute:: DecimalField.max_digits + The maximum number of digits (those before the decimal point plus those + after the decimal point, with leading zeros stripped) permitted in the + value. + +.. attribute:: DecimalField.decimal_places + The maximum number of decimal places permitted. + +``EmailField`` +~~~~~~~~~~~~~~ + +.. class:: EmailField(**kwargs) + + * Default widget: ``TextInput`` + * Empty value: ``''`` (an empty string) + * Normalizes to: A Unicode object. + * Validates that the given value is a valid e-mail address, using a + moderately complex regular expression. + * Error message keys: ``required``, ``invalid`` + +Has two optional arguments for validation, ``max_length`` and ``min_length``. +If provided, these arguments ensure that the string is at most or at least the +given length. + +``FileField`` +~~~~~~~~~~~~~ + +.. class:: FileField(**kwargs) + +**New in Django development version** + + * Default widget: ``FileInput`` + * Empty value: ``None`` + * Normalizes to: An ``UploadedFile`` object that wraps the file content + and file name into a single object. + * Validates that non-empty file data has been bound to the form. + * Error message keys: ``required``, ``invalid``, ``missing``, ``empty`` + +To learn more about the ``UploadedFile`` object, see the :ref:`file uploads +documentation <topics-file-uploads>`. + +When you use a ``FileField`` in a form, you must also remember to +:ref:`bind the file data to the form <topics-file-uploads>`. + +``FilePathField`` +~~~~~~~~~~~~~~~~~ + +.. class:: FilePathField(**kwargs) + +**New in Django development version** + + * Default widget: ``Select`` + * Empty value: ``None`` + * Normalizes to: A unicode object + * Validates that the selected choice exists in the list of choices. + * Error message keys: ``required``, ``invalid_choice`` + +The field allows choosing from files inside a certain directory. It takes three +extra arguments; only ``path`` is required: + +.. attribute:: FilePathField.path + The absolute path to the directory whose contents you want listed. This + directory must exist. + +.. attribute:: FilePathField.recursive + If ``False`` (the default) only the direct contents of ``path`` will be + offered as choices. If ``True``, the directory will be descended into + recursively and all descendants will be listed as choices. + +.. attribute:: FilePathField.match + A regular expression pattern; only files with names matching this expression + will be allowed as choices. + +``FloatField`` +~~~~~~~~~~~~~~ + + * Default widget: ``TextInput`` + * Empty value: ``None`` + * Normalizes to: A Python float. + * Validates that the given value is an float. Leading and trailing + whitespace is allowed, as in Python's ``float()`` function. + * Error message keys: ``required``, ``invalid``, ``max_value``, + ``min_value`` + +Takes two optional arguments for validation, ``max_value`` and ``min_value``. +These control the range of values permitted in the field. + +``ImageField`` +~~~~~~~~~~~~~~ + +.. class:: ImageField(**kwargs) + +**New in Django development version** + + * Default widget: ``FileInput`` + * Empty value: ``None`` + * Normalizes to: An ``UploadedFile`` object that wraps the file content + and file name into a single object. + * Validates that file data has been bound to the form, and that the + file is of an image format understood by PIL. + * Error message keys: ``required``, ``invalid``, ``missing``, ``empty``, + ``invalid_image`` + +Using an ImageField requires that the `Python Imaging Library`_ is installed. + +When you use an ``ImageField`` on a form, you must also remember to +:ref:`bind the file data to the form <topics-file-uploads>`. + +.. _Python Imaging Library: http://www.pythonware.com/products/pil/ + +``IntegerField`` +~~~~~~~~~~~~~~~~ + +.. class:: IntegerField(**kwargs) + + * Default widget: ``TextInput`` + * Empty value: ``None`` + * Normalizes to: A Python integer or long integer. + * Validates that the given value is an integer. Leading and trailing + whitespace is allowed, as in Python's ``int()`` function. + * Error message keys: ``required``, ``invalid``, ``max_value``, + ``min_value`` + +Takes two optional arguments for validation: + +.. attribute:: IntegerField.max_value +.. attribute:: IntegerField.min_value + These control the range of values permitted in the field. + +``IPAddressField`` +~~~~~~~~~~~~~~~~~~ + +.. class:: IPAddressField(**kwargs) + + * Default widget: ``TextInput`` + * Empty value: ``''`` (an empty string) + * Normalizes to: A Unicode object. + * Validates that the given value is a valid IPv4 address, using a regular + expression. + * Error message keys: ``required``, ``invalid`` + +``MultipleChoiceField`` +~~~~~~~~~~~~~~~~~~~~~~~ + +.. class:: MultipleChoiceField(**kwargs) + + * Default widget: ``SelectMultiple`` + * Empty value: ``[]`` (an empty list) + * Normalizes to: A list of Unicode objects. + * Validates that every value in the given list of values exists in the list + of choices. + * Error message keys: ``required``, ``invalid_choice``, ``invalid_list`` + +Takes one extra argument, ``choices``, as for ``ChoiceField``. + +``NullBooleanField`` +~~~~~~~~~~~~~~~~~~~~ + +.. class:: NullBooleanField(**kwargs) + + * Default widget: ``NullBooleanSelect`` + * Empty value: ``None`` + * Normalizes to: A Python ``True``, ``False`` or ``None`` value. + * Validates nothing (i.e., it never raises a ``ValidationError``). + +``RegexField`` +~~~~~~~~~~~~~~ + +.. class:: RegexField(**kwargs) + + * Default widget: ``TextInput`` + * Empty value: ``''`` (an empty string) + * Normalizes to: A Unicode object. + * Validates that the given value matches against a certain regular + expression. + * Error message keys: ``required``, ``invalid`` + +Takes one required argument: + +.. attribute:: RegexField.regex`` + A regular expression specified either as a string or a compiled regular + expression object. + +Also takes ``max_length`` and ``min_length``, which work just as they do for +``CharField``. + +The optional argument ``error_message`` is also accepted for backwards +compatibility. The preferred way to provide an error message is to use the +``error_messages`` argument, passing a dictionary with ``'invalid'`` as a key +and the error message as the value. + +``TimeField`` +~~~~~~~~~~~~~ + +.. class:: TimeField(**kwargs) + + * Default widget: ``TextInput`` + * Empty value: ``None`` + * Normalizes to: A Python ``datetime.time`` object. + * Validates that the given value is either a ``datetime.time`` or string + formatted in a particular time format. + * Error message keys: ``required``, ``invalid`` + +Takes one optional argument: + +.. attribute:: TimeField.input_formats + A list of formats used to attempt to convert a string to a valid + ``datetime.time`` object. + +If no ``input_formats`` argument is provided, the default input formats are:: + + '%H:%M:%S', # '14:30:59' + '%H:%M', # '14:30' + +``URLField`` +~~~~~~~~~~~~ + +.. class:: URLField(**kwargs) + + * Default widget: ``TextInput`` + * Empty value: ``''`` (an empty string) + * Normalizes to: A Unicode object. + * Validates that the given value is a valid URL. + * Error message keys: ``required``, ``invalid``, ``invalid_link`` + +Takes the following optional arguments: + + +.. attribute:: URLField.max_length +.. attribute:: URLField.min_length + Same as ``CharField.max_length`` and ``CharField.min_length``. + +.. attribute:: URLField.verify_exists + If ``True``, the validator will attempt to load the given URL, raising + ``ValidationError`` if the page gives a 404. Defaults to ``False``. + +.. attribute:: URLField.validator_user_agent + String used as the user-agent used when checking for a URL's existence. + Defaults to the value of the ``URL_VALIDATOR_USER_AGENT`` setting. + +Slightly complex built-in ``Field`` classes +------------------------------------------- + +The following are not yet documented. + +.. class:: ComboField(**kwargs) + +.. class:: MultiValueField(**kwargs) + +.. class:: SplitDateTimeField(**kwargs) + +Fields which handle relationships +--------------------------------- + +For representing relationships between models, two fields are +provided which can derive their choices from a ``QuerySet``: + +.. class:: ModelChoiceField(**kwargs) +.. class:: ModelMultipleChoiceField(**kwargs) + +These fields place one or more model objects into the ``cleaned_data`` +dictionary of forms in which they're used. Both of these fields have an +additional required argument: + +.. attribute:: ModelChoiceField.queryset + A ``QuerySet`` of model objects from which the choices for the + field will be derived, and which will be used to validate the + user's selection. + +``ModelChoiceField`` +~~~~~~~~~~~~~~~~~~~~ + +Allows the selection of a single model object, suitable for +representing a foreign key. + +The ``__unicode__`` method of the model will be called to generate +string representations of the objects for use in the field's choices; +to provide customized representations, subclass ``ModelChoiceField`` +and override ``label_from_instance``. This method will receive a model +object, and should return a string suitable for representing it. For +example:: + + class MyModelChoiceField(ModelChoiceField): + def label_from_instance(self, obj): + return "My Object #%i" % obj.id + +``ModelMultipleChoiceField`` +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Allows the selection of one or more model objects, suitable for +representing a many-to-many relation. As with ``ModelChoiceField``, +you can use ``label_from_instance`` to customize the object +representations. + +Creating custom fields +---------------------- + +If the built-in ``Field`` classes don't meet your needs, you can easily create +custom ``Field`` classes. To do this, just create a subclass of +``django.forms.Field``. Its only requirements are that it implement a +``clean()`` method and that its ``__init__()`` method accept the core arguments +mentioned above (``required``, ``label``, ``initial``, ``widget``, +``help_text``). diff --git a/docs/ref/forms/index.txt b/docs/ref/forms/index.txt new file mode 100644 index 0000000000..a9e041c2a7 --- /dev/null +++ b/docs/ref/forms/index.txt @@ -0,0 +1,14 @@ +.. _ref-forms-index: + +Forms +===== + +Detailed form API reference. For introductory material, see :ref:`topics-forms-index`. + +.. toctree:: + :maxdepth: 1 + + api + fields + widgets + validation \ No newline at end of file diff --git a/docs/ref/forms/validation.txt b/docs/ref/forms/validation.txt new file mode 100644 index 0000000000..56c0e098c3 --- /dev/null +++ b/docs/ref/forms/validation.txt @@ -0,0 +1,109 @@ +.. _ref-forms-validation: + +F and field validation +====================== + +Form validation happens when the data is cleaned. If you want to customize +this process, there are various places you can change, each one serving a +different purpose. Three types of cleaning methods are run during form +processing. These are normally executed when you call the ``is_valid()`` +method on a form. There are other things that can trigger cleaning and +validation (accessing the ``errors`` attribute or calling ``full_clean()`` +directly), but normally they won't be needed. + +In general, any cleaning method can raise ``ValidationError`` if there is a +problem with the data it is processing, passing the relevant error message to +the ``ValidationError`` constructor. If no ``ValidationError`` is raised, the +method should return the cleaned (normalized) data as a Python object. + +If you detect multiple errors during a cleaning method and wish to signal all +of them to the form submitter, it is possible to pass a list of errors to the +``ValidationError`` constructor. + +The three types of cleaning methods are: + + * The ``clean()`` method on a Field subclass. This is responsible + for cleaning the data in a way that is generic for that type of field. + For example, a FloatField will turn the data into a Python ``float`` or + raise a ``ValidationError``. + + * The ``clean_<fieldname>()`` method in a form subclass -- where + ``<fieldname>`` is replaced with the name of the form field attribute. + This method does any cleaning that is specific to that particular + attribute, unrelated to the type of field that it is. This method is not + passed any parameters. You will need to look up the value of the field + in ``self.cleaned_data`` and remember that it will be a Python object + at this point, not the original string submitted in the form (it will be + in ``cleaned_data`` because the general field ``clean()`` method, above, + has already cleaned the data once). + + For example, if you wanted to validate that the contents of a + ``CharField`` called ``serialnumber`` was unique, + ``clean_serialnumber()`` would be the right place to do this. You don't + need a specific field (it's just a ``CharField``), but you want a + formfield-specific piece of validation and, possibly, + cleaning/normalizing the data. + + * The Form subclass's ``clean()`` method. This method can perform + any validation that requires access to multiple fields from the form at + once. This is where you might put in things to check that if field ``A`` + is supplied, field ``B`` must contain a valid e-mail address and the + like. The data that this method returns is the final ``cleaned_data`` + attribute for the form, so don't forget to return the full list of + cleaned data if you override this method (by default, ``Form.clean()`` + just returns ``self.cleaned_data``). + + Note that any errors raised by your ``Form.clean()`` override will not + be associated with any field in particular. They go into a special + "field" (called ``__all__``), which you can access via the + ``non_field_errors()`` method if you need to. + +These methods are run in the order given above, one field at a time. That is, +for each field in the form (in the order they are declared in the form +definition), the ``Field.clean()`` method (or its override) is run, then +``clean_<fieldname>()``. Finally, once those two methods are run for every +field, the ``Form.clean()`` method, or its override, is executed. + +As mentioned above, any of these methods can raise a ``ValidationError``. For +any field, if the ``Field.clean()`` method raises a ``ValidationError``, any +field-specific cleaning method is not called. However, the cleaning methods +for all remaining fields are still executed. + +The ``clean()`` method for the ``Form`` class or subclass is always run. If +that method raises a ``ValidationError``, ``cleaned_data`` will be an empty +dictionary. + +The previous paragraph means that if you are overriding ``Form.clean()``, you +should iterate through ``self.cleaned_data.items()``, possibly considering the +``_errors`` dictionary attribute on the form as well. In this way, you will +already know which fields have passed their individual validation requirements. + +A simple example +~~~~~~~~~~~~~~~~ + +Here's a simple example of a custom field that validates its input is a string +containing comma-separated e-mail addresses, with at least one address. We'll +keep it simple and assume e-mail validation is contained in a function called +``is_valid_email()``. The full class:: + + from django import forms + + class MultiEmailField(forms.Field): + def clean(self, value): + if not value: + raise forms.ValidationError('Enter at least one e-mail address.') + emails = value.split(',') + for email in emails: + if not is_valid_email(email): + raise forms.ValidationError('%s is not a valid e-mail address.' % email) + return emails + +Let's alter the ongoing ``ContactForm`` example to demonstrate how you'd use +this in a form. Simply use ``MultiEmailField`` instead of ``forms.EmailField``, +like so:: + + class ContactForm(forms.Form): + subject = forms.CharField(max_length=100) + message = forms.CharField() + senders = MultiEmailField() + cc_myself = forms.BooleanField(required=False) diff --git a/docs/ref/forms/widgets.txt b/docs/ref/forms/widgets.txt new file mode 100644 index 0000000000..184515ec95 --- /dev/null +++ b/docs/ref/forms/widgets.txt @@ -0,0 +1,156 @@ +.. _ref-forms-widgets: + +======= +Widgets +======= + +.. module:: django.forms.widgets + :synopsis: Django's built-in form widgets. + +.. currentmodule:: django.forms + +A widget is Django's representation of a HTML input element. The widget +handles the rendering of the HTML, and the extraction of data from a GET/POST +dictionary that corresponds to the widget. + +Django provides a representation of all the basic HTML widgets, plus some +commonly used groups of widgets: + +.. class:: TextInput + Text input: ``<input type='text' ...>`` + +.. class:: PasswordInput + Password input: ``<input type='password' ...>`` + +.. class:: HiddenInput + Hidden input: ``<input type='hidden' ...>`` + +.. class:: MultipleHiddenInput + Multiple ``<input type='hidden' ...>`` widgets. + +.. class:: FileInput + File upload input: ``<input type='file' ...>`` + +.. class:: DateTimeInput + Date/time input as a simple text box: ``<input type='text' ...>`` + + **New in Django development version:** + +.. class:: Textarea + Text area: ``<textarea>...</textarea>`` + +.. class:: CheckboxInput + Checkbox: ``<input type='checkbox' ...>`` + +.. class:: Select + Select widget: ``<select><option ...>...</select>`` + +.. class:: NullBooleanSelect + Select widget with options 'Unknown', 'Yes' and 'No' + +.. class:: SelectMultiple + Select widget allowing multiple selection: ``<select + multiple='multiple'>...</select>`` + +.. class:: RadioSelect + A list of radio buttons: + + .. code-block:: html + + <ul> + <li><input type='radio' ...></li> + ... + </ul> + +.. class:: CheckboxSelectMultiple + A list of checkboxes: + + .. code-block:: html + + <ul> + <li><input type='checkbox' ...></li> + ... + </ul> + +.. class:: MultiWidget + Wrapper around multiple other widgets + +.. class:: SplitDateTimeWidget + Wrapper around two ``TextInput`` widgets: one for the date, and one for the + time. + +Specifying widgets +------------------ + +.. attribute:: Form.widget + +Whenever you specify a field on a form, Django will use a default widget +that is appropriate to the type of data that is to be displayed. To find +which widget is used on which field, see the documentation for the +built-in Field classes. + +However, if you want to use a different widget for a field, you can - +just use the 'widget' argument on the field definition. For example:: + + class CommentForm(forms.Form): + name = forms.CharField() + url = forms.URLField() + comment = forms.CharField(widget=forms.Textarea) + +This would specify a form with a comment that uses a larger Textarea widget, +rather than the default TextInput widget. + +Customizing widget instances +---------------------------- + +When Django renders a widget as HTML, it only renders the bare minimum +HTML - Django doesn't add a class definition, or any other widget-specific +attributes. This means that all 'TextInput' widgets will appear the same +on your web page. + +If you want to make one widget look different to another, you need to +specify additional attributes for each widget. When you specify a +widget, you can provide a list of attributes that will be added to the +rendered HTML for the widget. + +For example, take the following simple form:: + + class CommentForm(forms.Form): + name = forms.CharField() + url = forms.URLField() + comment = forms.CharField() + +This form will include three default TextInput widgets, with default rendering - +no CSS class, no extra attributes. This means that the input boxes provided for +each widget will be rendered exactly the same:: + + >>> f = CommentForm(auto_id=False) + >>> f.as_table() + <tr><th>Name:</th><td><input type="text" name="name" /></td></tr> + <tr><th>Url:</th><td><input type="text" name="url"/></td></tr> + <tr><th>Comment:</th><td><input type="text" name="comment" /></td></tr> + + +On a real web page, you probably don't want every widget to look the same. You +might want a larger input element for the comment, and you might want the 'name' +widget to have some special CSS class. To do this, you use the ``attrs`` +argument when creating the widget: + +.. attribute:: Widget.attrs + +For example:: + + class CommentForm(forms.Form): + name = forms.CharField( + widget=forms.TextInput(attrs={'class':'special'})) + url = forms.URLField() + comment = forms.CharField( + widget=forms.TextInput(attrs={'size':'40'})) + +Django will then include the extra attributes in the rendered output:: + + >>> f = CommentForm(auto_id=False) + >>> f.as_table() + <tr><th>Name:</th><td><input type="text" name="name" class="special"/></td></tr> + <tr><th>Url:</th><td><input type="text" name="url"/></td></tr> + <tr><th>Comment:</th><td><input type="text" name="comment" size="40"/></td></tr> diff --git a/docs/ref/generic-views.txt b/docs/ref/generic-views.txt new file mode 100644 index 0000000000..f92a301c2f --- /dev/null +++ b/docs/ref/generic-views.txt @@ -0,0 +1,1106 @@ +.. _ref-generic-views: + +============= +Generic views +============= + +Writing Web applications can be monotonous, because we repeat certain patterns +again and again. In Django, the most common of these patterns have been +abstracted into "generic views" that let you quickly provide common views of +an object without actually needing to write any Python code. + +Django's generic views contain the following: + + * A set of views for doing list/detail interfaces. + + * A set of views for year/month/day archive pages and associated + detail and "latest" pages (for example, the Django weblog's year_, + month_, day_, detail_, and latest_ pages). + + * A set of views for creating, editing, and deleting objects. + +.. _year: http://www.djangoproject.com/weblog/2005/ +.. _month: http://www.djangoproject.com/weblog/2005/jul/ +.. _day: http://www.djangoproject.com/weblog/2005/jul/20/ +.. _detail: http://www.djangoproject.com/weblog/2005/jul/20/autoreload/ +.. _latest: http://www.djangoproject.com/weblog/ + +All of these views are used by creating configuration dictionaries in +your URLconf files and passing those dictionaries as the third member of the +URLconf tuple for a given pattern. For example, here's the URLconf for the +simple weblog app that drives the blog on djangoproject.com:: + + from django.conf.urls.defaults import * + from django_website.apps.blog.models import Entry + + info_dict = { + 'queryset': Entry.objects.all(), + 'date_field': 'pub_date', + } + + urlpatterns = patterns('django.views.generic.date_based', + (r'^(?P<year>\d{4})/(?P<month>[a-z]{3})/(?P<day>\w{1,2})/(?P<slug>[-\w]+)/$', 'object_detail', info_dict), + (r'^(?P<year>\d{4})/(?P<month>[a-z]{3})/(?P<day>\w{1,2})/$', 'archive_day', info_dict), + (r'^(?P<year>\d{4})/(?P<month>[a-z]{3})/$', 'archive_month', info_dict), + (r'^(?P<year>\d{4})/$', 'archive_year', info_dict), + (r'^$', 'archive_index', info_dict), + ) + +As you can see, this URLconf defines a few options in ``info_dict``. +``'queryset'`` gives the generic view a ``QuerySet`` of objects to use (in this +case, all of the ``Entry`` objects) and tells the generic view which model is +being used. + +Documentation of each generic view follows, along with a list of all keyword +arguments that a generic view expects. Remember that as in the example above, +arguments may either come from the URL pattern (as ``month``, ``day``, +``year``, etc. do above) or from the additional-information dictionary (as for +``queryset``, ``date_field``, etc.). + +Most generic views require the ``queryset`` key, which is a ``QuerySet`` +instance; see :ref:`topics-db-queries` for more information about ``QuerySet`` +objects. + +Most views also take an optional ``extra_context`` dictionary that you can use +to pass any auxiliary information you wish to the view. The values in the +``extra_context`` dictionary can be either functions (or other callables) or +other objects. Functions are evaluated just before they are passed to the +template. However, note that QuerySets retrieve and cache their data when they +are first evaluated, so if you want to pass in a QuerySet via +``extra_context`` that is always fresh you need to wrap it in a function or +lambda that returns the QuerySet. + +"Simple" generic views +====================== + +The ``django.views.generic.simple`` module contains simple views to handle a +couple of common cases: rendering a template when no view logic is needed, +and issuing a redirect. + +``django.views.generic.simple.direct_to_template`` +-------------------------------------------------- + +**Description:** + +Renders a given template, passing it a ``{{ params }}`` template variable, +which is a dictionary of the parameters captured in the URL. + +**Required arguments:** + + * ``template``: The full name of a template to use. + +**Optional arguments:** + + * ``extra_context``: A dictionary of values to add to the template + context. By default, this is an empty dictionary. If a value in the + dictionary is callable, the generic view will call it + just before rendering the template. + + * ``mimetype``: The MIME type to use for the resulting document. Defaults + to the value of the ``DEFAULT_CONTENT_TYPE`` setting. + +**Example:** + +Given the following URL patterns:: + + urlpatterns = patterns('django.views.generic.simple', + (r'^foo/$', 'direct_to_template', {'template': 'foo_index.html'}), + (r'^foo/(?P<id>\d+)/$', 'direct_to_template', {'template': 'foo_detail.html'}), + ) + +... a request to ``/foo/`` would render the template ``foo_index.html``, and a +request to ``/foo/15/`` would render the ``foo_detail.html`` with a context +variable ``{{ params.id }}`` that is set to ``15``. + +``django.views.generic.simple.redirect_to`` +------------------------------------------- + +**Description:** + +Redirects to a given URL. + +The given URL may contain dictionary-style string formatting, which will be +interpolated against the parameters captured in the URL. + +If the given URL is ``None``, Django will return an ``HttpResponseGone`` (410). + +**Required arguments:** + + * ``url``: The URL to redirect to, as a string. Or ``None`` to raise a 410 + (Gone) HTTP error. + +**Example:** + +This example redirects from ``/foo/<id>/`` to ``/bar/<id>/``:: + + urlpatterns = patterns('django.views.generic.simple', + ('^foo/(?P<id>\d+)/$', 'redirect_to', {'url': '/bar/%(id)s/'}), + ) + +This example returns a 410 HTTP error for requests to ``/bar/``:: + + urlpatterns = patterns('django.views.generic.simple', + ('^bar/$', 'redirect_to', {'url': None}), + ) + +Date-based generic views +======================== + +Date-based generic views (in the module ``django.views.generic.date_based``) +are views for displaying drilldown pages for date-based data. + +``django.views.generic.date_based.archive_index`` +------------------------------------------------- + +**Description:** + +A top-level index page showing the "latest" objects, by date. Objects with +a date in the *future* are not included unless you set ``allow_future`` to +``True``. + +**Required arguments:** + + * ``queryset``: A ``QuerySet`` of objects for which the archive serves. + + * ``date_field``: The name of the ``DateField`` or ``DateTimeField`` in + the ``QuerySet``'s model that the date-based archive should use to + determine the objects on the page. + +**Optional arguments:** + + * ``num_latest``: The number of latest objects to send to the template + context. By default, it's 15. + + * ``template_name``: The full name of a template to use in rendering the + page. This lets you override the default template name (see below). + + * ``template_loader``: The template loader to use when loading the + template. By default, it's ``django.template.loader``. + + * ``extra_context``: A dictionary of values to add to the template + context. By default, this is an empty dictionary. If a value in the + dictionary is callable, the generic view will call it + just before rendering the template. + + * ``allow_empty``: A boolean specifying whether to display the page if no + objects are available. If this is ``False`` and no objects are available, + the view will raise a 404 instead of displaying an empty page. By + default, this is ``True``. + + * ``context_processors``: A list of template-context processors to apply to + the view's template. + + * ``mimetype``: The MIME type to use for the resulting document. Defaults + to the value of the ``DEFAULT_CONTENT_TYPE`` setting. + + * ``allow_future``: A boolean specifying whether to include "future" + objects on this page, where "future" means objects in which the field + specified in ``date_field`` is greater than the current date/time. By + default, this is ``False``. + + * **New in Django development version:** ``template_object_name``: + Designates the name of the template variable to use in the template + context. By default, this is ``'latest'``. + +**Template name:** + +If ``template_name`` isn't specified, this view will use the template +``<app_label>/<model_name>_archive.html`` by default, where: + + * ``<model_name>`` is your model's name in all lowercase. For a model + ``StaffMember``, that'd be ``staffmember``. + + * ``<app_label>`` is the right-most part of the full Python path to + your model's app. For example, if your model lives in + ``apps/blog/models.py``, that'd be ``blog``. + +**Template context:** + +In addition to ``extra_context``, the template's context will be: + + * ``date_list``: A list of ``datetime.date`` objects representing all + years that have objects available according to ``queryset``. These are + ordered in reverse. This is equivalent to + ``queryset.dates(date_field, 'year')[::-1]``. + + * ``latest``: The ``num_latest`` objects in the system, ordered descending + by ``date_field``. For example, if ``num_latest`` is ``10``, then + ``latest`` will be a list of the latest 10 objects in ``queryset``. + + **New in Django development version:** This variable's name depends on + the ``template_object_name`` parameter, which is ``'latest'`` by default. + If ``template_object_name`` is ``'foo'``, this variable's name will be + ``foo``. + +``django.views.generic.date_based.archive_year`` +------------------------------------------------ + +**Description:** + +A yearly archive page showing all available months in a given year. Objects +with a date in the *future* are not displayed unless you set ``allow_future`` +to ``True``. + +**Required arguments:** + + * ``year``: The four-digit year for which the archive serves. + + * ``queryset``: A ``QuerySet`` of objects for which the archive serves. + + * ``date_field``: The name of the ``DateField`` or ``DateTimeField`` in + the ``QuerySet``'s model that the date-based archive should use to + determine the objects on the page. + +**Optional arguments:** + + * ``template_name``: The full name of a template to use in rendering the + page. This lets you override the default template name (see below). + + * ``template_loader``: The template loader to use when loading the + template. By default, it's ``django.template.loader``. + + * ``extra_context``: A dictionary of values to add to the template + context. By default, this is an empty dictionary. If a value in the + dictionary is callable, the generic view will call it + just before rendering the template. + + * ``allow_empty``: A boolean specifying whether to display the page if no + objects are available. If this is ``False`` and no objects are available, + the view will raise a 404 instead of displaying an empty page. By + default, this is ``False``. + + * ``context_processors``: A list of template-context processors to apply to + the view's template. + + * ``template_object_name``: Designates the name of the template variable + to use in the template context. By default, this is ``'object'``. The + view will append ``'_list'`` to the value of this parameter in + determining the variable's name. + + * ``make_object_list``: A boolean specifying whether to retrieve the full + list of objects for this year and pass those to the template. If ``True``, + this list of objects will be made available to the template as + ``object_list``. (The name ``object_list`` may be different; see the docs + for ``object_list`` in the "Template context" section below.) By default, + this is ``False``. + + * ``mimetype``: The MIME type to use for the resulting document. Defaults + to the value of the ``DEFAULT_CONTENT_TYPE`` setting. + + * ``allow_future``: A boolean specifying whether to include "future" + objects on this page, where "future" means objects in which the field + specified in ``date_field`` is greater than the current date/time. By + default, this is ``False``. + +**Template name:** + +If ``template_name`` isn't specified, this view will use the template +``<app_label>/<model_name>_archive_year.html`` by default. + +**Template context:** + +In addition to ``extra_context``, the template's context will be: + + * ``date_list``: A list of ``datetime.date`` objects representing all + months that have objects available in the given year, according to + ``queryset``, in ascending order. + + * ``year``: The given year, as a four-character string. + + * ``object_list``: If the ``make_object_list`` parameter is ``True``, this + will be set to a list of objects available for the given year, ordered by + the date field. This variable's name depends on the + ``template_object_name`` parameter, which is ``'object'`` by default. If + ``template_object_name`` is ``'foo'``, this variable's name will be + ``foo_list``. + + If ``make_object_list`` is ``False``, ``object_list`` will be passed to + the template as an empty list. + +``django.views.generic.date_based.archive_month`` +------------------------------------------------- + +**Description:** + +A monthly archive page showing all objects in a given month. Objects with a +date in the *future* are not displayed unless you set ``allow_future`` to +``True``. + +**Required arguments:** + + * ``year``: The four-digit year for which the archive serves (a string). + + * ``month``: The month for which the archive serves, formatted according to + the ``month_format`` argument. + + * ``queryset``: A ``QuerySet`` of objects for which the archive serves. + + * ``date_field``: The name of the ``DateField`` or ``DateTimeField`` in + the ``QuerySet``'s model that the date-based archive should use to + determine the objects on the page. + +**Optional arguments:** + + * ``month_format``: A format string that regulates what format the + ``month`` parameter uses. This should be in the syntax accepted by + Python's ``time.strftime``. (See the `strftime docs`_.) It's set to + ``"%b"`` by default, which is a three-letter month abbreviation. To + change it to use numbers, use ``"%m"``. + + * ``template_name``: The full name of a template to use in rendering the + page. This lets you override the default template name (see below). + + * ``template_loader``: The template loader to use when loading the + template. By default, it's ``django.template.loader``. + + * ``extra_context``: A dictionary of values to add to the template + context. By default, this is an empty dictionary. If a value in the + dictionary is callable, the generic view will call it + just before rendering the template. + + * ``allow_empty``: A boolean specifying whether to display the page if no + objects are available. If this is ``False`` and no objects are available, + the view will raise a 404 instead of displaying an empty page. By + default, this is ``False``. + + * ``context_processors``: A list of template-context processors to apply to + the view's template. + + * ``template_object_name``: Designates the name of the template variable + to use in the template context. By default, this is ``'object'``. The + view will append ``'_list'`` to the value of this parameter in + determining the variable's name. + + * ``mimetype``: The MIME type to use for the resulting document. Defaults + to the value of the ``DEFAULT_CONTENT_TYPE`` setting. + + * ``allow_future``: A boolean specifying whether to include "future" + objects on this page, where "future" means objects in which the field + specified in ``date_field`` is greater than the current date/time. By + default, this is ``False``. + +**Template name:** + +If ``template_name`` isn't specified, this view will use the template +``<app_label>/<model_name>_archive_month.html`` by default. + +**Template context:** + +In addition to ``extra_context``, the template's context will be: + + * ``month``: A ``datetime.date`` object representing the given month. + + * ``next_month``: A ``datetime.date`` object representing the first day of + the next month. If the next month is in the future, this will be + ``None``. + + * ``previous_month``: A ``datetime.date`` object representing the first day + of the previous month. Unlike ``next_month``, this will never be + ``None``. + + * ``object_list``: A list of objects available for the given month. This + variable's name depends on the ``template_object_name`` parameter, which + is ``'object'`` by default. If ``template_object_name`` is ``'foo'``, + this variable's name will be ``foo_list``. + +.. _strftime docs: http://www.python.org/doc/current/lib/module-time.html#l2h-1941 + +``django.views.generic.date_based.archive_week`` +------------------------------------------------ + +**Description:** + +A weekly archive page showing all objects in a given week. Objects with a date +in the *future* are not displayed unless you set ``allow_future`` to ``True``. + +**Required arguments:** + + * ``year``: The four-digit year for which the archive serves (a string). + + * ``week``: The week of the year for which the archive serves (a string). + Weeks start with Sunday. + + * ``queryset``: A ``QuerySet`` of objects for which the archive serves. + + * ``date_field``: The name of the ``DateField`` or ``DateTimeField`` in + the ``QuerySet``'s model that the date-based archive should use to + determine the objects on the page. + +**Optional arguments:** + + * ``template_name``: The full name of a template to use in rendering the + page. This lets you override the default template name (see below). + + * ``template_loader``: The template loader to use when loading the + template. By default, it's ``django.template.loader``. + + * ``extra_context``: A dictionary of values to add to the template + context. By default, this is an empty dictionary. If a value in the + dictionary is callable, the generic view will call it + just before rendering the template. + + * ``allow_empty``: A boolean specifying whether to display the page if no + objects are available. If this is ``False`` and no objects are available, + the view will raise a 404 instead of displaying an empty page. By + default, this is ``True``. + + * ``context_processors``: A list of template-context processors to apply to + the view's template. + + * ``template_object_name``: Designates the name of the template variable + to use in the template context. By default, this is ``'object'``. The + view will append ``'_list'`` to the value of this parameter in + determining the variable's name. + + * ``mimetype``: The MIME type to use for the resulting document. Defaults + to the value of the ``DEFAULT_CONTENT_TYPE`` setting. + + * ``allow_future``: A boolean specifying whether to include "future" + objects on this page, where "future" means objects in which the field + specified in ``date_field`` is greater than the current date/time. By + default, this is ``False``. + +**Template name:** + +If ``template_name`` isn't specified, this view will use the template +``<app_label>/<model_name>_archive_week.html`` by default. + +**Template context:** + +In addition to ``extra_context``, the template's context will be: + + * ``week``: A ``datetime.date`` object representing the first day of the + given week. + + * ``object_list``: A list of objects available for the given week. This + variable's name depends on the ``template_object_name`` parameter, which + is ``'object'`` by default. If ``template_object_name`` is ``'foo'``, + this variable's name will be ``foo_list``. + +``django.views.generic.date_based.archive_day`` +----------------------------------------------- + +**Description:** + +A day archive page showing all objects in a given day. Days in the future throw +a 404 error, regardless of whether any objects exist for future days, unless +you set ``allow_future`` to ``True``. + +**Required arguments:** + + * ``year``: The four-digit year for which the archive serves (a string). + + * ``month``: The month for which the archive serves, formatted according to + the ``month_format`` argument. + + * ``day``: The day for which the archive serves, formatted according to the + ``day_format`` argument. + + * ``queryset``: A ``QuerySet`` of objects for which the archive serves. + + * ``date_field``: The name of the ``DateField`` or ``DateTimeField`` in + the ``QuerySet``'s model that the date-based archive should use to + determine the objects on the page. + +**Optional arguments:** + + * ``month_format``: A format string that regulates what format the + ``month`` parameter uses. This should be in the syntax accepted by + Python's ``time.strftime``. (See the `strftime docs`_.) It's set to + ``"%b"`` by default, which is a three-letter month abbreviation. To + change it to use numbers, use ``"%m"``. + + * ``day_format``: Like ``month_format``, but for the ``day`` parameter. + It defaults to ``"%d"`` (day of the month as a decimal number, 01-31). + + * ``template_name``: The full name of a template to use in rendering the + page. This lets you override the default template name (see below). + + * ``template_loader``: The template loader to use when loading the + template. By default, it's ``django.template.loader``. + + * ``extra_context``: A dictionary of values to add to the template + context. By default, this is an empty dictionary. If a value in the + dictionary is callable, the generic view will call it + just before rendering the template. + + * ``allow_empty``: A boolean specifying whether to display the page if no + objects are available. If this is ``False`` and no objects are available, + the view will raise a 404 instead of displaying an empty page. By + default, this is ``False``. + + * ``context_processors``: A list of template-context processors to apply to + the view's template. + + * ``template_object_name``: Designates the name of the template variable + to use in the template context. By default, this is ``'object'``. The + view will append ``'_list'`` to the value of this parameter in + determining the variable's name. + + * ``mimetype``: The MIME type to use for the resulting document. Defaults + to the value of the ``DEFAULT_CONTENT_TYPE`` setting. + + * ``allow_future``: A boolean specifying whether to include "future" + objects on this page, where "future" means objects in which the field + specified in ``date_field`` is greater than the current date/time. By + default, this is ``False``. + +**Template name:** + +If ``template_name`` isn't specified, this view will use the template +``<app_label>/<model_name>_archive_day.html`` by default. + +**Template context:** + +In addition to ``extra_context``, the template's context will be: + + * ``day``: A ``datetime.date`` object representing the given day. + + * ``next_day``: A ``datetime.date`` object representing the next day. If + the next day is in the future, this will be ``None``. + + * ``previous_day``: A ``datetime.date`` object representing the given day. + Unlike ``next_day``, this will never be ``None``. + + * ``object_list``: A list of objects available for the given day. This + variable's name depends on the ``template_object_name`` parameter, which + is ``'object'`` by default. If ``template_object_name`` is ``'foo'``, + this variable's name will be ``foo_list``. + +``django.views.generic.date_based.archive_today`` +------------------------------------------------- + +**Description:** + +A day archive page showing all objects for *today*. This is exactly the same as +``archive_day``, except the ``year``/``month``/``day`` arguments are not used, +and today's date is used instead. + +``django.views.generic.date_based.object_detail`` +------------------------------------------------- + +**Description:** + +A page representing an individual object. If the object has a date value in the +future, the view will throw a 404 error by default, unless you set +``allow_future`` to ``True``. + +**Required arguments:** + + * ``year``: The object's four-digit year (a string). + + * ``month``: The object's month , formatted according to the + ``month_format`` argument. + + * ``day``: The object's day , formatted according to the ``day_format`` + argument. + + * ``queryset``: A ``QuerySet`` that contains the object. + + * ``date_field``: The name of the ``DateField`` or ``DateTimeField`` in + the ``QuerySet``'s model that the generic view should use to look up the + object according to ``year``, ``month`` and ``day``. + + * Either ``object_id`` or (``slug`` *and* ``slug_field``) is required. + + If you provide ``object_id``, it should be the value of the primary-key + field for the object being displayed on this page. + + Otherwise, ``slug`` should be the slug of the given object, and + ``slug_field`` should be the name of the slug field in the ``QuerySet``'s + model. By default, ``slug_field`` is ``'slug'``. + +**Optional arguments:** + + * ``month_format``: A format string that regulates what format the + ``month`` parameter uses. This should be in the syntax accepted by + Python's ``time.strftime``. (See the `strftime docs`_.) It's set to + ``"%b"`` by default, which is a three-letter month abbreviation. To + change it to use numbers, use ``"%m"``. + + * ``day_format``: Like ``month_format``, but for the ``day`` parameter. + It defaults to ``"%d"`` (day of the month as a decimal number, 01-31). + + * ``template_name``: The full name of a template to use in rendering the + page. This lets you override the default template name (see below). + + * ``template_name_field``: The name of a field on the object whose value is + the template name to use. This lets you store template names in the data. + In other words, if your object has a field ``'the_template'`` that + contains a string ``'foo.html'``, and you set ``template_name_field`` to + ``'the_template'``, then the generic view for this object will use the + template ``'foo.html'``. + + It's a bit of a brain-bender, but it's useful in some cases. + + * ``template_loader``: The template loader to use when loading the + template. By default, it's ``django.template.loader``. + + * ``extra_context``: A dictionary of values to add to the template + context. By default, this is an empty dictionary. If a value in the + dictionary is callable, the generic view will call it + just before rendering the template. + + * ``context_processors``: A list of template-context processors to apply to + the view's template. + + * ``template_object_name``: Designates the name of the template variable + to use in the template context. By default, this is ``'object'``. + + * ``mimetype``: The MIME type to use for the resulting document. Defaults + to the value of the ``DEFAULT_CONTENT_TYPE`` setting. + + * ``allow_future``: A boolean specifying whether to include "future" + objects on this page, where "future" means objects in which the field + specified in ``date_field`` is greater than the current date/time. By + default, this is ``False``. + +**Template name:** + +If ``template_name`` isn't specified, this view will use the template +``<app_label>/<model_name>_detail.html`` by default. + +**Template context:** + +In addition to ``extra_context``, the template's context will be: + + * ``object``: The object. This variable's name depends on the + ``template_object_name`` parameter, which is ``'object'`` by default. If + ``template_object_name`` is ``'foo'``, this variable's name will be + ``foo``. + +List/detail generic views +========================= + +The list-detail generic-view framework (in the +``django.views.generic.list_detail`` module) is similar to the date-based one, +except the former simply has two views: a list of objects and an individual +object page. + +``django.views.generic.list_detail.object_list`` +------------------------------------------------ + +**Description:** + +A page representing a list of objects. + +**Required arguments:** + + * ``queryset``: A ``QuerySet`` that represents the objects. + +**Optional arguments:** + + * ``paginate_by``: An integer specifying how many objects should be + displayed per page. If this is given, the view will paginate objects with + ``paginate_by`` objects per page. The view will expect either a ``page`` + query string parameter (via ``GET``) or a ``page`` variable specified in + the URLconf. See `Notes on pagination`_ below. + + * ``page``: The current page number, as an integer, or the string + ``'last'``. This is 1-based. See `Notes on pagination`_ below. + + * ``template_name``: The full name of a template to use in rendering the + page. This lets you override the default template name (see below). + + * ``template_loader``: The template loader to use when loading the + template. By default, it's ``django.template.loader``. + + * ``extra_context``: A dictionary of values to add to the template + context. By default, this is an empty dictionary. If a value in the + dictionary is callable, the generic view will call it + just before rendering the template. + + * ``allow_empty``: A boolean specifying whether to display the page if no + objects are available. If this is ``False`` and no objects are available, + the view will raise a 404 instead of displaying an empty page. By + default, this is ``True``. + + * ``context_processors``: A list of template-context processors to apply to + the view's template. + + * ``template_object_name``: Designates the name of the template variable + to use in the template context. By default, this is ``'object'``. The + view will append ``'_list'`` to the value of this parameter in + determining the variable's name. + + * ``mimetype``: The MIME type to use for the resulting document. Defaults + to the value of the ``DEFAULT_CONTENT_TYPE`` setting. + +**Template name:** + +If ``template_name`` isn't specified, this view will use the template +``<app_label>/<model_name>_list.html`` by default. + +**Template context:** + +In addition to ``extra_context``, the template's context will be: + + * ``object_list``: The list of objects. This variable's name depends on the + ``template_object_name`` parameter, which is ``'object'`` by default. If + ``template_object_name`` is ``'foo'``, this variable's name will be + ``foo_list``. + + * ``is_paginated``: A boolean representing whether the results are + paginated. Specifically, this is set to ``False`` if the number of + available objects is less than or equal to ``paginate_by``. + +If the results are paginated, the context will contain these extra variables: + + * **New in Django development version:** ``paginator``: An instance of + ``django.core.paginator.Paginator``. + + * **New in Django development version:** ``page_obj``: An instance of + ``django.core.paginator.Page``. + +Notes on pagination +~~~~~~~~~~~~~~~~~~~ + +If ``paginate_by`` is specified, Django will paginate the results. You can +specify the page number in the URL in one of two ways: + + * Use the ``page`` parameter in the URLconf. For example, this is what + your URLconf might look like:: + + (r'^objects/page(?P<page>[0-9]+)/$', 'object_list', dict(info_dict)) + + * Pass the page number via the ``page`` query-string parameter. For + example, a URL would look like this:: + + /objects/?page=3 + + * To loop over all the available page numbers, use the ``page_range`` + variable. You can iterate over the list provided by ``page_range`` + to create a link to every page of results. + +These values and lists are 1-based, not 0-based, so the first page would be +represented as page ``1``. + +For more on pagination, read the :ref:`pagination documentation +<topics-pagination>`. + +**New in Django development version:** + +As a special case, you are also permitted to use ``last`` as a value for +``page``:: + + /objects/?page=last + +This allows you to access the final page of results without first having to +determine how many pages there are. + +Note that ``page`` *must* be either a valid page number or the value ``last``; +any other value for ``page`` will result in a 404 error. + +``django.views.generic.list_detail.object_detail`` +-------------------------------------------------- + +A page representing an individual object. + +**Description:** + +A page representing an individual object. + +**Required arguments:** + + * ``queryset``: A ``QuerySet`` that contains the object. + + * Either ``object_id`` or (``slug`` *and* ``slug_field``) is required. + + If you provide ``object_id``, it should be the value of the primary-key + field for the object being displayed on this page. + + Otherwise, ``slug`` should be the slug of the given object, and + ``slug_field`` should be the name of the slug field in the ``QuerySet``'s + model. By default, ``slug_field`` is ``'slug'``. + +**Optional arguments:** + + * ``template_name``: The full name of a template to use in rendering the + page. This lets you override the default template name (see below). + + * ``template_name_field``: The name of a field on the object whose value is + the template name to use. This lets you store template names in the data. + In other words, if your object has a field ``'the_template'`` that + contains a string ``'foo.html'``, and you set ``template_name_field`` to + ``'the_template'``, then the generic view for this object will use the + template ``'foo.html'``. + + It's a bit of a brain-bender, but it's useful in some cases. + + * ``template_loader``: The template loader to use when loading the + template. By default, it's ``django.template.loader``. + + * ``extra_context``: A dictionary of values to add to the template + context. By default, this is an empty dictionary. If a value in the + dictionary is callable, the generic view will call it + just before rendering the template. + + * ``context_processors``: A list of template-context processors to apply to + the view's template. + + * ``template_object_name``: Designates the name of the template variable + to use in the template context. By default, this is ``'object'``. + + * ``mimetype``: The MIME type to use for the resulting document. Defaults + to the value of the ``DEFAULT_CONTENT_TYPE`` setting. + +**Template name:** + +If ``template_name`` isn't specified, this view will use the template +``<app_label>/<model_name>_detail.html`` by default. + +**Template context:** + +In addition to ``extra_context``, the template's context will be: + + * ``object``: The object. This variable's name depends on the + ``template_object_name`` parameter, which is ``'object'`` by default. If + ``template_object_name`` is ``'foo'``, this variable's name will be + ``foo``. + +Create/update/delete generic views +================================== + +The ``django.views.generic.create_update`` module contains a set of functions +for creating, editing and deleting objects. + +**Changed in Django development version:** + +``django.views.generic.create_update.create_object`` and +``django.views.generic.create_update.update_object`` now use the new :ref:`forms +library <topics-forms-index>` to build and display the form. + +``django.views.generic.create_update.create_object`` +---------------------------------------------------- + +**Description:** + +A page that displays a form for creating an object, redisplaying the form with +validation errors (if there are any) and saving the object. + +**Required arguments:** + + * Either ``form_class`` or ``model`` is required. + + If you provide ``form_class``, it should be a ``django.forms.ModelForm`` + subclass. Use this argument when you need to customize the model's form. + See the :ref:`ModelForm docs <topics-forms-modelforms>` for more + information. + + Otherwise, ``model`` should be a Django model class and the form used + will be a standard ``ModelForm`` for ``model``. + +**Optional arguments:** + + * ``post_save_redirect``: A URL to which the view will redirect after + saving the object. By default, it's ``object.get_absolute_url()``. + + ``post_save_redirect`` may contain dictionary string formatting, which + will be interpolated against the object's field attributes. For example, + you could use ``post_save_redirect="/polls/%(slug)s/"``. + + * ``login_required``: A boolean that designates whether a user must be + logged in, in order to see the page and save changes. This hooks into the + Django :ref:`authentication system <topics-auth>`. By default, this is + ``False``. + + If this is ``True``, and a non-logged-in user attempts to visit this page + or save the form, Django will redirect the request to ``/accounts/login/``. + + * ``template_name``: The full name of a template to use in rendering the + page. This lets you override the default template name (see below). + + * ``template_loader``: The template loader to use when loading the + template. By default, it's ``django.template.loader``. + + * ``extra_context``: A dictionary of values to add to the template + context. By default, this is an empty dictionary. If a value in the + dictionary is callable, the generic view will call it + just before rendering the template. + + * ``context_processors``: A list of template-context processors to apply to + the view's template. + +**Template name:** + +If ``template_name`` isn't specified, this view will use the template +``<app_label>/<model_name>_form.html`` by default. + +**Template context:** + +In addition to ``extra_context``, the template's context will be: + + * ``form``: A ``django.forms.ModelForm`` instance representing the form + for creating the object. This lets you refer to form fields easily in the + template system. + + For example, if the model has two fields, ``name`` and ``address``:: + + <form action="" method="post"> + <p>{{ form.name.label_tag }} {{ form.name }}</p> + <p>{{ form.address.label_tag }} {{ form.address }}</p> + </form> + + See the :ref:`forms documentation <topics-forms-index>` for more + information about using ``Form`` objects in templates. + +``django.views.generic.create_update.update_object`` +---------------------------------------------------- + +**Description:** + +A page that displays a form for editing an existing object, redisplaying the +form with validation errors (if there are any) and saving changes to the +object. This uses a form automatically generated from the object's +model class. + +**Required arguments:** + + * Either ``form_class`` or ``model`` is required. + + If you provide ``form_class``, it should be a ``django.forms.ModelForm`` + subclass. Use this argument when you need to customize the model's form. + See the :ref:`ModelForm docs <topics-forms-modelforms>` for more + information. + + Otherwise, ``model`` should be a Django model class and the form used + will be a standard ``ModelForm`` for ``model``. + + * Either ``object_id`` or (``slug`` *and* ``slug_field``) is required. + + If you provide ``object_id``, it should be the value of the primary-key + field for the object being displayed on this page. + + Otherwise, ``slug`` should be the slug of the given object, and + ``slug_field`` should be the name of the slug field in the ``QuerySet``'s + model. By default, ``slug_field`` is ``'slug'``. + +**Optional arguments:** + + * ``post_save_redirect``: A URL to which the view will redirect after + saving the object. By default, it's ``object.get_absolute_url()``. + + ``post_save_redirect`` may contain dictionary string formatting, which + will be interpolated against the object's field attributes. For example, + you could use ``post_save_redirect="/polls/%(slug)s/"``. + + * ``login_required``: A boolean that designates whether a user must be + logged in, in order to see the page and save changes. This hooks into the + Django :ref:`authentication system <topics-auth>`. By default, this is + ``False``. + + If this is ``True``, and a non-logged-in user attempts to visit this page + or save the form, Django will redirect the request to ``/accounts/login/``. + + * ``template_name``: The full name of a template to use in rendering the + page. This lets you override the default template name (see below). + + * ``template_loader``: The template loader to use when loading the + template. By default, it's ``django.template.loader``. + + * ``extra_context``: A dictionary of values to add to the template + context. By default, this is an empty dictionary. If a value in the + dictionary is callable, the generic view will call it + just before rendering the template. + + * ``context_processors``: A list of template-context processors to apply to + the view's template. + + * ``template_object_name``: Designates the name of the template variable + to use in the template context. By default, this is ``'object'``. + +**Template name:** + +If ``template_name`` isn't specified, this view will use the template +``<app_label>/<model_name>_form.html`` by default. + +**Template context:** + +In addition to ``extra_context``, the template's context will be: + + * ``form``: A ``django.forms.ModelForm`` instance representing the form + for editing the object. This lets you refer to form fields easily in the + template system. + + For example, if the model has two fields, ``name`` and ``address``:: + + <form action="" method="post"> + <p>{{ form.name.label_tag }} {{ form.name }}</p> + <p>{{ form.address.label_tag }} {{ form.address }}</p> + </form> + + See the :ref:`forms documentation <topics-forms-index>` for more + information about using ``Form`` objects in templates. + + * ``object``: The original object being edited. This variable's name + depends on the ``template_object_name`` parameter, which is ``'object'`` + by default. If ``template_object_name`` is ``'foo'``, this variable's + name will be ``foo``. + +``django.views.generic.create_update.delete_object`` +---------------------------------------------------- + +**Description:** + +A view that displays a confirmation page and deletes an existing object. The +given object will only be deleted if the request method is ``POST``. If this +view is fetched via ``GET``, it will display a confirmation page that should +contain a form that POSTs to the same URL. + +**Required arguments:** + + * ``model``: The Django model class of the object that the form will + create. + + * Either ``object_id`` or (``slug`` *and* ``slug_field``) is required. + + If you provide ``object_id``, it should be the value of the primary-key + field for the object being displayed on this page. + + Otherwise, ``slug`` should be the slug of the given object, and + ``slug_field`` should be the name of the slug field in the ``QuerySet``'s + model. By default, ``slug_field`` is ``'slug'``. + + * ``post_delete_redirect``: A URL to which the view will redirect after + deleting the object. + +**Optional arguments:** + + * ``login_required``: A boolean that designates whether a user must be + logged in, in order to see the page and save changes. This hooks into the + Django :ref:`authentication system <topics-auth>`. By default, this is + ``False``. + + If this is ``True``, and a non-logged-in user attempts to visit this page + or save the form, Django will redirect the request to ``/accounts/login/``. + + * ``template_name``: The full name of a template to use in rendering the + page. This lets you override the default template name (see below). + + * ``template_loader``: The template loader to use when loading the + template. By default, it's ``django.template.loader``. + + * ``extra_context``: A dictionary of values to add to the template + context. By default, this is an empty dictionary. If a value in the + dictionary is callable, the generic view will call it + just before rendering the template. + + * ``context_processors``: A list of template-context processors to apply to + the view's template. + + * ``template_object_name``: Designates the name of the template variable + to use in the template context. By default, this is ``'object'``. + +**Template name:** + +If ``template_name`` isn't specified, this view will use the template +``<app_label>/<model_name>_confirm_delete.html`` by default. + +**Template context:** + +In addition to ``extra_context``, the template's context will be: + + * ``object``: The original object that's about to be deleted. This + variable's name depends on the ``template_object_name`` parameter, which + is ``'object'`` by default. If ``template_object_name`` is ``'foo'``, + this variable's name will be ``foo``. diff --git a/docs/ref/index.txt b/docs/ref/index.txt new file mode 100644 index 0000000000..ac71175abf --- /dev/null +++ b/docs/ref/index.txt @@ -0,0 +1,21 @@ +.. _ref-index: + +API Reference +============= + +.. toctree:: + :maxdepth: 1 + + contrib/index + databases + django-admin + forms/index + generic-views + middleware + models/index + request-response + settings + templates/index + unicode + files/index + \ No newline at end of file diff --git a/docs/ref/middleware.txt b/docs/ref/middleware.txt new file mode 100644 index 0000000000..48a3e81cc4 --- /dev/null +++ b/docs/ref/middleware.txt @@ -0,0 +1,200 @@ +.. _ref-middleware: + +============================= +Built-in middleware reference +============================= + +.. module:: django.middleware + :synopsis: Django's built-in middleware classes. + +This document explains all middleware components that come with Django. For +information on how how to use them and how to write your own middleware, see the +:ref:`middleware usage guide <topics-http-middleware>`. + +Available middleware +==================== + +Cache middleware +---------------- + +.. module:: django.middleware.cache + :synopsis: Middleware for the site-wide cache + +.. class:: django.middleware.cache.CacheMiddleware + +Enables the site-wide cache. If this is enabled, each Django-powered page will +be cached for as long as the :setting:`CACHE_MIDDLEWARE_SECONDS` setting +defines. See the :ref:`cache documentation <topics-cache>`. + +"Common" middleware +------------------- + +.. module:: django.middleware.common + :synopsis: Middleware adding "common" conveniences for perfectionists. + +.. class:: django.middleware.common.CommonMiddleware + +Adds a few conveniences for perfectionists: + + * Forbids access to user agents in the :setting:`DISALLOWED_USER_AGENTS` + setting, which should be a list of strings. + + * Performs URL rewriting based on the :setting:`APPEND_SLASH` and + :setting:`PREPEND_WWW` settings. + + If :setting:`APPEND_SLASH` is ``True`` and the initial URL doesn't end + with a slash, and it is not found in the URLconf, then a new URL is formed + by appending a slash at the end. If this new URL is found in the URLconf, + then Django redirects the request to this new URL. Otherwise, the initial + URL is processed as usual. + + For example, ``foo.com/bar`` will be redirected to ``foo.com/bar/`` if you + don't have a valid URL pattern for ``foo.com/bar`` but *do* have a valid + pattern for ``foo.com/bar/``. + + **New in Django development version:** The behavior of + :setting:`APPEND_SLASH` has changed slightly in the development version. + It didn't used to check whether the pattern was matched in the URLconf. + + If :setting:`PREPEND_WWW` is ``True``, URLs that lack a leading "www." + will be redirected to the same URL with a leading "www." + + Both of these options are meant to normalize URLs. The philosophy is that + each URL should exist in one, and only one, place. Technically a URL + ``foo.com/bar`` is distinct from ``foo.com/bar/`` -- a search-engine + indexer would treat them as separate URLs -- so it's best practice to + normalize URLs. + + * Handles ETags based on the :setting:`USE_ETAGS` setting. If + :setting:`USE_ETAGS` is set to ``True``, Django will calculate an ETag for + each request by MD5-hashing the page content, and it'll take care of + sending ``Not Modified`` responses, if appropriate. + +View metadata middleware +------------------------ + +.. module:: django.middleware.doc + :synopsis: Middleware to help your app self-document. + +.. class:: django.middleware.doc.XViewMiddleware + +Sends custom ``X-View`` HTTP headers to HEAD requests that come from IP +addresses defined in the :setting:`INTERNAL_IPS` setting. This is used by +Django's automatic documentation system. + +GZIP middleware +--------------- + +.. module:: django.middleware.gzip + :synopsis: Middleware to serve gziped content for performance. + +.. class:: django.middleware.gzip.GZipMiddleware + +Compresses content for browsers that understand gzip compression (all modern +browsers). + +It is suggested to place this first in the middleware list, so that the +compression of the response content is the last thing that happens. Will not +compress content bodies less than 200 bytes long, when the response code is +something other than 200, JavaScript files (for IE compatibility), or +responses that have the ``Content-Encoding`` header already specified. + +Conditional GET middleware +-------------------------- + +.. module:: django.middleware.http + :synopsis: Middleware handling advanced HTTP features. + +.. class:: django.middleware.http.ConditionalGetMiddleware + +Handles conditional GET operations. If the response has a ``ETag`` or +``Last-Modified`` header, and the request has ``If-None-Match`` or +``If-Modified-Since``, the response is replaced by an +:class:`~django.http.HttpNotModified`. + +Also sets the ``Date`` and ``Content-Length`` response-headers. + +Reverse proxy middleware +------------------------ + +.. class:: django.middleware.http.SetRemoteAddrFromForwardedFor + +Sets ``request.META['REMOTE_ADDR']`` based on +``request.META['HTTP_X_FORWARDED_FOR']``, if the latter is set. This is useful +if you're sitting behind a reverse proxy that causes each request's +``REMOTE_ADDR`` to be set to ``127.0.0.1``. + +**Important note:** This does NOT validate ``HTTP_X_FORWARDED_FOR``. If you're +not behind a reverse proxy that sets ``HTTP_X_FORWARDED_FOR`` automatically, do +not use this middleware. Anybody can spoof the value of +``HTTP_X_FORWARDED_FOR``, and because this sets ``REMOTE_ADDR`` based on +``HTTP_X_FORWARDED_FOR``, that means anybody can "fake" their IP address. Only +use this when you can absolutely trust the value of ``HTTP_X_FORWARDED_FOR``. + +Locale middleware +----------------- + +.. module:: django.middleware.locale + :synopsis: Middleware to enable language selection based on the request. + +.. class:: django.middleware.locale.LocaleMiddleware + +Enables language selection based on data from the request. It customizes content +for each user. See the :ref:`internationalization documentation <topics-i18n>`. + +Session middleware +------------------ + +.. module:: django.contrib.sessions.middleware + :synopsis: Session middleware. + +.. class:: django.contrib.sessions.middleware.SessionMiddleware + +Enables session support. See the :ref:`session documentation +<topics-http-sessions>`. + +Authentication middleware +------------------------- + +.. module:: django.contrib.auth.middleware + :synopsis: Authentication middleware + +.. class:: django.contrib.auth.middleware.AuthenticationMiddleware + +Adds the ``user`` attribute, representing the currently-logged-in user, to every +incoming ``HttpRequest`` object. See :ref:` Authentication in Web requests +<topics-http-auth>`. + +CSRF protection middleware +-------------------------- + +.. module:: django.contrib.csrf.middleware + :synopsis: Middleware adding protection against Cross Site Request Forgeries. + +.. class:: django.contrib.csrf.middleware.CsrfMiddleware + +**New in Django development version** + +Adds protection against Cross Site Request Forgeries by adding hidden form +fields to POST forms and checking requests for the correct value. See the +:ref:`Cross Site Request Forgery protection documentation <ref-contrib-csrf>`. + +Transaction middleware +---------------------- + +.. module:: django.middleware.transaction + :synopsis: Middleware binding a database transaction to each web request. + +.. class:: django.middleware.transaction.TransactionMiddleware + +Binds commit and rollback to the request/response phase. If a view function runs +successfully, a commit is done. If it fails with an exception, a rollback is +done. + +The order of this middleware in the stack is important: middleware modules +running outside of it run with commit-on-save - the default Django behavior. +Middleware modules running inside it (coming later in the stack) will be under +the same transaction control as the view functions. + +See the :ref:`transaction management documentation <topics-db-transactions>`. + diff --git a/docs/ref/models/fields.txt b/docs/ref/models/fields.txt new file mode 100644 index 0000000000..f0638d1ea5 --- /dev/null +++ b/docs/ref/models/fields.txt @@ -0,0 +1,902 @@ +.. _ref-models-fields: + +===================== +Model field reference +===================== + +.. module:: django.db.models.fields + :synopsis: Built-in field types. + +This document contains all the gory details about all the `field options`_ and +`field types`_ Django's got to offer. + +.. seealso:: + + If the built-in fields don't do the trick, you can easily :ref:`write your + own custom model fields <howto-custom-model-fields>`. + +.. note:: + + Technically, these models are defined in :mod:`django.db.models.fields`, but + for convenience they're imported into :mod:`django.db.models`; the standard + convention is to use ``from django.db import models`` and refer to fields as + ``models.<Foo>Field``. + +.. _common-model-field-options: + +Field options +============= + +The following arguments are available to all field types. All are optional. + +``null`` +-------- + +.. attribute:: Field.null + +If ``True``, Django will store empty values as ``NULL`` in the database. Default +is ``False``. + +Note that empty string values will always get stored as empty strings, not as +``NULL``. Only use ``null=True`` for non-string fields such as integers, +booleans and dates. For both types of fields, you will also need to set +``blank=True`` if you wish to permit empty values in forms, as the +:attr:`~Field.null` parameter only affects database storage (see +:attr:`~Field.blank`). + +Avoid using :attr:`~Field.null` on string-based fields such as +:class:`CharField` and :class:`TextField` unless you have an excellent reason. +If a string-based field has ``null=True``, that means it has two possible values +for "no data": ``NULL``, and the empty string. In most cases, it's redundant to +have two possible values for "no data;" Django convention is to use the empty +string, not ``NULL``. + +.. note:: + + When using the Oracle database backend, the ``null=True`` option will be + coerced for string-based fields that can blank, and the value ``NULL`` will + be stored to denote the empty string. + +``blank`` +--------- + +.. attribute:: Field.blank + +If ``True``, the field is allowed to be blank. Default is ``False``. + +Note that this is different than :attr:`~Field.null`. :attr:`~Field.null` is +purely database-related, whereas :attr:`~Field.blank` is validation-related. If +a field has ``blank=True``, validation on Django's admin site will allow entry +of an empty value. If a field has ``blank=False``, the field will be required. + +``choices`` +----------- + +.. attribute:: Field.choices + +An iterable (e.g., a list or tuple) of 2-tuples to use as choices for this +field. + +If this is given, Django's admin will use a select box instead of the standard +text field and will limit choices to the choices given. + +A choices list looks like this:: + + YEAR_IN_SCHOOL_CHOICES = ( + ('FR', 'Freshman'), + ('SO', 'Sophomore'), + ('JR', 'Junior'), + ('SR', 'Senior'), + ('GR', 'Graduate'), + ) + +The first element in each tuple is the actual value to be stored. The second +element is the human-readable name for the option. + +The choices list can be defined either as part of your model class:: + + class Foo(models.Model): + GENDER_CHOICES = ( + ('M', 'Male'), + ('F', 'Female'), + ) + gender = models.CharField(max_length=1, choices=GENDER_CHOICES) + +or outside your model class altogether:: + + GENDER_CHOICES = ( + ('M', 'Male'), + ('F', 'Female'), + ) + class Foo(models.Model): + gender = models.CharField(max_length=1, choices=GENDER_CHOICES) + +You can also collect your available choices into named groups that can +be used for organizational purposes:: + + MEDIA_CHOICES = ( + ('Audio', ( + ('vinyl', 'Vinyl'), + ('cd', 'CD'), + ) + ), + ('Video', ( + ('vhs', 'VHS Tape'), + ('dvd', 'DVD'), + ) + ), + ('unknown', 'Unknown'), + ) + +The first element in each tuple is the name to apply to the group. The +second element is an iterable of 2-tuples, with each 2-tuple containing +a value and a human-readable name for an option. Grouped options may be +combined with ungrouped options within a single list (such as the +`unknown` option in this example). + +For each model field that has :attr:`~Field.choices` set, Django will add a +method to retrieve the human-readable name for the field's current value. See +:meth:`~django.db.models.Model.get_FOO_display` in the database API +documentation. + +Finally, note that choices can be any iterable object -- not necessarily a list +or tuple. This lets you construct choices dynamically. But if you find yourself +hacking :attr:`~Field.choices` to be dynamic, you're probably better off using a +proper database table with a :class:`ForeignKey`. :attr:`~Field.choices` is +meant for static data that doesn't change much, if ever. + +``core`` +-------- + +.. attribute:: Field.core + +For objects that are edited inline to a related object. + +In the Django admin, if all "core" fields in an inline-edited object are +cleared, the object will be deleted. + +It is an error to have an inline-editable relation without at least one +``core=True`` field. + +Please note that each field marked "core" is treated as a required field by the +Django admin site. Essentially, this means you should put ``core=True`` on all +required fields in your related object that is being edited inline. + +``db_column`` +------------- + +.. attribute:: Field.db_column + +The name of the database column to use for this field. If this isn't given, +Django will use the field's name. + +If your database column name is an SQL reserved word, or contains +characters that aren't allowed in Python variable names -- notably, the +hyphen -- that's OK. Django quotes column and table names behind the +scenes. + +``db_index`` +------------ + +.. attribute:: Field.db_index + +If ``True``, djadmin:`django-admin.py sqlindexes <sqlindexes>` will output a +``CREATE INDEX`` statement for this field. + +``db_tablespace`` +----------------- + +.. attribute:: Field.db_tablespace + +**New in Django development version** + +The name of the database tablespace to use for this field's index, if this field +is indexed. The default is the project's :setting:`DEFAULT_INDEX_TABLESPACE` +setting, if set, or the :attr:`~Field.db_tablespace` of the model, if any. If +the backend doesn't support tablespaces, this option is ignored. + +``default`` +----------- + +.. attribute:: Field.default + +The default value for the field. This can be a value or a callable object. If +callable it will be called every time a new object is created. + +``editable`` +------------ + +.. attribute:: Field.editable + +If ``False``, the field will not be editable in the admin or via forms +automatically generated from the model class. Default is ``True``. + +``help_text`` +------------- + +.. attribute:: Field.help_text + +Extra "help" text to be displayed under the field on the object's admin form. +It's useful for documentation even if your object doesn't have an admin form. + +Note that this value is *not* HTML-escaped when it's displayed in the admin +interface. This lets you include HTML in :attr:`~Field.help_text` if you so +desire. For example:: + + help_text="Please use the following format: <em>YYYY-MM-DD</em>." + +Alternatively you can use plain text and +``django.utils.html.escape()`` to escape any HTML special characters. + +``primary_key`` +--------------- + +.. attribute:: Field.primary_key + +If ``True``, this field is the primary key for the model. + +If you don't specify ``primary_key=True`` for any fields in your model, Django +will automatically add an :class:`IntegerField` to hold the primary key, so you +don't need to set ``primary_key=True`` on any of your fields unless you want to +override the default primary-key behavior. For more, see +:ref:`automatic-primary-key-fields`. + +``primary_key=True`` implies :attr:`null=False <Field.null>` and :attr:`unique=True <Field.unique>`. +Only one primary key is allowed on an object. + +``unique`` +---------- + +.. attribute:: Field.unique + +If ``True``, this field must be unique throughout the table. + +This is enforced at the database level and at the Django admin-form level. If +you try to save a model with a duplicate value in a :attr:`~Field.unique` +field, a :exc:`django.db.IntegrityError` will be raised by the model's +:meth:`~django.db.models.Model.save` method. + +This options is valid on all field types except :class:`ManyToManyField`. + +``unique_for_date`` +------------------- + +.. attribute:: Field.unique_for_date + +Set this to the name of a :class:`DateField` or :class:`DateTimeField` to +require that this field be unique for the value of the date field. + +For example, if you have a field ``title`` that has +``unique_for_date="pub_date"``, then Django wouldn't allow the entry of two +records with the same ``title`` and ``pub_date``. + +This is enforced at the Django admin-form level but not at the database level. + +``unique_for_month`` +-------------------- + +.. attribute:: Field.unique_for_month + +Like :attr:`~Field.unique_for_date`, but requires the field to be unique with +respect to the month. + +``unique_for_year`` +------------------- + +.. attribute:: Field.unique_for_year + +Like :attr:`~Field.unique_for_date` and :attr:`~Field.unique_for_month`. + +``validator_list`` +------------------ + +.. attribute:: Field.validator_list + +A list of extra validators to apply to the field. Each should be a callable that +takes the parameters ``field_data, all_data`` and raises +:exc:`django.core.validators.ValidationError` for errors. + +.. _model-field-types: + +Field types +=========== + +.. currentmodule:: django.db.models + +``AutoField`` +------------- + +.. class:: AutoField(**options) + +An :class:`IntegerField` that automatically increments +according to available IDs. You usually won't need to use this directly; a +primary key field will automatically be added to your model if you don't specify +otherwise. See :ref:`automatic-primary-key-fields`. + +``BooleanField`` +---------------- + +.. class:: BooleanField(**options) + +A true/false field. + +The admin represents this as a checkbox. + +``CharField`` +------------- + +.. class:: CharField(max_length=None, [**options]) + +A string field, for small- to large-sized strings. + +For large amounts of text, use :class:`~django.db.models.TextField`. + +The admin represents this as an ``<input type="text">`` (a single-line input). + +:class:`CharField` has one extra required argument: + +.. attribute:: CharField.max_length + + The maximum length (in characters) of the field. The max_length is enforced + at the database level and in Django's validation. + +``CommaSeparatedIntegerField`` +------------------------------ + +.. class:: CommaSeparatedIntegerField(max_length=None, [**options]) + +A field of integers separated by commas. As in :class:`CharField`, the +:attr:`~CharField.max_length` argument is required. + +``DateField`` +------------- + +.. class:: DateField([auto_now=False, auto_now_add=False, **options]) + +A date field. Has a few extra optional arguments: + +.. attribute:: DateField.auto_now + + Automatically set the field to now every time the object is saved. Useful + for "last-modified" timestamps. Note that the current date is *always* used; + it's not just a default value that you can override. + +.. attribute:: DateField.auto_now_add + + Automatically set the field to now when the object is first created. Useful + for creation of timestamps. Note that the current date is *always* used; + it's not just a default value that you can override. + +The admin represents this as an ``<input type="text">`` with a JavaScript +calendar, and a shortcut for "Today". The JavaScript calendar will always start +the week on a Sunday. + +``DateTimeField`` +----------------- + +.. class:: DateTimeField([auto_now=False, auto_now_add=False, **options]) + +A date and time field. Takes the same extra options as :class:`DateField`. + +The admin represents this as two ``<input type="text">`` fields, with JavaScript +shortcuts. + +``DecimalField`` +---------------- + +**New in Django development version** + +.. class:: DecimalField(max_digits=None, decimal_places=None, [**options]) + +A fixed-precision decimal number, represented in Python by a +:class:`~decimal.Decimal` instance. Has two **required** arguments: + +.. attribute:: DecimalField.max_digits + + The maximum number of digits allowed in the number + +.. attribute:: DecimalField.decimal_places + + The number of decimal places to store with the number + +For example, to store numbers up to 999 with a resolution of 2 decimal places, +you'd use:: + + models.DecimalField(..., max_digits=5, decimal_places=2) + +And to store numbers up to approximately one billion with a resolution of 10 +decimal places:: + + models.DecimalField(..., max_digits=19, decimal_places=10) + +The admin represents this as an ``<input type="text">`` (a single-line input). + +``EmailField`` +-------------- + +.. class:: EmailField([max_length=75, **options]) + +A :class:`CharField` that checks that the value is a valid e-mail address. + +In Django 0.96, this doesn't accept :attr:`~CharField.max_length`; its +:class:`~CharField.max_length` is automatically set to 75. In the Django +development version, :class:`~CharField.max_length` is set to 75 by default, but +you can specify it to override default behavior. + +``FileField`` +------------- + +.. class:: FileField(upload_to=None, [max_length=100, **options]) + +A file-upload field. Has one **required** argument: + +.. attribute:: FileField.upload_to + + A local filesystem path that will be appended to your :setting:`MEDIA_ROOT` + setting to determine the output of the ``get_<fieldname>_url()`` helper + function. + + This path may contain `strftime formatting`_, which will be replaced by the + date/time of the file upload (so that uploaded files don't fill up the given + directory). + + **New in Django development version** + + This may also be a callable, such as a function, which will be called to + obtain the upload path, including the filename. This callable must be + able to accept two arguments, and return a Unix-style path (with forward + slashes) to be passed along to the storage system. The two arguments that will + be passed are: + + ====================== =============================================== + Argument Description + ====================== =============================================== + ``instance`` An instance of the model where the + ``FileField`` is defined. More specifically, + this is the particular instance where the + current file is being attached. + + In most cases, this object will not have been + saved to the database yet, so if it uses the + default ``AutoField``, *it might not yet have a + value for its primary key field*. + + ``filename`` The filename that was originally given to the + file. This may or may not be taken into account + when determining the final destination path. + ====================== =============================================== + +Also has one optional argument: + +.. attribute:: FileField.storage + + **New in Django development version.** + + Optional. A storage object, which handles the storage and retrieval of your + files. See :ref:`topics-files` for details on how to provide this object. + +The admin represents this field as an ``<input type="file">`` (a file-upload +widget). + +Using a :class:`FileField` or an :class:`ImageField` (see below) in a model +takes a few steps: + + 1. In your settings file, you'll need to define :setting:`MEDIA_ROOT` as the + full path to a directory where you'd like Django to store uploaded files. + (For performance, these files are not stored in the database.) Define + :setting:`MEDIA_URL` as the base public URL of that directory. Make sure + that this directory is writable by the Web server's user account. + + 2. Add the :class:`FileField` or :class:`ImageField` to your model, making + sure to define the :attr:`~FileField.upload_to` option to tell Django to + which subdirectory of :setting:`MEDIA_ROOT` it should upload files. + + 3. All that will be stored in your database is a path to the file + (relative to :setting:`MEDIA_ROOT`). You'll most likely want to use the + convenience ``get_<fieldname>_url`` function provided by Django. For + example, if your :class:`ImageField` is called ``mug_shot``, you can get + the absolute URL to your image in a template with ``{{ + object.get_mug_shot_url }}``. + +For example, say your :setting:`MEDIA_ROOT` is set to ``'/home/media'``, and +:attr:`~FileField.upload_to` is set to ``'photos/%Y/%m/%d'``. The ``'%Y/%m/%d'`` +part of :attr:`~FileField.upload_to` is `strftime formatting`_; ``'%Y'`` is the +four-digit year, ``'%m'`` is the two-digit month and ``'%d'`` is the two-digit +day. If you upload a file on Jan. 15, 2007, it will be saved in the directory +``/home/media/photos/2007/01/15``. + +If you want to retrieve the upload file's on-disk filename, or a URL that refers +to that file, or the file's size, you can use the ``File.name``, ``File.url`` +and ``File.size`` attributes; see :ref:`topics-files`. + +Note that whenever you deal with uploaded files, you should pay close attention +to where you're uploading them and what type of files they are, to avoid +security holes. *Validate all uploaded files* so that you're sure the files are +what you think they are. For example, if you blindly let somebody upload files, +without validation, to a directory that's within your Web server's document +root, then somebody could upload a CGI or PHP script and execute that script by +visiting its URL on your site. Don't allow that. + +**New in development version:** By default, :class:`FileField` instances are +created as ``varchar(100)`` columns in your database. As with other fields, you +can change the maximum length using the :attr:`~CharField.max_length` argument. + +.. _`strftime formatting`: http://docs.python.org/lib/module-time.html#l2h-1941 + +``FilePathField`` +----------------- + +.. class:: FilePathField(path=None, [match=None, recursive=False, max_length=100, **options]) + +A :class:`CharField` whose choices are limited to the filenames in a certain +directory on the filesystem. Has three special arguments, of which the first is +**required**: + +.. attribute:: FilePathField.path + + Required. The absolute filesystem path to a directory from which this + :class:`FilePathField` should get its choices. Example: ``"/home/images"``. + +.. attribute:: FilePathField.match + + Optional. A regular expression, as a string, that :class:`FilePathField` + will use to filter filenames. Note that the regex will be applied to the + base filename, not the full path. Example: ``"foo.*\.txt$"``, which will + match a file called ``foo23.txt`` but not ``bar.txt`` or ``foo23.gif``. + +.. attribute:: FilePathField.recursive + + Optional. Either ``True`` or ``False``. Default is ``False``. Specifies + whether all subdirectories of :attr:`~FilePathField.path` should be included + +Of course, these arguments can be used together. + +The one potential gotcha is that :attr:`~FilePathField.match` applies to the +base filename, not the full path. So, this example:: + + FilePathField(path="/home/images", match="foo.*", recursive=True) + +...will match ``/home/images/foo.gif`` but not ``/home/images/foo/bar.gif`` +because the :attr:`~FilePathField.match` applies to the base filename +(``foo.gif`` and ``bar.gif``). + +**New in development version:** By default, :class:`FilePathField` instances are +created as ``varchar(100)`` columns in your database. As with other fields, you +can change the maximum length using the :attr:`~CharField.max_length` argument. + +``FloatField`` +-------------- + +.. class:: FloatField([**options]) + +**Changed in Django development version** + +A floating-point number represented in Python by a ``float`` instance. + +The admin represents this as an ``<input type="text">`` (a single-line input). + +**NOTE:** The semantics of :class:`FloatField` have changed in the Django +development version. See the `Django 0.96 documentation`_ for the old behavior. + +.. _Django 0.96 documentation: http://www.djangoproject.com/documentation/0.96/model-api/#floatfield + +``ImageField`` +-------------- + +.. class:: ImageField(upload_to-None, [height_field=None, width_field=None, max_length=100, **options]) + +Like :class:`FileField`, but validates that the uploaded object is a valid +image. Has two extra optional arguments: + +.. attribute:: ImageField.height_field + + Name of a model field which will be auto-populated with the height of the + image each time the model instance is saved. + +.. attribute:: ImageField.width_field` + + Name of a model field which will be auto-populated with the width of the + image each time the model instance is saved. + +In addition to the special attributes that are available for :class:`FileField`, +an :class:`ImageField` also has ``File.height`` and ``File.width`` attributes. +See :ref:`topics-files`. + +Requires the `Python Imaging Library`_. + +.. _Python Imaging Library: http://www.pythonware.com/products/pil/ + +**New in development version:** By default, :class:`ImageField` instances are +created as ``varchar(100)`` columns in your database. As with other fields, you +can change the maximum length using the :attr:`~CharField.max_length` argument. + +``IntegerField`` +---------------- + +.. class:: IntegerField([**options]) + +An integer. The admin represents this as an ``<input type="text">`` (a +single-line input). + +``IPAddressField`` +------------------ + +.. class:: IPAddressField([**options]) + +An IP address, in string format (e.g. "192.0.2.30"). The admin represents this +as an ``<input type="text">`` (a single-line input). + +``NullBooleanField`` +-------------------- + +.. class:: NullBooleanField([**options]) + +Like a :class:`BooleanField`, but allows ``NULL`` as one of the options. Use +this instead of a :class:`BooleanField` with ``null=True``. The admin represents +this as a ``<select>`` box with "Unknown", "Yes" and "No" choices. + +``PhoneNumberField`` +-------------------- + +.. class:: PhoneNumberField([**options]) + +A :class:`CharField` that checks that the value is a valid U.S.A.-style phone +number (in the format ``XXX-XXX-XXXX``). + +``PositiveIntegerField`` +------------------------ + +.. class:: PositiveIntegerField([**options]) + +Like an :class:`IntegerField`, but must be positive. + +``PositiveSmallIntegerField`` +----------------------------- + +.. class:: PositiveIntegerField([**options]) + +Like a :class:`PositiveIntegerField`, but only allows values under a certain +(database-dependent) point. + +``SlugField`` +------------- + +.. class:: SlugField([max_length=50, **options]) + +:term:`Slug` is a newspaper term. A slug is a short label for something, +containing only letters, numbers, underscores or hyphens. They're generally used +in URLs. + +Like a CharField, you can specify :attr:`~CharField.max_length`. If +:attr:`~CharField.max_length` is not specified, Django will use a default length +of 50. + +Implies setting :attr:`Field.db_index` to ``True``. + +``SmallIntegerField`` +--------------------- + +.. class:: SmallIntegerField([**options]) + +Like an :class:`IntegerField`, but only allows values under a certain +(database-dependent) point. + +``TextField`` +------------- + +.. class:: TextField([**options]) + +A large text field. The admin represents this as a ``<textarea>`` (a multi-line +input). + +``TimeField`` +------------- + +.. class:: TimeField([auto_now=False, auto_now_add=False, **options]) + +A time. Accepts the same auto-population options as :class:`DateField` and +:class:`DateTimeField`. The admin represents this as an ``<input type="text">`` +with some JavaScript shortcuts. + +``URLField`` +------------ + +.. class:: URLField([verify_exists=True, max_length=200, **options]) + +A :class:`CharField` for a URL. Has one extra optional argument: + +.. attribute:: URLField.verify_exists + + If ``True`` (the default), the URL given will be checked for existence + (i.e., the URL actually loads and doesn't give a 404 response). + +The admin represents this as an ``<input type="text">`` (a single-line input). + +Like all ::class:`CharField` subclasses, :class:`URLField` takes the optional +:attr:`~CharField.max_length`argument. If you don't specify +:attr:`~CharField.max_length`, a default of 200 is used. + +``USStateField`` +---------------- + +.. class:: USStateField([**options]) + +A two-letter U.S. state abbreviation. The admin represents this as an ``<input +type="text">`` (a single-line input). + +``XMLField`` +------------ + +.. class:: XMLField(schema_path=None, [**options]) + +A :class:`TextField` that checks that the value is valid XML that matches a +given schema. Takes one required argument: + +.. attribute:: schema_path + + The filesystem path to a RelaxNG_ schema against which to validate the + field. + +.. _RelaxNG: http://www.relaxng.org/ + +Relationship fields +=================== + +.. module:: django.db.models.fields.related + :synopsis: Related field types + +.. currentmodule:: django.db.models + +Django also defines a set of fields that represent relations. + +.. _ref-foreignkey: + +``ForeignKey`` +-------------- + +.. class:: ForeignKey(othermodel, [**options]) + +A many-to-one relationship. Requires a positional argument: the class to which +the model is related. + +.. _recursive-relationships: + +To create a recursive relationship -- an object that has a many-to-one +relationship with itself -- use ``models.ForeignKey('self')``. + +.. _lazy-relationships: + +If you need to create a relationship on a model that has not yet been defined, +you can use the name of the model, rather than the model object itself:: + + class Car(models.Model): + manufacturer = models.ForeignKey('Manufacturer') + # ... + + class Manufacturer(models.Model): + # ... + +Note, however, that this only refers to models in the same ``models.py`` file -- +you cannot use a string to reference a model defined in another application or +imported from elsewhere. + +**New in Django development version:** To refer to models defined in another +application, you must instead explicitly specify the application label. For +example, if the ``Manufacturer`` model above is defined in another application +called ``production``, you'd need to use:: + + class Car(models.Model): + manufacturer = models.ForeignKey('production.Manufacturer') + +Behind the scenes, Django appends ``"_id"`` to the field name to create its +database column name. In the above example, the database table for the ``Car`` +model will have a ``manufacturer_id`` column. (You can change this explicitly by +specifying :attr:`~Field.db_column`) However, your code should never have to +deal with the database column name, unless you write custom SQL. You'll always +deal with the field names of your model object. + +.. _foreign-key-arguments: + +:class:`ForeignKey` accepts an extra set of arguments -- all optional -- that +define the details of how the relation works. + +.. attribute:: ForeignKey.limit_choices_to + + A dictionary of lookup arguments and values (see :ref:`topics-db-queries`) + that limit the available admin choices for this object. Use this with + functions from the Python ``datetime`` module to limit choices of objects by + date. For example:: + + limit_choices_to = {'pub_date__lte': datetime.now} + + only allows the choice of related objects with a ``pub_date`` before the + current date/time to be chosen. + + Instead of a dictionary this can also be a :class:`~django.db.models.Q` + object (an object with a :meth:`get_sql` method) for more complex queries. + + ``limit_choices_to`` has no effect on the inline FormSets that are created + to display related objects in the admin. + +.. attribute:: ForeignKey.related_name + + The name to use for the relation from the related object back to this one. + See the :ref:`related objects documentation <backwards-related-objects>` for + a full explanation and example. + +.. attribute:: ForeignKey.to_field + + The field on the related object that the relation is to. By default, Django + uses the primary key of the related object. + +.. _ref-manytomany: + +``ManyToManyField`` +------------------- + +.. class:: ManyToManyField(othermodel, [**options]) + +A many-to-many relationship. Requires a positional argument: the class to which +the model is related. This works exactly the same as it does for +:class:`ForeignKey`, including all the options regarding :ref:`recursive +<recursive-relationships>` and :ref:`lazy <lazy-relationships>` relationships. + +Behind the scenes, Django creates an intermediary join table to represent the +many-to-many relationship. By default, this table name is generated using the +names of the two tables being joined. Since some databases don't support table +names above a certain length (often 32 characters), these table names will be +automatically truncated to 32 characters and a uniqueness hash will be used. +This means you might see table names like ``author_books_9cdf4``; this is +perfectly normal. You can manually provide the name of the join table using +the :attr:`~ManyToManyField.db_table` option. + +.. _manytomany-arguments: + +:class:`ManyToManyField` accepts an extra set of arguments -- all optional -- +that control how the relationship functions. + +.. attribute:: ManyToManyField.related_name + + Same as :attr:`ForeignKey.related_name`. + +.. attribute:: ManyToManyFields.limit_choices_to + + Same as :attr:`ForeignKey.limit_choices_to`. + + ``limit_choices_to`` has no effect when used on a ``ManyToManyField`` with + an intermediate table. + +.. attribute:: ManyToManyFields.symmetrical + + Only used in the definition of ManyToManyFields on self. Consider the + following model:: + + class Person(models.Model): + friends = models.ManyToManyField("self") + + When Django processes this model, it identifies that it has a + :class:`ManyToManyField` on itself, and as a result, it doesn't add a + ``person_set`` attribute to the ``Person`` class. Instead, the + :class:`ManyToManyField` is assumed to be symmetrical -- that is, if I am + your friend, then you are my friend. + + If you do not want symmetry in many-to-many relationships with ``self``, set + :attr:`~ManyToManyField.symmetrical` to ``False``. This will force Django to + add the descriptor for the reverse relationship, allowing + :class:`ManyToManyField` relationships to be non-symmetrical. + +.. attribute:: ManyToManyField.db_table + + The name of the table to create for storing the many-to-many data. If this + is not provided, Django will assume a default name based upon the names of + the two tables being joined. + +``OneToOneField`` +----------------- + +.. class:: OneToOneField(othermodel, [**options]) + +The semantics of one-to-one relationships will be changing soon, so we don't +recommend you use them. If that doesn't scare you away, however, +:class:`OneToOneField` takes the same options that :class:`ForeignKey` does, +except for the various :attr:`~ForeignKey.edit_inline`-related options. diff --git a/docs/ref/models/index.txt b/docs/ref/models/index.txt new file mode 100644 index 0000000000..0e0510d707 --- /dev/null +++ b/docs/ref/models/index.txt @@ -0,0 +1,15 @@ +.. _ref-models-index: + +Models +====== + +Model API reference. For introductory material, see :ref:`topics-db-models`. + +.. toctree:: + :maxdepth: 1 + + fields + relations + options + instances + querysets diff --git a/docs/ref/models/instances.txt b/docs/ref/models/instances.txt new file mode 100644 index 0000000000..404d473629 --- /dev/null +++ b/docs/ref/models/instances.txt @@ -0,0 +1,430 @@ +.. _ref-models-instances: + +======================== +Model instance reference +======================== + +.. currentmodule:: django.db.models + +This document describes the details of the ``Model`` API. It builds on the +material presented in the :ref:`model <topics-db-models>` and `database query +<topics-db-queries>` guides, so you'll probably want to read and understand +those documents before reading this one. + +Throughout this reference we'll use the :ref:`example weblog models +<queryset-model-example>` presented in the :ref:`database query guide +<topics-db-queries>`. + +Creating objects +================ + +To create a new instance of a model, just instantiate it like any other Python class: + +.. class:: Model(**kwargs) + +The keyword arguments to are simply the names of the fields you've defined on +your model. Note that instantiating a model in no way touches your database; for +that, you need to ``save()``. + +Saving objects +============== + +To save an object back to the database, call ``save()``: + +.. method:: Model.save([raw=False]) + +Of course, there's some subtleties; see the sections below. + +Auto-incrementing primary keys +------------------------------ + +If a model has an ``AutoField`` -- an auto-incrementing primary key -- then +that auto-incremented value will be calculated and saved as an attribute on +your object the first time you call ``save()``:: + + >>> b2 = Blog(name='Cheddar Talk', tagline='Thoughts on cheese.') + >>> b2.id # Returns None, because b doesn't have an ID yet. + >>> b2.save() + >>> b2.id # Returns the ID of your new object. + +There's no way to tell what the value of an ID will be before you call +``save()``, because that value is calculated by your database, not by Django. + +(For convenience, each model has an ``AutoField`` named ``id`` by default +unless you explicitly specify ``primary_key=True`` on a field. See the +documentation for ``AutoField`` for more details. + +The ``pk`` property +~~~~~~~~~~~~~~~~~~~ + +**New in Django development version** + +.. attribute:: Model.pk + +Regardless of whether you define a primary key field yourself, or let Django +supply one for you, each model will have a property called ``pk``. It behaves +like a normal attribute on the model, but is actually an alias for whichever +attribute is the primary key field for the model. You can read and set this +value, just as you would for any other attribute, and it will update the +correct field in the model. + +Explicitly specifying auto-primary-key values +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +If a model has an ``AutoField`` but you want to define a new object's ID +explicitly when saving, just define it explicitly before saving, rather than +relying on the auto-assignment of the ID:: + + >>> b3 = Blog(id=3, name='Cheddar Talk', tagline='Thoughts on cheese.') + >>> b3.id # Returns 3. + >>> b3.save() + >>> b3.id # Returns 3. + +If you assign auto-primary-key values manually, make sure not to use an +already-existing primary-key value! If you create a new object with an explicit +primary-key value that already exists in the database, Django will assume you're +changing the existing record rather than creating a new one. + +Given the above ``'Cheddar Talk'`` blog example, this example would override the +previous record in the database:: + + b4 = Blog(id=3, name='Not Cheddar', tagline='Anything but cheese.') + b4.save() # Overrides the previous blog with ID=3! + +See `How Django knows to UPDATE vs. INSERT`_, below, for the reason this +happens. + +Explicitly specifying auto-primary-key values is mostly useful for bulk-saving +objects, when you're confident you won't have primary-key collision. + +What happens when you save? +--------------------------- + +When you save an object, Django performs the following steps: + + 1. **Emit a ``pre_save`` signal.** This provides a notification that + an object is about to be saved. You can register a listener that + will be invoked whenever this signal is emitted. (These signals are + not yet documented.) + + 2. **Pre-process the data.** Each field on the object is asked to + perform any automated data modification that the field may need + to perform. + + Most fields do *no* pre-processing -- the field data is kept as-is. + Pre-processing is only used on fields that have special behavior. + For example, if your model has a ``DateField`` with ``auto_now=True``, + the pre-save phase will alter the data in the object to ensure that + the date field contains the current date stamp. (Our documentation + doesn't yet include a list of all the fields with this "special + behavior.") + + 3. **Prepare the data for the database.** Each field is asked to provide + its current value in a data type that can be written to the database. + + Most fields require *no* data preparation. Simple data types, such as + integers and strings, are 'ready to write' as a Python object. However, + more complex data types often require some modification. + + For example, ``DateFields`` use a Python ``datetime`` object to store + data. Databases don't store ``datetime`` objects, so the field value + must be converted into an ISO-compliant date string for insertion + into the database. + + 4. **Insert the data into the database.** The pre-processed, prepared + data is then composed into an SQL statement for insertion into the + database. + + 5. **Emit a ``post_save`` signal.** As with the ``pre_save`` signal, this + is used to provide notification that an object has been successfully + saved. (These signals are not yet documented.) + +Raw saves +~~~~~~~~~ + +**New in Django development version** + +The pre-processing step (#2 in the previous section) is useful, but it modifies +the data stored in a field. This can cause problems if you're relying upon the +data you provide being used as-is. + +For example, if you're setting up conditions for a test, you'll want the test +conditions to be repeatable. If pre-processing is performed, the data used +to specify test conditions may be modified, changing the conditions for the +test each time the test is run. + +In cases such as this, you need to prevent pre-processing from being performed +when you save an object. To do this, you can invoke a **raw save** by passing +``raw=True`` as an argument to the ``save()`` method:: + + b4.save(raw=True) # Save object, but do no pre-processing + +A raw save skips the usual data pre-processing that is performed during the +save. All other steps in the save (pre-save signal, data preparation, data +insertion, and post-save signal) are performed as normal. + +.. admonition:: When to use a raw save + + Generally speaking, you shouldn't need to use a raw save. Disabling field + pre-processing is an extraordinary measure that should only be required + in extraordinary circumstances, such as setting up reliable test + conditions. + + +How Django knows to UPDATE vs. INSERT +------------------------------------- + +You may have noticed Django database objects use the same ``save()`` method +for creating and changing objects. Django abstracts the need to use ``INSERT`` +or ``UPDATE`` SQL statements. Specifically, when you call ``save()``, Django +follows this algorithm: + + * If the object's primary key attribute is set to a value that evaluates to + ``True`` (i.e., a value other than ``None`` or the empty string), Django + executes a ``SELECT`` query to determine whether a record with the given + primary key already exists. + * If the record with the given primary key does already exist, Django + executes an ``UPDATE`` query. + * If the object's primary key attribute is *not* set, or if it's set but a + record doesn't exist, Django executes an ``INSERT``. + +The one gotcha here is that you should be careful not to specify a primary-key +value explicitly when saving new objects, if you cannot guarantee the +primary-key value is unused. For more on this nuance, see `Explicitly specifying +auto-primary-key values`_ above and `Forcing an INSERT or UPDATE`_ below. + +Forcing an INSERT or UPDATE +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**New in Django development version** + +In some rare circumstances, it's necessary to be able to force the ``save()`` +method to perform an SQL ``INSERT`` and not fall back to doing an ``UPDATE``. +Or vice-versa: update, if possible, but not insert a new row. In these cases +you can pass the ``force_insert=True`` or ``force_update=True`` parameters to +the ``save()`` method. Passing both parameters is an error, since you cannot +both insert *and* update at the same time. + +It should be very rare that you'll need to use these parameters. Django will +almost always do the right thing and trying to override that will lead to +errors that are difficult to track down. This feature is for advanced use +only. + +.. _model-instance-methods: + +Other model instance methods +============================ + +A few object methods have special purposes. + +``__str__`` +----------- + +.. method:: Model.__str__() + +``__str__()`` is a Python "magic method" that defines what should be returned +if you call ``str()`` on the object. Django uses ``str(obj)`` (or the related +function, ``unicode(obj)`` -- see below) in a number of places, most notably +as the value displayed to render an object in the Django admin site and as the +value inserted into a template when it displays an object. Thus, you should +always return a nice, human-readable string for the object's ``__str__``. +Although this isn't required, it's strongly encouraged (see the description of +``__unicode__``, below, before putting ``__str__`` methods everywhere). + +For example:: + + class Person(models.Model): + first_name = models.CharField(max_length=50) + last_name = models.CharField(max_length=50) + + def __str__(self): + # Note use of django.utils.encoding.smart_str() here because + # first_name and last_name will be unicode strings. + return smart_str('%s %s' % (self.first_name, self.last_name)) + +``__unicode__`` +--------------- + +.. method:: Model.__unicode__() + +The ``__unicode__()`` method is called whenever you call ``unicode()`` on an +object. Since Django's database backends will return Unicode strings in your +model's attributes, you would normally want to write a ``__unicode__()`` +method for your model. The example in the previous section could be written +more simply as:: + + class Person(models.Model): + first_name = models.CharField(max_length=50) + last_name = models.CharField(max_length=50) + + def __unicode__(self): + return u'%s %s' % (self.first_name, self.last_name) + +If you define a ``__unicode__()`` method on your model and not a ``__str__()`` +method, Django will automatically provide you with a ``__str__()`` that calls +``__unicode__()`` and then converts the result correctly to a UTF-8 encoded +string object. This is recommended development practice: define only +``__unicode__()`` and let Django take care of the conversion to string objects +when required. + +``get_absolute_url`` +-------------------- + +.. method:: Model.get_absolute_url() + +Define a ``get_absolute_url()`` method to tell Django how to calculate the +URL for an object. For example:: + + def get_absolute_url(self): + return "/people/%i/" % self.id + +Django uses this in its admin interface. If an object defines +``get_absolute_url()``, the object-editing page will have a "View on site" +link that will jump you directly to the object's public view, according to +``get_absolute_url()``. + +Also, a couple of other bits of Django, such as the :ref:`syndication feed +framework <ref-contrib-syndication>`, use ``get_absolute_url()`` as a +convenience to reward people who've defined the method. + +It's good practice to use ``get_absolute_url()`` in templates, instead of +hard-coding your objects' URLs. For example, this template code is bad:: + + <a href="/people/{{ object.id }}/">{{ object.name }}</a> + +But this template code is good:: + + <a href="{{ object.get_absolute_url }}">{{ object.name }}</a> + +.. note:: + The string you return from ``get_absolute_url()`` must contain only ASCII + characters (required by the URI spec, `RFC 2396`_) that have been + URL-encoded, if necessary. Code and templates using ``get_absolute_url()`` + should be able to use the result directly without needing to do any + further processing. You may wish to use the + ``django.utils.encoding.iri_to_uri()`` function to help with this if you + are using unicode strings a lot. + +.. _RFC 2396: http://www.ietf.org/rfc/rfc2396.txt + +The ``permalink`` decorator +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The problem with the way we wrote ``get_absolute_url()`` above is that it +slightly violates the DRY principle: the URL for this object is defined both +in the URLConf file and in the model. + +You can further decouple your models from the URLconf using the ``permalink`` +decorator: + +.. function:: django.db.models.permalink() + +This decorator is passed the view function, a list of positional parameters and +(optionally) a dictionary of named parameters. Django then works out the correct +full URL path using the URLconf, substituting the parameters you have given into +the URL. For example, if your URLconf contained a line such as:: + + (r'^people/(\d+)/$', 'people.views.details'), + +...your model could have a ``get_absolute_url`` method that looked like this:: + + from django.db import models + + @models.permalink + def get_absolute_url(self): + return ('people.views.details', [str(self.id)]) + +Similarly, if you had a URLconf entry that looked like:: + + (r'/archive/(?P<year>\d{4})/(?P<month>\d{1,2})/(?P<day>\d{1,2})/$', archive_view) + +...you could reference this using ``permalink()`` as follows:: + + @models.permalink + def get_absolute_url(self): + return ('archive_view', (), { + 'year': self.created.year, + 'month': self.created.month, + 'day': self.created.day}) + +Notice that we specify an empty sequence for the second parameter in this case, +because we only want to pass keyword parameters, not positional ones. + +In this way, you're tying the model's absolute URL to the view that is used +to display it, without repeating the URL information anywhere. You can still +use the ``get_absolute_url`` method in templates, as before. + +In some cases, such as the use of generic views or the re-use of +custom views for multiple models, specifying the view function may +confuse the reverse URL matcher (because multiple patterns point to +the same view). + +For that problem, Django has **named URL patterns**. Using a named +URL pattern, it's possible to give a name to a pattern, and then +reference the name rather than the view function. A named URL +pattern is defined by replacing the pattern tuple by a call to +the ``url`` function):: + + from django.conf.urls.defaults import * + + url(r'^people/(\d+)/$', + 'django.views.generic.list_detail.object_detail', + name='people_view'), + +...and then using that name to perform the reverse URL resolution instead +of the view name:: + + from django.db.models import permalink + + def get_absolute_url(self): + return ('people_view', [str(self.id)]) + get_absolute_url = permalink(get_absolute_url) + +More details on named URL patterns are in the :ref:`URL dispatch documentation +<topics-http-urls>`. + +Extra instance methods +====================== + +In addition to ``save()``, ``delete()``, a model object might get any or all +of the following methods: + +get_FOO_display() +----------------- + +For every field that has ``choices`` set, the object will have a +``get_FOO_display()`` method, where ``FOO`` is the name of the field. This +method returns the "human-readable" value of the field. For example, in the +following model:: + + GENDER_CHOICES = ( + ('M', 'Male'), + ('F', 'Female'), + ) + class Person(models.Model): + name = models.CharField(max_length=20) + gender = models.CharField(max_length=1, choices=GENDER_CHOICES) + +...each ``Person`` instance will have a ``get_gender_display()`` method. Example:: + + >>> p = Person(name='John', gender='M') + >>> p.save() + >>> p.gender + 'M' + >>> p.get_gender_display() + 'Male' + +get_next_by_FOO(\**kwargs) and get_previous_by_FOO(\**kwargs) +------------------------------------------------------------- + +For every ``DateField`` and ``DateTimeField`` that does not have ``null=True``, +the object will have ``get_next_by_FOO()`` and ``get_previous_by_FOO()`` +methods, where ``FOO`` is the name of the field. This returns the next and +previous object with respect to the date field, raising the appropriate +``DoesNotExist`` exception when appropriate. + +Both methods accept optional keyword arguments, which should be in the format +described in :ref:`Field lookups <field-lookups>`. + +Note that in the case of identical date values, these methods will use the ID +as a fallback check. This guarantees that no records are skipped or duplicated. diff --git a/docs/ref/models/options.txt b/docs/ref/models/options.txt new file mode 100644 index 0000000000..34ec7a19ed --- /dev/null +++ b/docs/ref/models/options.txt @@ -0,0 +1,175 @@ +.. _ref-models-options: + +====================== +Model ``Meta`` options +====================== + +This document explains all the possible :ref:`metadata options <meta-options>` that you can give your model in its internal ``class Meta``. + +Available ``Meta`` options +========================== + +.. currentmodule:: django.db.models + +``db_table`` +------------ + +.. attribute:: Options.db_table + +The name of the database table to use for the model:: + + db_table = 'music_album' + +.. _table-names: + +Table names +~~~~~~~~~~~ + +To save you time, Django automatically derives the name of the database table +from the name of your model class and the app that contains it. A model's +database table name is constructed by joining the model's "app label" -- the +name you used in ``manage.py startapp`` -- to the model's class name, with an +underscore between them. + +For example, if you have an app ``bookstore`` (as created by +``manage.py startapp bookstore``), a model defined as ``class Book`` will have +a database table named ``bookstore_book``. + +To override the database table name, use the ``db_table`` parameter in +``class Meta``. + +If your database table name is an SQL reserved word, or contains characters that +aren't allowed in Python variable names -- notably, the hyphen -- that's OK. +Django quotes column and table names behind the scenes. + +``db_tablespace`` +----------------- + +.. attribute:: Options.db_tablespace + +**New in Django development version** + +The name of the database tablespace to use for the model. If the backend doesn't +support tablespaces, this option is ignored. + +``get_latest_by`` +----------------- + +.. attribute:: Options.get_latest_by + +The name of a :class:`DateField` or :class:`DateTimeField` in the model. This +specifies the default field to use in your model :class:`Manager`'s +:class:`~QuerySet.latest` method. + +Example:: + + get_latest_by = "order_date" + +See the docs for :meth:`~django.db.models.QuerySet.latest` for more. + +``order_with_respect_to`` +------------------------- + +.. attribute:: Options.order_with_respect_to + +Marks this object as "orderable" with respect to the given field. This is almost +always used with related objects to allow them to be ordered with respect to a +parent object. For example, if an ``Answer`` relates to a ``Question`` object, +and a question has more than one answer, and the order of answers matters, you'd +do this:: + + class Answer(models.Model): + question = models.ForeignKey(Question) + # ... + + class Meta: + order_with_respect_to = 'question' + +``ordering`` +------------ + +.. attribute:: Options.ordering + +The default ordering for the object, for use when obtaining lists of objects:: + + ordering = ['-order_date'] + +This is a tuple or list of strings. Each string is a field name with an optional +"-" prefix, which indicates descending order. Fields without a leading "-" will +be ordered ascending. Use the string "?" to order randomly. + +.. note:: + + Regardless of how many fields are in :attr:`~Options.ordering`, the admin + site uses only the first field. + +For example, to order by a ``pub_date`` field ascending, use this:: + + ordering = ['pub_date'] + +To order by ``pub_date`` descending, use this:: + + ordering = ['-pub_date'] + +To order by ``pub_date`` descending, then by ``author`` ascending, use this:: + + ordering = ['-pub_date', 'author'] + +``permissions`` +--------------- + +.. attribute:: Options.permissions + +Extra permissions to enter into the permissions table when creating this object. +Add, delete and change permissions are automatically created for each object +that has ``admin`` set. This example specifies an extra permission, +``can_deliver_pizzas``:: + + permissions = (("can_deliver_pizzas", "Can deliver pizzas"),) + +This is a list or tuple of 2-tuples in the format ``(permission_code, +human_readable_permission_name)``. + +``unique_together`` +------------------- + +.. attribute:: Options.unique_together + +Sets of field names that, taken together, must be unique:: + + unique_together = (("driver", "restaurant"),) + +This is a list of lists of fields that must be unique when considered together. +It's used in the Django admin and is enforced at the database level (i.e., the +appropriate ``UNIQUE`` statements are included in the ``CREATE TABLE`` +statement). + +**New in Django development version** + +For convenience, unique_together can be a single list when dealing with a single +set of fields:: + + unique_together = ("driver", "restaurant") + +``verbose_name`` +---------------- + +.. attribute:: Options.verbose_name + +A human-readable name for the object, singular:: + + verbose_name = "pizza" + +If this isn't given, Django will use a munged version of the class name: +``CamelCase`` becomes ``camel case``. + +``verbose_name_plural`` +----------------------- + +.. attribute:: Options.verbose_name_plural + +The plural name for the object:: + + verbose_name_plural = "stories" + +If this isn't given, Django will use :attr:`~Options.verbose_name` + ``"s"``. diff --git a/docs/ref/models/querysets.txt b/docs/ref/models/querysets.txt new file mode 100644 index 0000000000..b5de2e3aa2 --- /dev/null +++ b/docs/ref/models/querysets.txt @@ -0,0 +1,1060 @@ +.. _ref-models-querysets: + +====================== +QuerySet API reference +====================== + +.. currentmodule:: django.db.models + +This document describes the details of the ``QuerySet`` API. It builds on the +material presented in the :ref:`model <topics-db-models>` and `database query +<topics-db-queries>` guides, so you'll probably want to read and understand +those documents before reading this one. + +Throughout this reference we'll use the :ref:`example weblog models +<queryset-model-example>` presented in the :ref:`database query guide +<topics-db-queries>`. + +.. _when-querysets-are-evaluated: + +When QuerySets are evaluated +============================ + +Internally, a ``QuerySet`` can be constructed, filter, sliced, and generally +passed around without actually hitting the database. No database activity +actually occurs until you do something to evaluate the queryset. + +You can evaluate a ``QuerySet`` in the following ways: + + * **Iteration.** A ``QuerySet`` is iterable, and it executes its database + query the first time you iterate over it. For example, this will print + the headline of all entries in the database:: + + for e in Entry.objects.all(): + print e.headline + + * **Slicing.** As explained in :ref:`limiting-querysets`, a ``QuerySet`` can + be sliced, using Python's array-slicing syntax. Usually slicing a + ``QuerySet`` returns another (unevaluated )``QuerySet``, but Django will + execute the database query if you use the "step" parameter of slice + syntax. + + * **repr().** A ``QuerySet`` is evaluated when you call ``repr()`` on it. + This is for convenience in the Python interactive interpreter, so you can + immediately see your results when using the API interactively. + + * **len().** A ``QuerySet`` is evaluated when you call ``len()`` on it. + This, as you might expect, returns the length of the result list. + + Note: *Don't* use ``len()`` on ``QuerySet``\s if all you want to do is + determine the number of records in the set. It's much more efficient to + handle a count at the database level, using SQL's ``SELECT COUNT(*)``, + and Django provides a ``count()`` method for precisely this reason. See + ``count()`` below. + + * **list().** Force evaluation of a ``QuerySet`` by calling ``list()`` on + it. For example:: + + entry_list = list(Entry.objects.all()) + + Be warned, though, that this could have a large memory overhead, because + Django will load each element of the list into memory. In contrast, + iterating over a ``QuerySet`` will take advantage of your database to + load data and instantiate objects only as you need them. + +.. _queryset-api: + +QuerySet API +============ + +Though you usually won't create one manually -- you'll go through a :class:`Manager` -- here's the formal declaration of a ``QuerySet``: + +.. class:: QuerySet([model=None]) + +Usually when you'll interact with a ``QuerySet`` you'll use it by :ref:`chaining +filters <chaining-filters>`. To make this work, most ``QuerySet`` methods return new querysets. + +QuerySet methods that return new QuerySets +------------------------------------------ + +Django provides a range of ``QuerySet`` refinement methods that modify either +the types of results returned by the ``QuerySet`` or the way its SQL query is +executed. + +``filter(**kwargs)`` +~~~~~~~~~~~~~~~~~~~~ + +Returns a new ``QuerySet`` containing objects that match the given lookup +parameters. + +The lookup parameters (``**kwargs``) should be in the format described in +`Field lookups`_ below. Multiple parameters are joined via ``AND`` in the +underlying SQL statement. + +``exclude(**kwargs)`` +~~~~~~~~~~~~~~~~~~~~~ + +Returns a new ``QuerySet`` containing objects that do *not* match the given +lookup parameters. + +The lookup parameters (``**kwargs``) should be in the format described in +`Field lookups`_ below. Multiple parameters are joined via ``AND`` in the +underlying SQL statement, and the whole thing is enclosed in a ``NOT()``. + +This example excludes all entries whose ``pub_date`` is later than 2005-1-3 +AND whose ``headline`` is "Hello":: + + Entry.objects.exclude(pub_date__gt=datetime.date(2005, 1, 3), headline='Hello') + +In SQL terms, that evaluates to:: + + SELECT ... + WHERE NOT (pub_date > '2005-1-3' AND headline = 'Hello') + +This example excludes all entries whose ``pub_date`` is later than 2005-1-3 +OR whose headline is "Hello":: + + Entry.objects.exclude(pub_date__gt=datetime.date(2005, 1, 3)).exclude(headline='Hello') + +In SQL terms, that evaluates to:: + + SELECT ... + WHERE NOT pub_date > '2005-1-3' + AND NOT headline = 'Hello' + +Note the second example is more restrictive. + +``order_by(*fields)`` +~~~~~~~~~~~~~~~~~~~~~ + +By default, results returned by a ``QuerySet`` are ordered by the ordering +tuple given by the ``ordering`` option in the model's ``Meta``. You can +override this on a per-``QuerySet`` basis by using the ``order_by`` method. + +Example:: + + Entry.objects.filter(pub_date__year=2005).order_by('-pub_date', 'headline') + +The result above will be ordered by ``pub_date`` descending, then by +``headline`` ascending. The negative sign in front of ``"-pub_date"`` indicates +*descending* order. Ascending order is implied. To order randomly, use ``"?"``, +like so:: + + Entry.objects.order_by('?') + +Note: ``order_by('?')`` queries may be expensive and slow, depending on the +database backend you're using. + +To order by a field in a different table, add the other table's name and a dot, +like so:: + + Entry.objects.order_by('blogs_blog.name', 'headline') + +There's no way to specify whether ordering should be case sensitive. With +respect to case-sensitivity, Django will order results however your database +backend normally orders them. + +Also, note that ``reverse()`` should generally only be called on a +``QuerySet`` which has a defined ordering (e.g., when querying against +a model which defines a default ordering, or when using +``order_by()``). If no such ordering is defined for a given +``QuerySet``, calling ``reverse()`` on it has no real effect (the +ordering was undefined prior to calling ``reverse()``, and will remain +undefined afterward). + + +``distinct()`` +~~~~~~~~~~~~~~ + +Returns a new ``QuerySet`` that uses ``SELECT DISTINCT`` in its SQL query. This +eliminates duplicate rows from the query results. + +By default, a ``QuerySet`` will not eliminate duplicate rows. In practice, this +is rarely a problem, because simple queries such as ``Blog.objects.all()`` +don't introduce the possibility of duplicate result rows. + +However, if your query spans multiple tables, it's possible to get duplicate +results when a ``QuerySet`` is evaluated. That's when you'd use ``distinct()``. + +``values(*fields)`` +~~~~~~~~~~~~~~~~~~~ + +Returns a ``ValuesQuerySet`` -- a ``QuerySet`` that evaluates to a list of +dictionaries instead of model-instance objects. + +Each of those dictionaries represents an object, with the keys corresponding to +the attribute names of model objects. + +This example compares the dictionaries of ``values()`` with the normal model +objects:: + + # This list contains a Blog object. + >>> Blog.objects.filter(name__startswith='Beatles') + [Beatles Blog] + + # This list contains a dictionary. + >>> Blog.objects.filter(name__startswith='Beatles').values() + [{'id': 1, 'name': 'Beatles Blog', 'tagline': 'All the latest Beatles news.'}] + +``values()`` takes optional positional arguments, ``*fields``, which specify +field names to which the ``SELECT`` should be limited. If you specify the +fields, each dictionary will contain only the field keys/values for the fields +you specify. If you don't specify the fields, each dictionary will contain a +key and value for every field in the database table. + +Example:: + + >>> Blog.objects.values() + [{'id': 1, 'name': 'Beatles Blog', 'tagline': 'All the latest Beatles news.'}], + >>> Blog.objects.values('id', 'name') + [{'id': 1, 'name': 'Beatles Blog'}] + +A ``ValuesQuerySet`` is useful when you know you're only going to need values +from a small number of the available fields and you won't need the +functionality of a model instance object. It's more efficient to select only +the fields you need to use. + +Finally, note a ``ValuesQuerySet`` is a subclass of ``QuerySet``, so it has all +methods of ``QuerySet``. You can call ``filter()`` on it, or ``order_by()``, or +whatever. Yes, that means these two calls are identical:: + + Blog.objects.values().order_by('id') + Blog.objects.order_by('id').values() + +The people who made Django prefer to put all the SQL-affecting methods first, +followed (optionally) by any output-affecting methods (such as ``values()``), +but it doesn't really matter. This is your chance to really flaunt your +individualism. + +``dates(field, kind, order='ASC')`` +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Returns a ``DateQuerySet`` -- a ``QuerySet`` that evaluates to a list of +``datetime.datetime`` objects representing all available dates of a particular +kind within the contents of the ``QuerySet``. + +``field`` should be the name of a ``DateField`` or ``DateTimeField`` of your +model. + +``kind`` should be either ``"year"``, ``"month"`` or ``"day"``. Each +``datetime.datetime`` object in the result list is "truncated" to the given +``type``. + + * ``"year"`` returns a list of all distinct year values for the field. + * ``"month"`` returns a list of all distinct year/month values for the field. + * ``"day"`` returns a list of all distinct year/month/day values for the field. + +``order``, which defaults to ``'ASC'``, should be either ``'ASC'`` or +``'DESC'``. This specifies how to order the results. + +Examples:: + + >>> Entry.objects.dates('pub_date', 'year') + [datetime.datetime(2005, 1, 1)] + >>> Entry.objects.dates('pub_date', 'month') + [datetime.datetime(2005, 2, 1), datetime.datetime(2005, 3, 1)] + >>> Entry.objects.dates('pub_date', 'day') + [datetime.datetime(2005, 2, 20), datetime.datetime(2005, 3, 20)] + >>> Entry.objects.dates('pub_date', 'day', order='DESC') + [datetime.datetime(2005, 3, 20), datetime.datetime(2005, 2, 20)] + >>> Entry.objects.filter(headline__contains='Lennon').dates('pub_date', 'day') + [datetime.datetime(2005, 3, 20)] + +``none()`` +~~~~~~~~~~ + +**New in Django development version** + +Returns an ``EmptyQuerySet`` -- a ``QuerySet`` that always evaluates to +an empty list. This can be used in cases where you know that you should +return an empty result set and your caller is expecting a ``QuerySet`` +object (instead of returning an empty list, for example.) + +Examples:: + + >>> Entry.objects.none() + [] + +.. _select-related: + +``select_related()`` +~~~~~~~~~~~~~~~~~~~~ + +Returns a ``QuerySet`` that will automatically "follow" foreign-key +relationships, selecting that additional related-object data when it executes +its query. This is a performance booster which results in (sometimes much) +larger queries but means later use of foreign-key relationships won't require +database queries. + +The following examples illustrate the difference between plain lookups and +``select_related()`` lookups. Here's standard lookup:: + + # Hits the database. + e = Entry.objects.get(id=5) + + # Hits the database again to get the related Blog object. + b = e.blog + +And here's ``select_related`` lookup:: + + # Hits the database. + e = Entry.objects.select_related().get(id=5) + + # Doesn't hit the database, because e.blog has been prepopulated + # in the previous query. + b = e.blog + +``select_related()`` follows foreign keys as far as possible. If you have the +following models:: + + class City(models.Model): + # ... + + class Person(models.Model): + # ... + hometown = models.ForeignKey(City) + + class Book(models.Model): + # ... + author = models.ForeignKey(Person) + +...then a call to ``Book.objects.select_related().get(id=4)`` will cache the +related ``Person`` *and* the related ``City``:: + + b = Book.objects.select_related().get(id=4) + p = b.author # Doesn't hit the database. + c = p.hometown # Doesn't hit the database. + + b = Book.objects.get(id=4) # No select_related() in this example. + p = b.author # Hits the database. + c = p.hometown # Hits the database. + +Note that ``select_related()`` does not follow foreign keys that have +``null=True``. + +Usually, using ``select_related()`` can vastly improve performance because your +app can avoid many database calls. However, in situations with deeply nested +sets of relationships ``select_related()`` can sometimes end up following "too +many" relations, and can generate queries so large that they end up being slow. + +In these situations, you can use the ``depth`` argument to ``select_related()`` +to control how many "levels" of relations ``select_related()`` will actually +follow:: + + b = Book.objects.select_related(depth=1).get(id=4) + p = b.author # Doesn't hit the database. + c = p.hometown # Requires a database call. + +The ``depth`` argument is new in the Django development version. + +``extra(select=None, where=None, params=None, tables=None, order_by=None, select_params=None)`` +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Sometimes, the Django query syntax by itself can't easily express a complex +``WHERE`` clause. For these edge cases, Django provides the ``extra()`` +``QuerySet`` modifier -- a hook for injecting specific clauses into the SQL +generated by a ``QuerySet``. + +By definition, these extra lookups may not be portable to different database +engines (because you're explicitly writing SQL code) and violate the DRY +principle, so you should avoid them if possible. + +Specify one or more of ``params``, ``select``, ``where`` or ``tables``. None +of the arguments is required, but you should use at least one of them. + +``select`` + The ``select`` argument lets you put extra fields in the ``SELECT`` clause. + It should be a dictionary mapping attribute names to SQL clauses to use to + calculate that attribute. + + Example:: + + Entry.objects.extra(select={'is_recent': "pub_date > '2006-01-01'"}) + + As a result, each ``Entry`` object will have an extra attribute, + ``is_recent``, a boolean representing whether the entry's ``pub_date`` is + greater than Jan. 1, 2006. + + Django inserts the given SQL snippet directly into the ``SELECT`` + statement, so the resulting SQL of the above example would be:: + + SELECT blog_entry.*, (pub_date > '2006-01-01') + FROM blog_entry; + + + The next example is more advanced; it does a subquery to give each + resulting ``Blog`` object an ``entry_count`` attribute, an integer count + of associated ``Entry`` objects:: + + Blog.objects.extra( + select={ + 'entry_count': 'SELECT COUNT(*) FROM blog_entry WHERE blog_entry.blog_id = blog_blog.id' + }, + ) + + (In this particular case, we're exploiting the fact that the query will + already contain the ``blog_blog`` table in its ``FROM`` clause.) + + The resulting SQL of the above example would be:: + + SELECT blog_blog.*, (SELECT COUNT(*) FROM blog_entry WHERE blog_entry.blog_id = blog_blog.id) + FROM blog_blog; + + Note that the parenthesis required by most database engines around + subqueries are not required in Django's ``select`` clauses. Also note that + some database backends, such as some MySQL versions, don't support + subqueries. + + **New in Django development version** + In some rare cases, you might wish to pass parameters to the SQL fragments + in ``extra(select=...)```. For this purpose, use the ``select_params`` + parameter. Since ``select_params`` is a sequence and the ``select`` + attribute is a dictionary, some care is required so that the parameters + are matched up correctly with the extra select pieces. In this situation, + you should use a ``django.utils.datastructures.SortedDict`` for the + ``select`` value, not just a normal Python dictionary. + + This will work, for example:: + + Blog.objects.extra( + select=SortedDict([('a', '%s'), ('b', '%s')]), + select_params=('one', 'two')) + + The only thing to be careful about when using select parameters in + ``extra()`` is to avoid using the substring ``"%%s"`` (that's *two* + percent characters before the ``s``) in the select strings. Django's + tracking of parameters looks for ``%s`` and an escaped ``%`` character + like this isn't detected. That will lead to incorrect results. + +``where`` / ``tables`` + You can define explicit SQL ``WHERE`` clauses -- perhaps to perform + non-explicit joins -- by using ``where``. You can manually add tables to + the SQL ``FROM`` clause by using ``tables``. + + ``where`` and ``tables`` both take a list of strings. All ``where`` + parameters are "AND"ed to any other search criteria. + + Example:: + + Entry.objects.extra(where=['id IN (3, 4, 5, 20)']) + + ...translates (roughly) into the following SQL:: + + SELECT * FROM blog_entry WHERE id IN (3, 4, 5, 20); + + Be careful when using the ``tables`` parameter if you're specifying + tables that are already used in the query. When you add extra tables + via the ``tables`` parameter, Django assumes you want that table included + an extra time, if it is already included. That creates a problem, + since the table name will then be given an alias. If a table appears + multiple times in an SQL statement, the second and subsequent occurrences + must use aliases so the database can tell them apart. If you're + referring to the extra table you added in the extra ``where`` parameter + this is going to cause errors. + + Normally you'll only be adding extra tables that don't already appear in + the query. However, if the case outlined above does occur, there are a few + solutions. First, see if you can get by without including the extra table + and use the one already in the query. If that isn't possible, put your + ``extra()`` call at the front of the queryset construction so that your + table is the first use of that table. Finally, if all else fails, look at + the query produced and rewrite your ``where`` addition to use the alias + given to your extra table. The alias will be the same each time you + construct the queryset in the same way, so you can rely upon the alias + name to not change. + +``order_by`` + If you need to order the resulting queryset using some of the new fields + or tables you have included via ``extra()`` use the ``order_by`` parameter + to ``extra()`` and pass in a sequence of strings. These strings should + either be model fields (as in the normal ``order_by()`` method on + querysets), of the form ``table_name.column_name`` or an alias for a column + that you specified in the ``select`` parameter to ``extra()``. + + For example:: + + q = Entry.objects.extra(select={'is_recent': "pub_date > '2006-01-01'"}) + q = q.extra(order_by = ['-is_recent']) + + This would sort all the items for which ``is_recent`` is true to the front + of the result set (``True`` sorts before ``False`` in a descending + ordering). + + This shows, by the way, that you can make multiple calls to + ``extra()`` and it will behave as you expect (adding new constraints each + time). + +``params`` + The ``where`` parameter described above may use standard Python database + string placeholders -- ``'%s'`` to indicate parameters the database engine + should automatically quote. The ``params`` argument is a list of any extra + parameters to be substituted. + + Example:: + + Entry.objects.extra(where=['headline=%s'], params=['Lennon']) + + Always use ``params`` instead of embedding values directly into ``where`` + because ``params`` will ensure values are quoted correctly according to + your particular backend. (For example, quotes will be escaped correctly.) + + Bad:: + + Entry.objects.extra(where=["headline='Lennon'"]) + + Good:: + + Entry.objects.extra(where=['headline=%s'], params=['Lennon']) + +**New in Django development version** The ``select_params`` argument to +``extra()`` is new. Previously, you could attempt to pass parameters for +``select`` in the ``params`` argument, but it worked very unreliably. + +QuerySet methods that do not return QuerySets +--------------------------------------------- + +The following ``QuerySet`` methods evaluate the ``QuerySet`` and return +something *other than* a ``QuerySet``. + +These methods do not use a cache (see :ref:`caching-and-querysets`). Rather, +they query the database each time they're called. + +.. _get-kwargs: + +``get(**kwargs)`` +~~~~~~~~~~~~~~~~~ + +Returns the object matching the given lookup parameters, which should be in +the format described in `Field lookups`_. + +``get()`` raises ``AssertionError`` if more than one object was found. + +``get()`` raises a ``DoesNotExist`` exception if an object wasn't found for the +given parameters. The ``DoesNotExist`` exception is an attribute of the model +class. Example:: + + Entry.objects.get(id='foo') # raises Entry.DoesNotExist + +The ``DoesNotExist`` exception inherits from +``django.core.exceptions.ObjectDoesNotExist``, so you can target multiple +``DoesNotExist`` exceptions. Example:: + + from django.core.exceptions import ObjectDoesNotExist + try: + e = Entry.objects.get(id=3) + b = Blog.objects.get(id=1) + except ObjectDoesNotExist: + print "Either the entry or blog doesn't exist." + +``create(**kwargs)`` +~~~~~~~~~~~~~~~~~~~~ + +A convenience method for creating an object and saving it all in one step. Thus:: + + p = Person.objects.create(first_name="Bruce", last_name="Springsteen") + +and:: + + p = Person(first_name="Bruce", last_name="Springsteen") + p.save() + +are equivalent. + +``get_or_create(**kwargs)`` +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +A convenience method for looking up an object with the given kwargs, creating +one if necessary. + +Returns a tuple of ``(object, created)``, where ``object`` is the retrieved or +created object and ``created`` is a boolean specifying whether a new object was +created. + +This is meant as a shortcut to boilerplatish code and is mostly useful for +data-import scripts. For example:: + + try: + obj = Person.objects.get(first_name='John', last_name='Lennon') + except Person.DoesNotExist: + obj = Person(first_name='John', last_name='Lennon', birthday=date(1940, 10, 9)) + obj.save() + +This pattern gets quite unwieldy as the number of fields in a model goes up. +The above example can be rewritten using ``get_or_create()`` like so:: + + obj, created = Person.objects.get_or_create(first_name='John', last_name='Lennon', + defaults={'birthday': date(1940, 10, 9)}) + +Any keyword arguments passed to ``get_or_create()`` -- *except* an optional one +called ``defaults`` -- will be used in a ``get()`` call. If an object is found, +``get_or_create()`` returns a tuple of that object and ``False``. If an object +is *not* found, ``get_or_create()`` will instantiate and save a new object, +returning a tuple of the new object and ``True``. The new object will be +created according to this algorithm:: + + defaults = kwargs.pop('defaults', {}) + params = dict([(k, v) for k, v in kwargs.items() if '__' not in k]) + params.update(defaults) + obj = self.model(**params) + obj.save() + +In English, that means start with any non-``'defaults'`` keyword argument that +doesn't contain a double underscore (which would indicate a non-exact lookup). +Then add the contents of ``defaults``, overriding any keys if necessary, and +use the result as the keyword arguments to the model class. + +If you have a field named ``defaults`` and want to use it as an exact lookup in +``get_or_create()``, just use ``'defaults__exact'``, like so:: + + Foo.objects.get_or_create(defaults__exact='bar', defaults={'defaults': 'baz'}) + +Finally, a word on using ``get_or_create()`` in Django views. As mentioned +earlier, ``get_or_create()`` is mostly useful in scripts that need to parse +data and create new records if existing ones aren't available. But if you need +to use ``get_or_create()`` in a view, please make sure to use it only in +``POST`` requests unless you have a good reason not to. ``GET`` requests +shouldn't have any effect on data; use ``POST`` whenever a request to a page +has a side effect on your data. For more, see `Safe methods`_ in the HTTP spec. + +.. _Safe methods: http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.1.1 + +``count()`` +~~~~~~~~~~~ + +Returns an integer representing the number of objects in the database matching +the ``QuerySet``. ``count()`` never raises exceptions. + +Example:: + + # Returns the total number of entries in the database. + Entry.objects.count() + + # Returns the number of entries whose headline contains 'Lennon' + Entry.objects.filter(headline__contains='Lennon').count() + +``count()`` performs a ``SELECT COUNT(*)`` behind the scenes, so you should +always use ``count()`` rather than loading all of the record into Python +objects and calling ``len()`` on the result. + +Depending on which database you're using (e.g. PostgreSQL vs. MySQL), +``count()`` may return a long integer instead of a normal Python integer. This +is an underlying implementation quirk that shouldn't pose any real-world +problems. + +``in_bulk(id_list)`` +~~~~~~~~~~~~~~~~~~~~ + +Takes a list of primary-key values and returns a dictionary mapping each +primary-key value to an instance of the object with the given ID. + +Example:: + + >>> Blog.objects.in_bulk([1]) + {1: Beatles Blog} + >>> Blog.objects.in_bulk([1, 2]) + {1: Beatles Blog, 2: Cheddar Talk} + >>> Blog.objects.in_bulk([]) + {} + +If you pass ``in_bulk()`` an empty list, you'll get an empty dictionary. + +``iterator()`` +~~~~~~~~~~~~~~ + +Evaluates the ``QuerySet`` (by performing the query) and returns an +`iterator`_ over the results. A ``QuerySet`` typically reads all of +its results and instantiates all of the corresponding objects the +first time you access it; ``iterator()`` will instead read results and +instantiate objects in discrete chunks, yielding them one at a +time. For a ``QuerySet`` which returns a large number of objects, this +often results in better performance and a significant reduction in +memory use. + +Note that using ``iterator()`` on a ``QuerySet`` which has already +been evaluated will force it to evaluate again, repeating the query. + +.. _iterator: http://www.python.org/dev/peps/pep-0234/ + +``latest(field_name=None)`` +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Returns the latest object in the table, by date, using the ``field_name`` +provided as the date field. + +This example returns the latest ``Entry`` in the table, according to the +``pub_date`` field:: + + Entry.objects.latest('pub_date') + +If your model's ``Meta`` specifies ``get_latest_by``, you can leave off the +``field_name`` argument to ``latest()``. Django will use the field specified in +``get_latest_by`` by default. + +Like ``get()``, ``latest()`` raises ``DoesNotExist`` if an object doesn't +exist with the given parameters. + +Note ``latest()`` exists purely for convenience and readability. + +.. _field-lookups: + +Field lookups +------------- + +Field lookups are how you specify the meat of an SQL ``WHERE`` clause. They're +specified as keyword arguments to the ``QuerySet`` methods ``filter()``, +``exclude()`` and ``get()``. + +For an introduction, see :ref:`field-lookups-intro`. + +exact +~~~~~ + +Exact match. If the value provided for comparison is ``None``, it will +be interpreted as an SQL ``NULL`` (See isnull_ for more details). + +Examples:: + + Entry.objects.get(id__exact=14) + Entry.objects.get(id__exact=None) + +SQL equivalents:: + + SELECT ... WHERE id = 14; + SELECT ... WHERE id IS NULL; + +**New in Django development version:** The semantics of ``id__exact=None`` have +changed in the development version. Previously, it was (intentionally) +converted to ``WHERE id = NULL`` at the SQL level, which would never match +anything. It has now been changed to behave the same as ``id__isnull=True``. + +.. admonition:: MySQL comparisons + + In MySQL, whether or not ``exact`` comparisons are case-sensitive depends + upon the collation setting of the table involved. The default is usually + ``latin1_swedish_ci`` or ``utf8_swedish_ci``, which results in + case-insensitive comparisons. Change the collation to + ``latin1_swedish_cs`` or ``utf8_bin`` for case sensitive comparisons. + + For more details, refer to the MySQL manual section about `character sets + and collations`_. + +.. _character sets and collations: http://dev.mysql.com/doc/refman/5.0/en/charset.html + +iexact +~~~~~~ + +Case-insensitive exact match. + +Example:: + + Blog.objects.get(name__iexact='beatles blog') + +SQL equivalent:: + + SELECT ... WHERE name ILIKE 'beatles blog'; + +Note this will match ``'Beatles Blog'``, ``'beatles blog'``, +``'BeAtLes BLoG'``, etc. + +contains +~~~~~~~~ + +Case-sensitive containment test. + +Example:: + + Entry.objects.get(headline__contains='Lennon') + +SQL equivalent:: + + SELECT ... WHERE headline LIKE '%Lennon%'; + +Note this will match the headline ``'Today Lennon honored'`` but not +``'today lennon honored'``. + +SQLite doesn't support case-sensitive ``LIKE`` statements; ``contains`` acts +like ``icontains`` for SQLite. + +icontains +~~~~~~~~~ + +Case-insensitive containment test. + +Example:: + + Entry.objects.get(headline__icontains='Lennon') + +SQL equivalent:: + + SELECT ... WHERE headline ILIKE '%Lennon%'; + +in +~~ + +In a given list. + +Example:: + + Entry.objects.filter(id__in=[1, 3, 4]) + +SQL equivalent:: + + SELECT ... WHERE id IN (1, 3, 4); + +You can also use a queryset to dynamically evaluate the list of values +instead of providing a list of literal values. The queryset must be +reduced to a list of individual values using the ``values()`` method, +and then converted into a query using the ``query`` attribute:: + + Entry.objects.filter(blog__in=Blog.objects.filter(name__contains='Cheddar').values('pk').query) + +This queryset will be evaluated as subselect statement:: + + SELECT ... WHERE blog.id IN (SELECT id FROM ... WHERE NAME LIKE '%Cheddar%') + +gt +~~ + +Greater than. + +Example:: + + Entry.objects.filter(id__gt=4) + +SQL equivalent:: + + SELECT ... WHERE id > 4; + +gte +~~~ + +Greater than or equal to. + +lt +~~ + +Less than. + +lte +~~~ + +Less than or equal to. + +in +~~ + +In a given list. + +Example:: + + Entry.objects.filter(id__in=[1, 3, 4]) + +SQL equivalent:: + + SELECT ... WHERE id IN (1, 3, 4); + +startswith +~~~~~~~~~~ + +Case-sensitive starts-with. + +Example:: + + Entry.objects.filter(headline__startswith='Will') + +SQL equivalent:: + + SELECT ... WHERE headline LIKE 'Will%'; + +SQLite doesn't support case-sensitive ``LIKE`` statements; ``startswith`` acts +like ``istartswith`` for SQLite. + +istartswith +~~~~~~~~~~~ + +Case-insensitive starts-with. + +Example:: + + Entry.objects.filter(headline__istartswith='will') + +SQL equivalent:: + + SELECT ... WHERE headline ILIKE 'Will%'; + +endswith +~~~~~~~~ + +Case-sensitive ends-with. + +Example:: + + Entry.objects.filter(headline__endswith='cats') + +SQL equivalent:: + + SELECT ... WHERE headline LIKE '%cats'; + +SQLite doesn't support case-sensitive ``LIKE`` statements; ``endswith`` acts +like ``iendswith`` for SQLite. + +iendswith +~~~~~~~~~ + +Case-insensitive ends-with. + +Example:: + + Entry.objects.filter(headline__iendswith='will') + +SQL equivalent:: + + SELECT ... WHERE headline ILIKE '%will' + +range +~~~~~ + +Range test (inclusive). + +Example:: + + start_date = datetime.date(2005, 1, 1) + end_date = datetime.date(2005, 3, 31) + Entry.objects.filter(pub_date__range=(start_date, end_date)) + +SQL equivalent:: + + SELECT ... WHERE pub_date BETWEEN '2005-01-01' and '2005-03-31'; + +You can use ``range`` anywhere you can use ``BETWEEN`` in SQL -- for dates, +numbers and even characters. + +year +~~~~ + +For date/datetime fields, exact year match. Takes a four-digit year. + +Example:: + + Entry.objects.filter(pub_date__year=2005) + +SQL equivalent:: + + SELECT ... WHERE EXTRACT('year' FROM pub_date) = '2005'; + +(The exact SQL syntax varies for each database engine.) + +month +~~~~~ + +For date/datetime fields, exact month match. Takes an integer 1 (January) +through 12 (December). + +Example:: + + Entry.objects.filter(pub_date__month=12) + +SQL equivalent:: + + SELECT ... WHERE EXTRACT('month' FROM pub_date) = '12'; + +(The exact SQL syntax varies for each database engine.) + +day +~~~ + +For date/datetime fields, exact day match. + +Example:: + + Entry.objects.filter(pub_date__day=3) + +SQL equivalent:: + + SELECT ... WHERE EXTRACT('day' FROM pub_date) = '3'; + +(The exact SQL syntax varies for each database engine.) + +Note this will match any record with a pub_date on the third day of the month, +such as January 3, July 3, etc. + +isnull +~~~~~~ + +Takes either ``True`` or ``False``, which correspond to SQL queries of +``IS NULL`` and ``IS NOT NULL``, respectively. + +Example:: + + Entry.objects.filter(pub_date__isnull=True) + +SQL equivalent:: + + SELECT ... WHERE pub_date IS NULL; + +.. admonition:: ``__isnull=True`` vs ``__exact=None`` + + There is an important difference between ``__isnull=True`` and + ``__exact=None``. ``__exact=None`` will *always* return an empty result + set, because SQL requires that no value is equal to ``NULL``. + ``__isnull`` determines if the field is currently holding the value + of ``NULL`` without performing a comparison. + +search +~~~~~~ + +A boolean full-text search, taking advantage of full-text indexing. This is +like ``contains`` but is significantly faster due to full-text indexing. + +Note this is only available in MySQL and requires direct manipulation of the +database to add the full-text index. + +regex +~~~~~ + +**New in Django development version** + +Case-sensitive regular expression match. + +The regular expression syntax is that of the database backend in use. In the +case of SQLite, which doesn't natively support regular-expression lookups, the +syntax is that of Python's ``re`` module. + +Example:: + + Entry.objects.get(title__regex=r'^(An?|The) +') + +SQL equivalents:: + + SELECT ... WHERE title REGEXP BINARY '^(An?|The) +'; -- MySQL + + SELECT ... WHERE REGEXP_LIKE(title, '^(an?|the) +', 'c'); -- Oracle + + SELECT ... WHERE title ~ '^(An?|The) +'; -- PostgreSQL + + SELECT ... WHERE title REGEXP '^(An?|The) +'; -- SQLite + +Using raw strings (e.g., ``r'foo'`` instead of ``'foo'``) for passing in the +regular expression syntax is recommended. + +iregex +~~~~~~ + +**New in Django development version** + +Case-insensitive regular expression match. + +Example:: + + Entry.objects.get(title__iregex=r'^(an?|the) +') + +SQL equivalents:: + + SELECT ... WHERE title REGEXP '^(an?|the) +'; -- MySQL + + SELECT ... WHERE REGEXP_LIKE(title, '^(an?|the) +', 'i'); -- Oracle + + SELECT ... WHERE title ~* '^(an?|the) +'; -- PostgreSQL + + SELECT ... WHERE title REGEXP '(?i)^(an?|the) +'; -- SQLite + diff --git a/docs/ref/models/relations.txt b/docs/ref/models/relations.txt new file mode 100644 index 0000000000..1ee8b26258 --- /dev/null +++ b/docs/ref/models/relations.txt @@ -0,0 +1,77 @@ +.. _ref-models-relations: + +========================= +Related objects reference +========================= + +Extra methods on managers when used in a ForeignKey context +=========================================================== + +.. currentmodule:: django.db.models + +.. method:: QuerySet.add(obj1, [obj2, ...]) + + Adds the specified model objects to the related object set. + + Example:: + + >>> b = Blog.objects.get(id=1) + >>> e = Entry.objects.get(id=234) + >>> b.entry_set.add(e) # Associates Entry e with Blog b. + +.. method:: QuerySet.create(**kwargs)` + + Creates a new object, saves it and puts it in the related object set. + Returns the newly created object:: + + >>> b = Blog.objects.get(id=1) + >>> e = b.entry_set.create( + ... headline='Hello', + ... body_text='Hi', + ... pub_date=datetime.date(2005, 1, 1) + ... ) + + # No need to call e.save() at this point -- it's already been saved. + + This is equivalent to (but much simpler than):: + + >>> b = Blog.objects.get(id=1) + >>> e = Entry( + .... blog=b, + .... headline='Hello', + .... body_text='Hi', + .... pub_date=datetime.date(2005, 1, 1) + .... ) + >>> e.save() + + Note that there's no need to specify the keyword argument of the model that + defines the relationship. In the above example, we don't pass the parameter + ``blog`` to ``create()``. Django figures out that the new ``Entry`` object's + ``blog`` field should be set to ``b``. + +.. method:: QuerySet.remove(obj1, [obj2, ...]) + + Removes the specified model objects from the related object set:: + + >>> b = Blog.objects.get(id=1) + >>> e = Entry.objects.get(id=234) + >>> b.entry_set.remove(e) # Disassociates Entry e from Blog b. + + In order to prevent database inconsistency, this method only exists on + ``ForeignKey`` objects where ``null=True``. If the related field can't be + set to ``None`` (``NULL``), then an object can't be removed from a relation + without being added to another. In the above example, removing ``e`` from + ``b.entry_set()`` is equivalent to doing ``e.blog = None``, and because the + ``blog`` ``ForeignKey`` doesn't have ``null=True``, this is invalid. + +.. method:: QuerySet.clear() + + Removes all objects from the related object set:: + + >>> b = Blog.objects.get(id=1) + >>> b.entry_set.clear() + + Note this doesn't delete the related objects -- it just disassociates them. + + Just like ``remove()``, ``clear()`` is only available on ``ForeignKey``s + where ``null=True``. diff --git a/docs/request_response.txt b/docs/ref/request-response.txt similarity index 51% rename from docs/request_response.txt rename to docs/ref/request-response.txt index 9b3f6dd0e3..34f098b084 100644 --- a/docs/request_response.txt +++ b/docs/ref/request-response.txt @@ -1,35 +1,44 @@ +.. _ref-request-response: + ============================ Request and response objects ============================ +.. module:: django.http + :synopsis: Classes dealing with HTTP requests and responses. + Quick overview ============== Django uses request and response objects to pass state through the system. -When a page is requested, Django creates an ``HttpRequest`` object that +When a page is requested, Django creates an :class:`HttpRequest` object that contains metadata about the request. Then Django loads the appropriate view, -passing the ``HttpRequest`` as the first argument to the view function. Each -view is responsible for returning an ``HttpResponse`` object. +passing the :class:`HttpRequest` as the first argument to the view function. Each +view is responsible for returning an :class:`HttpResponse` object. -This document explains the APIs for ``HttpRequest`` and ``HttpResponse`` +This document explains the APIs for :class:`HttpRequest` and :class:`HttpResponse` objects. HttpRequest objects =================== +.. class:: HttpRequest + Attributes ---------- All attributes except ``session`` should be considered read-only. -``path`` - A string representing the full path to the requested page, not including - the domain. +.. attribute:: HttpRequest.path - Example: ``"/music/bands/the_beatles/"`` + A string representing the full path to the requested page, not including + the domain. + + Example: ``"/music/bands/the_beatles/"`` + +.. attribute:: HttpRequest.method -``method`` A string representing the HTTP method used in the request. This is guaranteed to be uppercase. Example:: @@ -38,7 +47,8 @@ All attributes except ``session`` should be considered read-only. elif request.method == 'POST': do_something_else() -``encoding`` +.. attribute:: HttpRequest.encoding + **New in Django development version** A string representing the current encoding used to decode form submission @@ -48,11 +58,13 @@ All attributes except ``session`` should be considered read-only. ``GET`` or ``POST``) will use the new ``encoding`` value. Useful if you know the form data is not in the ``DEFAULT_CHARSET`` encoding. -``GET`` +.. attribute:: HttpRequest.GET + A dictionary-like object containing all given HTTP GET parameters. See the ``QueryDict`` documentation below. -``POST`` +.. attribute:: HttpRequest.POST + A dictionary-like object containing all given HTTP POST parameters. See the ``QueryDict`` documentation below. @@ -64,7 +76,8 @@ All attributes except ``session`` should be considered read-only. Note: ``POST`` does *not* include file-upload information. See ``FILES``. -``REQUEST`` +.. attribute:: HttpRequest.REQUEST + For convenience, a dictionary-like object that searches ``POST`` first, then ``GET``. Inspired by PHP's ``$_REQUEST``. @@ -75,12 +88,13 @@ All attributes except ``session`` should be considered read-only. It's strongly suggested that you use ``GET`` and ``POST`` instead of ``REQUEST``, because the former are more explicit. -``COOKIES`` +.. attribute:: HttpRequest.COOKIES + A standard Python dictionary containing all cookies. Keys and values are strings. -``FILES`` - +.. attribute:: HttpRequest.FILES + .. admonition:: Changed in Django development version In previous versions of Django, ``request.FILES`` contained @@ -91,7 +105,7 @@ All attributes except ``session`` should be considered read-only. These ``UploadedFile`` objects will emulate the old-style ``dict`` interface, but this is deprecated and will be removed in the next release of Django. - + A dictionary-like object containing all uploaded files. Each key in ``FILES`` is the ``name`` from the ``<input type="file" name="" />``. Each value in ``FILES`` is an ``UploadedFile`` object containing the following @@ -102,16 +116,15 @@ All attributes except ``session`` should be considered read-only. * ``file_size`` -- The size, in bytes, of the uploaded file. * ``chunk()`` -- A generator that yields sequential chunks of data. - See `File Uploads`_ for more information. - + See :ref:`topics-files` for more information. + Note that ``FILES`` will only contain data if the request method was POST and the ``<form>`` that posted to the request had ``enctype="multipart/form-data"``. Otherwise, ``FILES`` will be a blank dictionary-like object. - - .. _File Uploads: ../upload_handling/ -``META`` +.. attribute:: HttpRequest.META + A standard Python dictionary containing all available HTTP headers. Available headers depend on the client and server, but here are some examples: @@ -130,7 +143,8 @@ All attributes except ``session`` should be considered read-only. * ``SERVER_NAME`` -- The hostname of the server. * ``SERVER_PORT`` -- The port of the server. -``user`` +.. attribute:: HttpRequest.user + A ``django.contrib.auth.models.User`` object representing the currently logged-in user. If the user isn't currently logged in, ``user`` will be set to an instance of ``django.contrib.auth.models.AnonymousUser``. You @@ -143,34 +157,32 @@ All attributes except ``session`` should be considered read-only. ``user`` is only available if your Django installation has the ``AuthenticationMiddleware`` activated. For more, see - `Authentication in Web requests`_. + :ref:`topics-auth`. - .. _Authentication in Web requests: ../authentication/#authentication-in-web-requests +.. attribute:: HttpRequest.session -``session`` A readable-and-writable, dictionary-like object that represents the current session. This is only available if your Django installation has session - support activated. See the `session documentation`_ for full details. + support activated. See the :ref:`session documentation + <topics-http-sessions>` for full details. - .. _`session documentation`: ../sessions/ +.. attribute:: HttpRequest.row_post_data -``raw_post_data`` The raw HTTP POST data. This is only useful for advanced processing. Use ``POST`` instead. -``urlconf`` - Not defined by Django itself, but will be read if other code - (e.g., a custom middleware class) sets it. When present, this will - be used as the root URLconf for the current request, overriding - the ``ROOT_URLCONF`` setting. See `How Django processes a - request`_ for details. +.. attribute:: HttpRequest.urlconf -.. _How Django processes a request: ../url_dispatch/#how-django-processes-a-request + Not defined by Django itself, but will be read if other code (e.g., a custom + middleware class) sets it. When present, this will be used as the root + URLconf for the current request, overriding the ``ROOT_URLCONF`` setting. + See :ref:`how-django-processes-a-request` for details. Methods ------- -``get_host()`` +.. method:: HttpRequest.get_host() + **New in Django development version** Returns the originating host of the request using information from the @@ -182,12 +194,14 @@ Methods Example: ``"127.0.0.1:8000"`` -``get_full_path()`` +.. method:: HttpRequest.get_full_path() + Returns the ``path``, plus an appended query string, if applicable. Example: ``"/music/bands/the_beatles/?print=true"`` -``build_absolute_uri(location)`` +.. method:: HttpRequest.build_absolute_uri(location) + **New in Django development version** Returns the absolute URI form of ``location``. If no location is provided, @@ -199,11 +213,13 @@ Methods Example: ``"http://example.com/music/bands/the_beatles/?print=true"`` -``is_secure()`` +.. method:: HttpRequest.is_secure() + Returns ``True`` if the request is secure; that is, if it was made with HTTPS. -``is_ajax()`` +.. method:: HttpRequest.is_ajax() + **New in Django development version** Returns ``True`` if the request was made via an ``XMLHttpRequest``, by checking @@ -220,11 +236,14 @@ Methods If you write your own XMLHttpRequest call (on the browser side), you'll have to set this header manually if you want ``is_ajax()`` to work. + QueryDict objects ----------------- -In an ``HttpRequest`` object, the ``GET`` and ``POST`` attributes are instances -of ``django.http.QueryDict``. ``QueryDict`` is a dictionary-like +.. class:: QueryDict + +In an :class:`HttpRequest` object, the ``GET`` and ``POST`` attributes are instances +of ``django.http.QueryDict``. :class:`QueryDict` is a dictionary-like class customized to deal with multiple values for the same key. This is necessary because some HTML form elements, notably ``<select multiple="multiple">``, pass multiple values for the same key. @@ -233,35 +252,47 @@ necessary because some HTML form elements, notably That means you can't change attributes of ``request.POST`` and ``request.GET`` directly. -``QueryDict`` implements all the standard dictionary methods, because it's a -subclass of dictionary. Exceptions are outlined here: +Methods +------- - * ``__getitem__(key)`` -- Returns the value for the given key. If the key - has more than one value, ``__getitem__()`` returns the last value. - Raises ``django.utils.datastructure.MultiValueDictKeyError`` if the key - does not exist. (This is a subclass of Python's standard ``KeyError``, - so you can stick to catching ``KeyError``.) +:class:`QueryDict` implements all the standard dictionary methods, because it's +a subclass of dictionary. Exceptions are outlined here: - * ``__setitem__(key, value)`` -- Sets the given key to ``[value]`` - (a Python list whose single element is ``value``). Note that this, as - other dictionary functions that have side effects, can only be called on - a mutable ``QueryDict`` (one that was created via ``copy()``). +.. method:: QueryDict.__getitem__(key) - * ``__contains__(key)`` -- Returns ``True`` if the given key is set. This - lets you do, e.g., ``if "foo" in request.GET``. + Returns the value for the given key. If the key has more than one value, + ``__getitem__()`` returns the last value. Raises + ``django.utils.datastructure.MultiValueDictKeyError`` if the key does not + exist. (This is a subclass of Python's standard ``KeyError``, so you can + stick to catching ``KeyError``.) - * ``get(key, default)`` -- Uses the same logic as ``__getitem__()`` above, - with a hook for returning a default value if the key doesn't exist. +.. method:: QueryDict.__setitem__(key, value) - * ``has_key(key)`` + Sets the given key to ``[value]`` (a Python list whose single element is + ``value``). Note that this, as other dictionary functions that have side + effects, can only be called on a mutable ``QueryDict`` (one that was created + via ``copy()``). - * ``setdefault(key, default)`` -- Just like the standard dictionary - ``setdefault()`` method, except it uses ``__setitem__`` internally. +.. method:: QueryDict.__contains__(key) - * ``update(other_dict)`` -- Takes either a ``QueryDict`` or standard - dictionary. Just like the standard dictionary ``update()`` method, except - it *appends* to the current dictionary items rather than replacing them. - For example:: + Returns ``True`` if the given key is set. This lets you do, e.g., ``if "foo" + in request.GET``. + +.. method:: QueryDict.get(key, default) + + Uses the same logic as ``__getitem__()`` above, with a hook for returning a + default value if the key doesn't exist. + +.. method:: QueryDict.setdefault(key, default) + + Just like the standard dictionary ``setdefault()`` method, except it uses + ``__setitem__`` internally. + +.. method:: QueryDict.update(other_dict) + + Takes either a ``QueryDict`` or standard dictionary. Just like the standard + dictionary ``update()`` method, except it *appends* to the current + dictionary items rather than replacing them. For example:: >>> q = QueryDict('a=1') >>> q = q.copy() # to make it mutable @@ -271,17 +302,19 @@ subclass of dictionary. Exceptions are outlined here: >>> q['a'] # returns the last ['2'] - * ``items()`` -- Just like the standard dictionary ``items()`` method, - except this uses the same last-value logic as ``__getitem()__``. For - example:: +.. method:: QueryDict.items() + + Just like the standard dictionary ``items()`` method, except this uses the + same last-value logic as ``__getitem()__``. For example:: >>> q = QueryDict('a=1&a=2&a=3') >>> q.items() [('a', '3')] - * ``values()`` -- Just like the standard dictionary ``values()`` method, - except this uses the same last-value logic as ``__getitem()__``. For - example:: +.. method:: QueryDict.values() + + Just like the standard dictionary ``values()`` method, except this uses the + same last-value logic as ``__getitem()__``. For example:: >>> q = QueryDict('a=1&a=2&a=3') >>> q.values() @@ -289,83 +322,56 @@ subclass of dictionary. Exceptions are outlined here: In addition, ``QueryDict`` has the following methods: - * ``copy()`` -- Returns a copy of the object, using ``copy.deepcopy()`` - from the Python standard library. The copy will be mutable -- that is, - you can change its values. +.. method:: QueryDict.copy() - * ``getlist(key)`` -- Returns the data with the requested key, as a Python - list. Returns an empty list if the key doesn't exist. It's guaranteed to - return a list of some sort. + Returns a copy of the object, using ``copy.deepcopy()`` from the Python + standard library. The copy will be mutable -- that is, you can change its + values. - * ``setlist(key, list_)`` -- Sets the given key to ``list_`` (unlike - ``__setitem__()``). +.. method:: QueryDict.getlist(key) - * ``appendlist(key, item)`` -- Appends an item to the internal list - associated with key. + Returns the data with the requested key, as a Python list. Returns an + empty list if the key doesn't exist. It's guaranteed to return a list of + some sort. - * ``setlistdefault(key, default_list)`` -- Just like ``setdefault``, except - it takes a list of values instead of a single value. +.. method:: QueryDict.setlist(key, list_) - * ``lists()`` -- Like ``items()``, except it includes all values, as a list, - for each member of the dictionary. For example:: + Sets the given key to ``list_`` (unlike ``__setitem__()``). - >>> q = QueryDict('a=1&a=2&a=3') - >>> q.lists() - [('a', ['1', '2', '3'])] +.. method:: QueryDict.appendlist(key, item) - * ``urlencode()`` -- Returns a string of the data in query-string format. - Example: ``"a=2&b=3&b=5"``. + Appends an item to the internal list associated with key. -Examples --------- +.. method:: QueryDict.setlistdefault(key, default_list) -Here's an example HTML form and how Django would treat the input:: + Just like ``setdefault``, except it takes a list of values instead of a + single value. - <form action="/foo/bar/" method="post"> - <input type="text" name="your_name" /> - <select multiple="multiple" name="bands"> - <option value="beatles">The Beatles</option> - <option value="who">The Who</option> - <option value="zombies">The Zombies</option> - </select> - <input type="submit" /> - </form> +.. method:: QueryDict.lists() -If the user enters ``"John Smith"`` in the ``your_name`` field and selects both -"The Beatles" and "The Zombies" in the multiple select box, here's what -Django's request object would have:: + Like :method:items(), except it includes all values, as a list, for each + member of the dictionary. For example:: + + >>> q = QueryDict('a=1&a=2&a=3') + >>> q.lists() + [('a', ['1', '2', '3'])] + +.. method:: QueryDict.urlencode() - >>> request.GET - {} - >>> request.POST - {'your_name': ['John Smith'], 'bands': ['beatles', 'zombies']} - >>> request.POST['your_name'] - 'John Smith' - >>> request.POST['bands'] - 'zombies' - >>> request.POST.getlist('bands') - ['beatles', 'zombies'] - >>> request.POST.get('your_name', 'Adrian') - 'John Smith' - >>> request.POST.get('nonexistent_field', 'Nowhere Man') - 'Nowhere Man' - -Implementation notes --------------------- - -The ``GET``, ``POST``, ``COOKIES``, ``FILES``, ``META``, ``REQUEST``, -``raw_post_data`` and ``user`` attributes are all lazily loaded. That means -Django doesn't spend resources calculating the values of those attributes until -your code requests them. + Returns a string of the data in query-string format. + Example: ``"a=2&b=3&b=5"``. HttpResponse objects ==================== -In contrast to ``HttpRequest`` objects, which are created automatically by -Django, ``HttpResponse`` objects are your responsibility. Each view you write -is responsible for instantiating, populating and returning an ``HttpResponse``. +.. class:: HttpResponse -The ``HttpResponse`` class lives in the ``django.http`` module. +In contrast to :class:`HttpRequest` objects, which are created automatically by +Django, :class:`HttpResponse` objects are your responsibility. Each view you +write is responsible for instantiating, populating and returning an +:class:`HttpResponse`. + +The :class:`HttpResponse` class lives in the ``django.http`` module. Usage ----- @@ -374,7 +380,7 @@ Passing strings ~~~~~~~~~~~~~~~ Typical usage is to pass the contents of the page, as a string, to the -``HttpResponse`` constructor:: +:class:`HttpResponse` constructor:: >>> response = HttpResponse("Here's the text of the Web page.") >>> response = HttpResponse("Text only, please.", mimetype="text/plain") @@ -403,8 +409,8 @@ Finally, you can pass ``HttpResponse`` an iterator rather than passing it hard-coded strings. If you use this technique, follow these guidelines: * The iterator should return strings. - * If an ``HttpResponse`` has been initialized with an iterator as its - content, you can't use the ``HttpResponse`` instance as a file-like + * If an :class:`HttpResponse` has been initialized with an iterator as its + content, you can't use the class:`HttpResponse` instance as a file-like object. Doing so will raise ``Exception``. Setting headers @@ -431,7 +437,8 @@ it's easy to forget the syntax, so we've included it here. Methods ------- -``__init__(content='', mimetype=None, status=200, content_type=DEFAULT_CONTENT_TYPE)`` +.. method:: HttpResponse.__init__(content='', mimetype=None, status=200, content_type=DEFAULT_CONTENT_TYPE) + Instantiates an ``HttpResponse`` object with the given page content (a string) and MIME type. The ``DEFAULT_CONTENT_TYPE`` is ``'text/html'``. @@ -449,22 +456,27 @@ Methods (not ``None``), that value is used. Otherwise, ``content_type`` is used. If neither is given, the ``DEFAULT_CONTENT_TYPE`` setting is used. -``__setitem__(header, value)`` +.. method:: HttpResponse.__setitem__(header, value) + Sets the given header name to the given value. Both ``header`` and ``value`` should be strings. -``__delitem__(header)`` +.. method:: HttpResponse.__delitem__(header) + Deletes the header with the given name. Fails silently if the header doesn't exist. Case-sensitive. -``__getitem__(header)`` +.. method:: HttpResponse.__getitem__(header) + Returns the value for the given header name. Case-sensitive. -``has_header(header)`` +.. method:: HttpResponse.has_header(header) + Returns ``True`` or ``False`` based on a case-insensitive check for a header with the given name. -``set_cookie(key, value='', max_age=None, expires=None, path='/', domain=None, secure=None)`` +.. method:: HttpResponse.set_cookie(key, value='', max_age=None, expires=None, path='/', domain=None, secure=None) + Sets a cookie. The parameters are the same as in the `cookie Morsel`_ object in the Python standard library. @@ -480,184 +492,83 @@ Methods .. _`cookie Morsel`: http://www.python.org/doc/current/lib/morsel-objects.html -``delete_cookie(key, path='/', domain=None)`` +.. method:: HttpResponse.delete_cookie(key, path='/', domain=None) + Deletes the cookie with the given key. Fails silently if the key doesn't exist. Due to the way cookies work, ``path`` and ``domain`` should be the same - values you used in ``set_cookie()`` -- otherwise the cookie may not be deleted. + values you used in ``set_cookie()`` -- otherwise the cookie may not be + deleted. + +.. method:: HttpResponse.content() -``content`` Returns the content as a Python string, encoding it from a Unicode object if necessary. Note this is a property, not a method, so use ``r.content`` instead of ``r.content()``. -``write(content)``, ``flush()`` and ``tell()`` - These methods make an ``HttpResponse`` instance a file-like object. +.. method:: HttpResponse.write(content) + + This method makes an :class:`HttpResponse` instance a file-like object. + +.. method:: HttpResponse.flush() + + This method makes an :class:`HttpResponse` instance a file-like object. + +.. method:: HttpResponse.tell() + + This method makes an :class:`HttpResponse` instance a file-like object. .. _HTTP Status code: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10 + HttpResponse subclasses ----------------------- Django includes a number of ``HttpResponse`` subclasses that handle different types of HTTP responses. Like ``HttpResponse``, these subclasses live in -``django.http``. +:mod:`django.http`. + +.. class:: HttpResponseRedirect -``HttpResponseRedirect`` The constructor takes a single argument -- the path to redirect to. This can be a fully qualified URL (e.g. ``'http://www.yahoo.com/search/'``) or an absolute URL with no domain (e.g. ``'/search/'``). Note that this returns an HTTP status code 302. -``HttpResponsePermanentRedirect`` - Like ``HttpResponseRedirect``, but it returns a permanent redirect (HTTP - status code 301) instead of a "found" redirect (status code 302). +.. class:: HttpResponsePermanentRedirect + + Like :class:`HttpResponseRedirect`, but it returns a permanent redirect + (HTTP status code 301) instead of a "found" redirect (status code 302). + +.. class:: HttpResponseNotModified -``HttpResponseNotModified`` The constructor doesn't take any arguments. Use this to designate that a page hasn't been modified since the user's last request (status code 304). -``HttpResponseBadRequest`` - **New in Django development version.** - Acts just like ``HttpResponse`` but uses a 400 status code. +.. class:: HttpResponseBadRequest -``HttpResponseNotFound`` - Acts just like ``HttpResponse`` but uses a 404 status code. + **New in Django development version.** Acts just like :class:`HttpResponse` + but uses a 400 status code. -``HttpResponseForbidden`` - Acts just like ``HttpResponse`` but uses a 403 status code. +.. class:: HttpResponseNotFound -``HttpResponseNotAllowed`` - Like ``HttpResponse``, but uses a 405 status code. Takes a single, + Acts just like :class:`HttpResponse` but uses a 404 status code. + +.. class:: HttpResponseForbidden + + Acts just like :class:`HttpResponse` but uses a 403 status code. + +.. class:: HttpResponseNotAllowed + + Like :class:`HttpResponse`, but uses a 405 status code. Takes a single, required argument: a list of permitted methods (e.g. ``['GET', 'POST']``). -``HttpResponseGone`` - Acts just like ``HttpResponse`` but uses a 410 status code. +.. class:: HttpResponseGone -``HttpResponseServerError`` - Acts just like ``HttpResponse`` but uses a 500 status code. + Acts just like :class:`HttpResponse` but uses a 410 status code. -Returning errors -================ +.. class:: HttpResponseServerError -Returning HTTP error codes in Django is easy. We've already mentioned the -``HttpResponseNotFound``, ``HttpResponseForbidden``, -``HttpResponseServerError``, etc., subclasses; just return an instance of one -of those subclasses instead of a normal ``HttpResponse`` in order to signify -an error. For example:: + Acts just like :class:`HttpResponse` but uses a 500 status code. - def my_view(request): - # ... - if foo: - return HttpResponseNotFound('<h1>Page not found</h1>') - else: - return HttpResponse('<h1>Page was found</h1>') - -Because 404 errors are by far the most common HTTP error, there's an easier way -to handle those errors. - -The Http404 exception ---------------------- - -When you return an error such as ``HttpResponseNotFound``, you're responsible -for defining the HTML of the resulting error page:: - - return HttpResponseNotFound('<h1>Page not found</h1>') - -For convenience, and because it's a good idea to have a consistent 404 error page -across your site, Django provides an ``Http404`` exception. If you raise -``Http404`` at any point in a view function, Django will catch it and return the -standard error page for your application, along with an HTTP error code 404. - -Example usage:: - - from django.http import Http404 - - def detail(request, poll_id): - try: - p = Poll.objects.get(pk=poll_id) - except Poll.DoesNotExist: - raise Http404 - return render_to_response('polls/detail.html', {'poll': p}) - -In order to use the ``Http404`` exception to its fullest, you should create a -template that is displayed when a 404 error is raised. This template should be -called ``404.html`` and located in the top level of your template tree. - -Customizing error views ------------------------ - -The 404 (page not found) view -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -When you raise an ``Http404`` exception, Django loads a special view devoted -to handling 404 errors. By default, it's the view -``django.views.defaults.page_not_found``, which loads and renders the template -``404.html``. - -This means you need to define a ``404.html`` template in your root template -directory. This template will be used for all 404 errors. - -This ``page_not_found`` view should suffice for 99% of Web applications, but if -you want to override the 404 view, you can specify ``handler404`` in your -URLconf, like so:: - - handler404 = 'mysite.views.my_custom_404_view' - -Behind the scenes, Django determines the 404 view by looking for ``handler404``. -By default, URLconfs contain the following line:: - - from django.conf.urls.defaults import * - -That takes care of setting ``handler404`` in the current module. As you can see -in ``django/conf/urls/defaults.py``, ``handler404`` is set to -``'django.views.defaults.page_not_found'`` by default. - -Three things to note about 404 views: - - * The 404 view is also called if Django doesn't find a match after checking - every regular expression in the URLconf. - - * If you don't define your own 404 view -- and simply use the - default, which is recommended -- you still have one obligation: - you must create a ``404.html`` template in the root of your - template directory. The default 404 view will use that template - for all 404 errors. The default 404 view will pass one variable - to the template: ``request_path``, which is the URL that resulted - in the 404. - - * The 404 view is passed a ``RequestContext`` and will have access to - variables supplied by your ``TEMPLATE_CONTEXT_PROCESSORS`` setting (e.g., - ``MEDIA_URL``). - - * If ``DEBUG`` is set to ``True`` (in your settings module), then your 404 - view will never be used, and the traceback will be displayed instead. - -The 500 (server error) view -~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Similarly, Django executes special-case behavior in the case of runtime errors -in view code. If a view results in an exception, Django will, by default, call -the view ``django.views.defaults.server_error``, which loads and renders the -template ``500.html``. - -This means you need to define a ``500.html`` template in your root template -directory. This template will be used for all server errors. The default 500 -view passes no variables to this template and is rendered with an empty -``Context`` to lessen the chance of additional errors. - -This ``server_error`` view should suffice for 99% of Web applications, but if -you want to override the view, you can specify ``handler500`` in your -URLconf, like so:: - - handler500 = 'mysite.views.my_custom_error_view' - -Behind the scenes, Django determines the error view by looking for ``handler500``. -By default, URLconfs contain the following line:: - - from django.conf.urls.defaults import * - -That takes care of setting ``handler500`` in the current module. As you can see -in ``django/conf/urls/defaults.py``, ``handler500`` is set to -``'django.views.defaults.server_error'`` by default. diff --git a/docs/settings.txt b/docs/ref/settings.txt similarity index 65% rename from docs/settings.txt rename to docs/ref/settings.txt index 06c8f93ec7..72bd97c169 100644 --- a/docs/settings.txt +++ b/docs/ref/settings.txt @@ -1,150 +1,4 @@ -=============== -Django settings -=============== - -A Django settings file contains all the configuration of your Django -installation. This document explains how settings work and which settings are -available. - -The basics -========== - -A settings file is just a Python module with module-level variables. - -Here are a couple of example settings:: - - DEBUG = False - DEFAULT_FROM_EMAIL = 'webmaster@example.com' - TEMPLATE_DIRS = ('/home/templates/mike', '/home/templates/john') - -Because a settings file is a Python module, the following apply: - - * It doesn't allow for Python syntax errors. - * It can assign settings dynamically using normal Python syntax. - For example:: - - MY_SETTING = [str(i) for i in range(30)] - - * It can import values from other settings files. - -Designating the settings -======================== - -When you use Django, you have to tell it which settings you're using. Do this -by using an environment variable, ``DJANGO_SETTINGS_MODULE``. - -The value of ``DJANGO_SETTINGS_MODULE`` should be in Python path syntax, e.g. -``mysite.settings``. Note that the settings module should be on the -Python `import search path`_. - -.. _import search path: http://diveintopython.org/getting_to_know_python/everything_is_an_object.html - -The django-admin.py utility ---------------------------- - -When using `django-admin.py`_, you can either set the environment variable -once, or explicitly pass in the settings module each time you run the utility. - -Example (Unix Bash shell):: - - export DJANGO_SETTINGS_MODULE=mysite.settings - django-admin.py runserver - -Example (Windows shell):: - - set DJANGO_SETTINGS_MODULE=mysite.settings - django-admin.py runserver - -Use the ``--settings`` command-line argument to specify the settings manually:: - - django-admin.py runserver --settings=mysite.settings - -.. _django-admin.py: ../django-admin/ - -On the server (mod_python) --------------------------- - -In your live server environment, you'll need to tell Apache/mod_python which -settings file to use. Do that with ``SetEnv``:: - - <Location "/mysite/"> - SetHandler python-program - PythonHandler django.core.handlers.modpython - SetEnv DJANGO_SETTINGS_MODULE mysite.settings - </Location> - -Read the `Django mod_python documentation`_ for more information. - -.. _Django mod_python documentation: ../modpython/ - -Default settings -================ - -A Django settings file doesn't have to define any settings if it doesn't need -to. Each setting has a sensible default value. These defaults live in the file -``django/conf/global_settings.py``. - -Here's the algorithm Django uses in compiling settings: - - * Load settings from ``global_settings.py``. - * Load settings from the specified settings file, overriding the global - settings as necessary. - -Note that a settings file should *not* import from ``global_settings``, because -that's redundant. - -Seeing which settings you've changed ------------------------------------- - -There's an easy way to view which of your settings deviate from the default -settings. The command ``python manage.py diffsettings`` displays differences -between the current settings file and Django's default settings. - -For more, see the `diffsettings documentation`_. - -.. _diffsettings documentation: ../django-admin/#diffsettings - -Using settings in Python code -============================= - -In your Django apps, use settings by importing the object -``django.conf.settings``. Example:: - - from django.conf import settings - - if settings.DEBUG: - # Do something - -Note that ``django.conf.settings`` isn't a module -- it's an object. So -importing individual settings is not possible:: - - from django.conf.settings import DEBUG # This won't work. - -Also note that your code should *not* import from either ``global_settings`` or -your own settings file. ``django.conf.settings`` abstracts the concepts of -default settings and site-specific settings; it presents a single interface. -It also decouples the code that uses settings from the location of your -settings. - -Altering settings at runtime -============================ - -You shouldn't alter settings in your applications at runtime. For example, -don't do this in a view:: - - from django.conf import settings - - settings.DEBUG = True # Don't do this! - -The only place you should assign to settings is in a settings file. - -Security -======== - -Because a settings file contains sensitive information, such as the database -password, you should make every attempt to limit access to it. For example, -change its file permissions so that only you and your Web server's user can -read it. This is especially important in a shared-hosting environment. +.. _ref-settings: Available settings ================== @@ -152,6 +6,8 @@ Available settings Here's a full list of all available settings, in alphabetical order, and their default values. +.. setting:: ABSOLUTE_URL_OVERRIDES + ABSOLUTE_URL_OVERRIDES ---------------------- @@ -169,6 +25,8 @@ a model object and return its URL. This is a way of overriding Note that the model name used in this setting should be all lower-case, regardless of the case of the actual model class name. +.. setting:: ADMIN_FOR + ADMIN_FOR --------- @@ -180,6 +38,8 @@ modules (in the format ``'foo.bar.baz'``) for which this site is an admin. The admin site uses this in its automatically-introspected documentation of models, views and template tags. +.. setting:: ADMIN_MEDIA_PREFIX + ADMIN_MEDIA_PREFIX ------------------ @@ -191,6 +51,8 @@ slash, and to have this be different from the ``MEDIA_URL`` setting (since the same URL cannot be mapped onto two different sets of files). +.. setting:: ADMINS + ADMINS ------ @@ -203,8 +65,10 @@ of (Full name, e-mail address). Example:: (('John', 'john@example.com'), ('Mary', 'mary@example.com')) -Note that Django will e-mail *all* of these people whenever an error happens. See the -section on `error reporting via e-mail`_ for more information. +Note that Django will e-mail *all* of these people whenever an error happens. +See :ref:`howto-error-reporting` for more information. + +.. setting:: ALLOWED_INCLUDE_ROOTS ALLOWED_INCLUDE_ROOTS --------------------- @@ -219,50 +83,58 @@ For example, if ``ALLOWED_INCLUDE_ROOTS`` is ``('/home/html', '/var/www')``, then ``{% ssi /home/html/foo.txt %}`` would work, but ``{% ssi /etc/passwd %}`` wouldn't. +.. setting:: APPEND_SLASH + APPEND_SLASH ------------ Default: ``True`` Whether to append trailing slashes to URLs. This is only used if -``CommonMiddleware`` is installed (see the `middleware docs`_). See also +``CommonMiddleware`` is installed (see :ref:`topics-http-middleware`). See also ``PREPEND_WWW``. +.. setting:: AUTHENTICATION_BACKENDS + AUTHENTICATION_BACKENDS ----------------------- Default: ``('django.contrib.auth.backends.ModelBackend',)`` -A tuple of authentication backend classes (as strings) to use when -attempting to authenticate a user. See the `authentication backends -documentation`_ for details. +A tuple of authentication backend classes (as strings) to use when attempting to +authenticate a user. See the :ref:`authentication backends documentation +<authentication-backends>` for details. -.. _authentication backends documentation: ../authentication/#other-authentication-sources +.. setting:: AUTH_PROFILE_MODULE AUTH_PROFILE_MODULE ------------------- Default: Not defined -The site-specific user profile model used by this site. See the -`documentation on user profile models`_ for details. +The site-specific user profile model used by this site. See +:ref:`auth-profiles`. -.. _documentation on user profile models: ../authentication/#storing-additional-information-about-users +.. setting:: CACHE_BACKEND CACHE_BACKEND ------------- Default: ``'locmem://'`` -The cache backend to use. See the `cache docs`_. +The cache backend to use. See :ref:`topics-cache`. + +.. setting:: CACHE_MIDDLEWARE_KEY_PREFIX CACHE_MIDDLEWARE_KEY_PREFIX --------------------------- Default: ``''`` (Empty string) -The cache key prefix that the cache middleware should use. See the -`cache docs`_. +The cache key prefix that the cache middleware should use. See +:ref:`topics-cache`. + +.. setting:: CACHE_MIDDLEWARE_SECONDS CACHE_MIDDLEWARE_SECONDS ------------------------ @@ -272,6 +144,8 @@ Default: ``600`` The default number of seconds to cache a page when the caching middleware or ``cache_page()`` decorator is used. +.. setting:: DATABASE_ENGINE + DATABASE_ENGINE --------------- @@ -287,6 +161,8 @@ ship with Django by setting ``DATABASE_ENGINE`` to a fully-qualified path (i.e. scratch is left as an exercise to the reader; see the other backends for examples. +.. setting:: DATABASE_HOST + DATABASE_HOST ------------- @@ -305,9 +181,11 @@ this value is assumed to be the host. If you're using PostgreSQL, an empty string means to use a Unix domain socket for the connection, rather than a network connection to localhost. If you -explictly need to use a TCP/IP connection on the local machine with +explicitly need to use a TCP/IP connection on the local machine with PostgreSQL, specify ``localhost`` here. +.. setting:: DATABASE_NAME + DATABASE_NAME ------------- @@ -316,6 +194,8 @@ Default: ``''`` (Empty string) The name of the database to use. For SQLite, it's the full path to the database file. +.. setting:: DATABASE_OPTIONS + DATABASE_OPTIONS ---------------- @@ -324,6 +204,8 @@ Default: ``{}`` (Empty dictionary) Extra parameters to use when connecting to the database. Consult backend module's document for available keywords. +.. setting:: DATABASE_PASSWORD + DATABASE_PASSWORD ----------------- @@ -331,6 +213,8 @@ Default: ``''`` (Empty string) The password to use when connecting to the database. Not used with SQLite. +.. setting:: DATABASE_PORT + DATABASE_PORT ------------- @@ -339,6 +223,8 @@ Default: ``''`` (Empty string) The port to use when connecting to the database. An empty string means the default port. Not used with SQLite. +.. setting:: DATABASE_USER + DATABASE_USER ------------- @@ -346,6 +232,8 @@ Default: ``''`` (Empty string) The username to use when connecting to the database. Not used with SQLite. +.. setting:: DATE_FORMAT + DATE_FORMAT ----------- @@ -353,13 +241,13 @@ Default: ``'N j, Y'`` (e.g. ``Feb. 4, 2003``) The default formatting to use for date fields on Django admin change-list pages -- and, possibly, by other parts of the system. See -`allowed date format strings`_. +:ttag:`allowed date format strings <now>`. See also ``DATETIME_FORMAT``, ``TIME_FORMAT``, ``YEAR_MONTH_FORMAT`` and ``MONTH_DAY_FORMAT``. -.. _allowed date format strings: ../templates/#now - +.. setting:: DATETIME_FORMAT + DATETIME_FORMAT --------------- @@ -367,12 +255,12 @@ Default: ``'N j, Y, P'`` (e.g. ``Feb. 4, 2003, 4 p.m.``) The default formatting to use for datetime fields on Django admin change-list pages -- and, possibly, by other parts of the system. See -`allowed date format strings`_. +:ttag:`allowed date format strings <now>`. See also ``DATE_FORMAT``, ``DATETIME_FORMAT``, ``TIME_FORMAT``, ``YEAR_MONTH_FORMAT`` and ``MONTH_DAY_FORMAT``. -.. _allowed date format strings: ../templates/#now +.. setting:: DEBUG DEBUG ----- @@ -388,7 +276,7 @@ be able to give backtraces without seeing sensitive (or offensive) settings. Still, note that there are always going to be sections of your debug output that are inappropriate for public consumption. File paths, configuration options, and -the like all give attackers extra information about your server. +the like all give attackers extra information about your server. It is also important to remember that when running with ``DEBUG`` turned on, Django will remember every SQL query it executes. This is useful when you are debugging, @@ -408,6 +296,9 @@ will be suppressed, and exceptions will propagate upwards. This can be useful for some test setups, and should never be used on a live site. + +.. setting:: DEFAULT_CHARSET + DEFAULT_CHARSET --------------- @@ -417,6 +308,8 @@ Default charset to use for all ``HttpResponse`` objects, if a MIME type isn't manually specified. Used with ``DEFAULT_CONTENT_TYPE`` to construct the ``Content-Type`` header. +.. setting:: DEFAULT_CONTENT_TYPE + DEFAULT_CONTENT_TYPE -------------------- @@ -426,15 +319,15 @@ Default content type to use for all ``HttpResponse`` objects, if a MIME type isn't manually specified. Used with ``DEFAULT_CHARSET`` to construct the ``Content-Type`` header. +.. setting:: DEFAULT_FROM_EMAIL + DEFAULT_FILE_STORAGE -------------------- Default: ``django.core.files.storage.FileSystemStorage`` Default file storage class to be used for any file-related operations that don't -specify a particular storage system. See the `file documentation`_ for details. - -.. _file documentation: ../files/ +specify a particular storage system. See :ref:`topics-files`. DEFAULT_FROM_EMAIL ------------------ @@ -444,6 +337,8 @@ Default: ``'webmaster@localhost'`` Default e-mail address to use for various automated correspondence from the site manager(s). +.. setting:: DEFAULT_TABLESPACE + DEFAULT_TABLESPACE ------------------ @@ -454,6 +349,8 @@ Default: ``''`` (Empty string) Default tablespace to use for models that don't specify one, if the backend supports it. +.. setting:: DEFAULT_INDEX_TABLESPACE + DEFAULT_INDEX_TABLESPACE ------------------------ @@ -464,15 +361,19 @@ Default: ``''`` (Empty string) Default tablespace to use for indexes on fields that don't specify one, if the backend supports it. +.. setting:: DISALLOWED_USER_AGENTS + DISALLOWED_USER_AGENTS ---------------------- Default: ``()`` (Empty tuple) -List of compiled regular expression objects representing User-Agent strings -that are not allowed to visit any page, systemwide. Use this for bad -robots/crawlers. This is only used if ``CommonMiddleware`` is installed (see -the `middleware docs`_). +List of compiled regular expression objects representing User-Agent strings that +are not allowed to visit any page, systemwide. Use this for bad robots/crawlers. +This is only used if ``CommonMiddleware`` is installed (see +:ref:`topics-http-middleware`). + +.. setting:: EMAIL_HOST EMAIL_HOST ---------- @@ -483,6 +384,8 @@ The host to use for sending e-mail. See also ``EMAIL_PORT``. +.. setting:: EMAIL_HOST_PASSWORD + EMAIL_HOST_PASSWORD ------------------- @@ -491,10 +394,12 @@ Default: ``''`` (Empty string) Password to use for the SMTP server defined in ``EMAIL_HOST``. This setting is used in conjunction with ``EMAIL_HOST_USER`` when authenticating to the SMTP server. If either of these settings is empty, Django won't attempt -authenticaion. +authentication. See also ``EMAIL_HOST_USER``. +.. setting:: EMAIL_HOST_USER + EMAIL_HOST_USER --------------- @@ -505,6 +410,8 @@ Django won't attempt authentication. See also ``EMAIL_HOST_PASSWORD``. +.. setting:: EMAIL_PORT + EMAIL_PORT ---------- @@ -512,6 +419,8 @@ Default: ``25`` Port to use for the SMTP server defined in ``EMAIL_HOST``. +.. setting:: EMAIL_SUBJECT_PREFIX + EMAIL_SUBJECT_PREFIX -------------------- @@ -521,6 +430,8 @@ Subject-line prefix for e-mail messages sent with ``django.core.mail.mail_admins or ``django.core.mail.mail_managers``. You'll probably want to include the trailing space. +.. setting:: EMAIL_USE_TLS + EMAIL_USE_TLS ------------- @@ -530,6 +441,8 @@ Default: ``False`` Whether to use a TLS (secure) connection when talking to the SMTP server. +.. setting:: FILE_CHARSET + FILE_CHARSET ------------ @@ -550,9 +463,7 @@ Default:: ("django.core.files.uploadhandler.MemoryFileUploadHandler", "django.core.files.uploadhandler.TemporaryFileUploadHandler",) -A tuple of handlers to use for uploading. See `file uploads`_ for details. - -.. _file uploads: ../upload_handling/ +A tuple of handlers to use for uploading. See :ref:`topics-files` for details. FILE_UPLOAD_MAX_MEMORY_SIZE --------------------------- @@ -562,7 +473,7 @@ FILE_UPLOAD_MAX_MEMORY_SIZE Default: ``2621440`` (i.e. 2.5 MB). The maximum size (in bytes) that an upload will be before it gets streamed to -the file system. See `file uploads`_ for details. +the file system. See :ref:`topics-files` for details. FILE_UPLOAD_TEMP_DIR -------------------- @@ -575,7 +486,9 @@ The directory to store data temporarily while uploading files. If ``None``, Django will use the standard temporary directory for the operating system. For example, this will default to '/tmp' on \*nix-style operating systems. -See `file uploads`_ for details. +See :ref:`topics-files` for details. + +.. setting:: FIXTURE_DIRS FIXTURE_DIRS ------------- @@ -584,9 +497,7 @@ Default: ``()`` (Empty tuple) List of locations of the fixture data files, in search order. Note that these paths should use Unix-style forward slashes, even on Windows. See -`Testing Django Applications`_. - -.. _Testing Django Applications: ../testing/ +:ref:`topics-testing`. FORCE_SCRIPT_NAME ------------------ @@ -598,6 +509,8 @@ environment variable in any HTTP request. This setting can be used to override the server-provided value of ``SCRIPT_NAME``, which may be a rewritten version of the preferred value or not supplied at all. +.. setting:: IGNORABLE_404_ENDS + IGNORABLE_404_ENDS ------------------ @@ -605,6 +518,8 @@ Default: ``('mail.pl', 'mailform.pl', 'mail.cgi', 'mailform.cgi', 'favicon.ico', See also ``IGNORABLE_404_STARTS`` and ``Error reporting via e-mail``. +.. setting:: IGNORABLE_404_STARTS + IGNORABLE_404_STARTS -------------------- @@ -612,7 +527,9 @@ Default: ``('/cgi-bin/', '/_vti_bin', '/_vti_inf')`` A tuple of strings that specify beginnings of URLs that should be ignored by the 404 e-mailer. See ``SEND_BROKEN_LINK_EMAILS``, ``IGNORABLE_404_ENDS`` and -the section on `error reporting via e-mail`_. +the :ref:`howto-error-reporting`. + +.. setting:: INSTALLED_APPS INSTALLED_APPS -------------- @@ -621,9 +538,10 @@ Default: ``()`` (Empty tuple) A tuple of strings designating all applications that are enabled in this Django installation. Each string should be a full Python path to a Python package that -contains a Django application, as created by `django-admin.py startapp`_. +contains a Django application, as created by :djadmin:`django-admin.py startapp +<startapp>`. -.. _django-admin.py startapp: ../django-admin/#startapp-appname +.. setting:: INTERNAL_IPS INTERNAL_IPS ------------ @@ -633,8 +551,10 @@ Default: ``()`` (Empty tuple) A tuple of IP addresses, as strings, that: * See debug comments, when ``DEBUG`` is ``True`` - * Receive X headers if the ``XViewMiddleware`` is installed (see the - `middleware docs`_) + * Receive X headers if the ``XViewMiddleware`` is installed (see + :ref:`topics-http-middleware`) + +.. setting:: JING_PATH JING_PATH --------- @@ -645,16 +565,18 @@ Path to the "Jing" executable. Jing is a RELAX NG validator, and Django uses it to validate each ``XMLField`` in your models. See http://www.thaiopensource.com/relaxng/jing.html . +.. setting:: LANGUAGE_CODE + LANGUAGE_CODE ------------- Default: ``'en-us'`` -A string representing the language code for this installation. This should be -in standard language format. For example, U.S. English is ``"en-us"``. See the -`internationalization docs`_. +A string representing the language code for this installation. This should be in +standard language format. For example, U.S. English is ``"en-us"``. See +:ref:`topics-i18n`. -.. _internationalization docs: ../i18n/ +.. setting:: LANGUAGE_COOKIE_NAME LANGUAGE_COOKIE_NAME -------------------- @@ -663,9 +585,11 @@ LANGUAGE_COOKIE_NAME Default: ``'django_language'`` -The name of the cookie to use for the language cookie. This can be whatever -you want (but should be different from ``SESSION_COOKIE_NAME``). See the -`internationalization docs`_ for details. +The name of the cookie to use for the language cookie. This can be whatever you +want (but should be different from ``SESSION_COOKIE_NAME``). See +:ref:`topics-i18n`. + +.. setting:: LANGUAGES LANGUAGES --------- @@ -679,8 +603,7 @@ see the current list of translated languages by looking in The list is a tuple of two-tuples in the format (language code, language name) -- for example, ``('ja', 'Japanese')``. This specifies which languages -are available for language selection. See the `internationalization docs`_ for -details. +are available for language selection. See :ref:`topics-i18n`. Generally, the default value should suffice. Only set this setting if you want to restrict language selection to a subset of the Django-provided languages. @@ -707,16 +630,17 @@ mark these strings for translation, but the translation won't happen at runtime -- so you'll have to remember to wrap the languages in the *real* ``gettext()`` in any code that uses ``LANGUAGES`` at runtime. +.. setting:: LOCALE_PATHS + LOCALE_PATHS ------------ Default: ``()`` (Empty tuple) A tuple of directories where Django looks for translation files. -See the `internationalization docs section`_ explaining the variable and the -default behavior. +See :ref:`translations-in-your-own-projects`. -.. _internationalization docs section: ../i18n/#using-translations-in-your-own-projects +.. setting:: LOGIN_REDIRECT_URL LOGIN_REDIRECT_URL ------------------ @@ -728,7 +652,10 @@ Default: ``'/accounts/profile/'`` The URL where requests are redirected after login when the ``contrib.auth.login`` view gets no ``next`` parameter. -This is used by the `@login_required`_ decorator, for example. +This is used by the :func:`~django.contrib.auth.decorators.login_required` +decorator, for example. + +.. setting:: LOGIN_URL LOGIN_URL --------- @@ -738,7 +665,9 @@ LOGIN_URL Default: ``'/accounts/login/'`` The URL where requests are redirected for login, specially when using the -`@login_required`_ decorator. +:func:`~django.contrib.auth.decorators.login_required` decorator. + +.. setting:: LOGOUT_URL LOGOUT_URL ---------- @@ -749,6 +678,8 @@ Default: ``'/accounts/logout/'`` LOGIN_URL counterpart. +.. setting:: MANAGERS + MANAGERS -------- @@ -757,6 +688,8 @@ Default: ``()`` (Empty tuple) A tuple in the same format as ``ADMINS`` that specifies who should get broken-link notifications when ``SEND_BROKEN_LINK_EMAILS=True``. +.. setting:: MEDIA_ROOT + MEDIA_ROOT ---------- @@ -765,6 +698,8 @@ Default: ``''`` (Empty string) Absolute path to the directory that holds media for this installation. Example: ``"/home/media/media.lawrence.com/"`` See also ``MEDIA_URL``. +.. setting:: MEDIA_URL + MEDIA_URL --------- @@ -778,6 +713,8 @@ Note that this should have a trailing slash if it has a path component. Good: ``"http://www.example.com/static/"`` Bad: ``"http://www.example.com/static"`` +.. setting:: MIDDLEWARE_CLASSES + MIDDLEWARE_CLASSES ------------------ @@ -788,7 +725,9 @@ Default:: "django.middleware.common.CommonMiddleware", "django.middleware.doc.XViewMiddleware") -A tuple of middleware classes to use. See the `middleware docs`_. +A tuple of middleware classes to use. See :ref:`topics-http-middleware`. + +.. setting:: MONTH_DAY_FORMAT MONTH_DAY_FORMAT ---------------- @@ -804,18 +743,22 @@ drilldown, the header for a given day displays the day and month. Different locales have different formats. For example, U.S. English would say "January 1," whereas Spanish might say "1 Enero." -See `allowed date format strings`_. See also ``DATE_FORMAT``, +See :ttag:`allowed date format strings <now>`. See also ``DATE_FORMAT``, ``DATETIME_FORMAT``, ``TIME_FORMAT`` and ``YEAR_MONTH_FORMAT``. +.. setting:: PREPEND_WWW + PREPEND_WWW ----------- Default: ``False`` -Whether to prepend the "www." subdomain to URLs that don't have it. This is -only used if ``CommonMiddleware`` is installed (see the `middleware docs`_). +Whether to prepend the "www." subdomain to URLs that don't have it. This is only +used if ``CommonMiddleware`` is installed (see :ref:`topics-http-middleware`). See also ``APPEND_SLASH``. +.. setting:: PROFANITIES_LIST + PROFANITIES_LIST ---------------- @@ -825,6 +768,8 @@ the ``hasNoProfanities`` validator is called. We don't list the default values here, because that would be profane. To see the default values, see the file ``django/conf/global_settings.py``. +.. setting:: ROOT_URLCONF + ROOT_URLCONF ------------ @@ -833,9 +778,9 @@ Default: Not defined A string representing the full Python import path to your root URLconf. For example: ``"mydjangoapps.urls"``. Can be overridden on a per-request basis by setting the attribute ``urlconf`` on the incoming ``HttpRequest`` -object. See `How Django processes a request`_ for details. +object. See :ref:`how-django-processes-a-request` for details. -.. _How Django processes a request: ../url_dispatch/#how-django-processes-a-request +.. setting:: SECRET_KEY SECRET_KEY ---------- @@ -846,6 +791,8 @@ A secret key for this particular Django installation. Used to provide a seed in secret-key hashing algorithms. Set this to a random string -- the longer, the better. ``django-admin.py startproject`` creates one automatically. +.. setting:: SEND_BROKEN_LINK_EMAILS + SEND_BROKEN_LINK_EMAILS ----------------------- @@ -853,9 +800,11 @@ Default: ``False`` Whether to send an e-mail to the ``MANAGERS`` each time somebody visits a Django-powered page that is 404ed with a non-empty referer (i.e., a broken -link). This is only used if ``CommonMiddleware`` is installed (see the -`middleware docs`_). See also ``IGNORABLE_404_STARTS``, -``IGNORABLE_404_ENDS`` and the section on `error reporting via e-mail`_ +link). This is only used if ``CommonMiddleware`` is installed (see +:ref:`topics-http-middleware`. See also ``IGNORABLE_404_STARTS``, +``IGNORABLE_404_ENDS`` and :ref:`howto-error-reporting`. + +.. setting:: SERIALIZATION_MODULES SERIALIZATION_MODULES --------------------- @@ -868,6 +817,8 @@ example, to define a YAML serializer, use:: SERIALIZATION_MODULES = { 'yaml' : 'path.to.yaml_serializer' } +.. setting:: SERVER_EMAIL + SERVER_EMAIL ------------ @@ -876,6 +827,8 @@ Default: ``'root@localhost'`` The e-mail address that error messages come from, such as those sent to ``ADMINS`` and ``MANAGERS``. +.. setting:: SESSION_ENGINE + SESSION_ENGINE -------------- @@ -889,14 +842,18 @@ Controls where Django stores session data. Valid values are: * ``'django.contrib.sessions.backends.file'`` * ``'django.contrib.sessions.backends.cache'`` -See the `session docs`_ for more details. +See :ref:`topics-http-sessions`. + +.. setting:: SESSION_COOKIE_AGE SESSION_COOKIE_AGE ------------------ Default: ``1209600`` (2 weeks, in seconds) -The age of session cookies, in seconds. See the `session docs`_. +The age of session cookies, in seconds. See :ref:`topics-http-sessions`. + +.. setting:: SESSION_COOKIE_DOMAIN SESSION_COOKIE_DOMAIN --------------------- @@ -905,7 +862,9 @@ Default: ``None`` The domain to use for session cookies. Set this to a string such as ``".lawrence.com"`` for cross-domain cookies, or use ``None`` for a standard -domain cookie. See the `session docs`_. +domain cookie. See the :ref:`topics-http-sessions`. + +.. setting:: SESSION_COOKIE_NAME SESSION_COOKIE_NAME ------------------- @@ -913,7 +872,9 @@ SESSION_COOKIE_NAME Default: ``'sessionid'`` The name of the cookie to use for sessions. This can be whatever you want (but -should be different from ``LANGUAGE_COOKIE_NAME``). See the `session docs`_. +should be different from ``LANGUAGE_COOKIE_NAME``). See the :ref:`topics-http-sessions`. + +.. setting:: SESSION_COOKIE_PATH SESSION_COOKIE_PATH ------------------- @@ -929,6 +890,8 @@ This is useful if you have multiple Django instances running under the same hostname. They can use different cookie paths, and each instance will only see its own session cookie. +.. setting:: SESSION_COOKIE_SECURE + SESSION_COOKIE_SECURE --------------------- @@ -937,7 +900,9 @@ Default: ``False`` Whether to use a secure cookie for the session cookie. If this is set to ``True``, the cookie will be marked as "secure," which means browsers may ensure that the cookie is only sent under an HTTPS connection. -See the `session docs`_. +See the :ref:`topics-http-sessions`. + +.. setting:: SESSION_EXPIRE_AT_BROWSER_CLOSE SESSION_EXPIRE_AT_BROWSER_CLOSE ------------------------------- @@ -945,7 +910,9 @@ SESSION_EXPIRE_AT_BROWSER_CLOSE Default: ``False`` Whether to expire the session when the user closes his or her browser. -See the `session docs`_. +See the :ref:`topics-http-sessions`. + +.. setting:: SESSION_FILE_PATH SESSION_FILE_PATH ----------------- @@ -955,15 +922,19 @@ SESSION_FILE_PATH Default: ``/tmp/`` If you're using file-based session storage, this sets the directory in -which Django will store session data. See the `session docs`_ for -more details. +which Django will store session data. See :ref:`topics-http-sessions`. + +.. setting:: SESSION_SAVE_EVERY_REQUEST SESSION_SAVE_EVERY_REQUEST -------------------------- Default: ``False`` -Whether to save the session data on every request. See the `session docs`_. +Whether to save the session data on every request. See +:ref:`topics-http-sessions`. + +.. setting:: SITE_ID SITE_ID ------- @@ -974,10 +945,12 @@ The ID, as an integer, of the current site in the ``django_site`` database table. This is used so that application data can hook into specific site(s) and a single database can manage content for multiple sites. -See the `site framework docs`_. +See :ref:`ref-contrib-sites`. .. _site framework docs: ../sites/ +.. setting:: TEMPLATE_CONTEXT_PROCESSORS + TEMPLATE_CONTEXT_PROCESSORS --------------------------- @@ -992,6 +965,8 @@ A tuple of callables that are used to populate the context in ``RequestContext`` These callables take a request object as their argument and return a dictionary of items to be merged into the context. +.. setting:: TEMPLATE_DEBUG + TEMPLATE_DEBUG -------------- @@ -1007,6 +982,8 @@ you'll want to set that to take advantage of this setting. See also ``DEBUG``. +.. setting:: TEMPLATE_DIRS + TEMPLATE_DIRS ------------- @@ -1015,18 +992,22 @@ Default: ``()`` (Empty tuple) List of locations of the template source files, in search order. Note that these paths should use Unix-style forward slashes, even on Windows. -See the `template documentation`_. +See :ref:`topics-templates`.. + +.. setting:: TEMPLATE_LOADERS TEMPLATE_LOADERS ---------------- -Default:: +Default: ('django.template.loaders.filesystem.load_template_source', 'django.template.loaders.app_directories.load_template_source') A tuple of callables (as strings) that know how to import templates from -various sources. See the `template documentation`_. +various sources. See :ref:`ref-templates-api`. + +.. setting:: TEMPLATE_STRING_IF_INVALID TEMPLATE_STRING_IF_INVALID -------------------------- @@ -1034,9 +1015,9 @@ TEMPLATE_STRING_IF_INVALID Default: ``''`` (Empty string) Output, as a string, that the template system should use for invalid (e.g. -misspelled) variables. See `How invalid variables are handled`_. +misspelled) variables. See :ref:`invalid-template-variables`.. -.. _How invalid variables are handled: ../templates_python/#how-invalid-variables-are-handled +.. setting:: TEST_DATABASE_CHARSET TEST_DATABASE_CHARSET --------------------- @@ -1054,6 +1035,8 @@ Supported for the PostgreSQL_ (``postgresql``, ``postgresql_psycopg2``) and MySQ .. _PostgreSQL: http://www.postgresql.org/docs/8.2/static/multibyte.html .. _MySQL: http://www.mysql.org/doc/refman/5.0/en/charset-database.html +.. setting:: TEST_DATABASE_COLLATION + TEST_DATABASE_COLLATION ------------------------ @@ -1069,6 +1052,8 @@ manual for details). .. _section 10.3.2: http://www.mysql.org/doc/refman/5.0/en/charset-database.html +.. setting:: TEST_DATABASE_NAME + TEST_DATABASE_NAME ------------------ @@ -1080,9 +1065,9 @@ If the default value (``None``) is used with the SQLite database engine, the tests will use a memory resident database. For all other database engines the test database will use the name ``'test_' + settings.DATABASE_NAME``. -See `Testing Django Applications`_. +See :ref:`topics-testing`. -.. _Testing Django Applications: ../testing/ +.. setting:: TEST_RUNNER TEST_RUNNER ----------- @@ -1090,10 +1075,12 @@ TEST_RUNNER Default: ``'django.test.simple.run_tests'`` The name of the method to use for starting the test suite. See -`Testing Django Applications`_. +:ref:`topics-testing`. .. _Testing Django Applications: ../testing/ +.. setting:: TIME_FORMAT + TIME_FORMAT ----------- @@ -1101,12 +1088,12 @@ Default: ``'P'`` (e.g. ``4 p.m.``) The default formatting to use for time fields on Django admin change-list pages -- and, possibly, by other parts of the system. See -`allowed date format strings`_. +:ttag:`allowed date format strings <now>`. See also ``DATE_FORMAT``, ``DATETIME_FORMAT``, ``TIME_FORMAT``, ``YEAR_MONTH_FORMAT`` and ``MONTH_DAY_FORMAT``. -.. _allowed date format strings: ../templates/#now +.. setting:: TIME_ZONE TIME_ZONE --------- @@ -1124,7 +1111,7 @@ not necessarily the timezone of the server. For example, one server may serve multiple Django-powered sites, each with a separate time-zone setting. Normally, Django sets the ``os.environ['TZ']`` variable to the time zone you -specify in the ``TIME_ZONE`` setting. Thus, all your views and models will +specify in the ``TIME_ZONE`` setting. Thus, all your views and models will automatically operate in the correct time zone. However, if you're using the manual configuration option (see below), Django will *not* touch the ``TZ`` environment variable, and it'll be up to you to ensure your processes are @@ -1134,6 +1121,10 @@ running in the correct environment. Django cannot reliably use alternate time zones in a Windows environment. If you're running Django on Windows, this variable must be set to match the system timezone. + +.. _See available choices: http://www.postgresql.org/docs/8.1/static/datetime-keywords.html#DATETIME-TIMEZONE-SET-TABLE + +.. setting:: URL_VALIDATOR_USER_AGENT URL_VALIDATOR_USER_AGENT ------------------------ @@ -1141,9 +1132,9 @@ URL_VALIDATOR_USER_AGENT Default: ``Django/<version> (http://www.djangoproject.com/)`` The string to use as the ``User-Agent`` header when checking to see if URLs -exist (see the ``verify_exists`` option on URLField_). +exist (see the ``verify_exists`` option on :class:`~django.db.models.URLField`). -.. _URLField: ../model-api/#urlfield +.. setting:: USE_ETAGS USE_ETAGS --------- @@ -1152,7 +1143,9 @@ Default: ``False`` A boolean that specifies whether to output the "Etag" header. This saves bandwidth but slows down performance. This is only used if ``CommonMiddleware`` -is installed (see the `middleware docs`_). +is installed (see :ref:`topics-http-middleware`). + +.. setting:: USE_I18N USE_I18N -------- @@ -1164,6 +1157,8 @@ enabled. This provides an easy way to turn it off, for performance. If this is set to ``False``, Django will make some optimizations so as not to load the internationalization machinery. +.. setting:: YEAR_MONTH_FORMAT + YEAR_MONTH_FORMAT ----------------- @@ -1178,141 +1173,5 @@ drilldown, the header for a given month displays the month and the year. Different locales have different formats. For example, U.S. English would say "January 2006," whereas another locale might say "2006/January." -See `allowed date format strings`_. See also ``DATE_FORMAT``, +See :ttag:`allowed date format strings <now>`. See also ``DATE_FORMAT``, ``DATETIME_FORMAT``, ``TIME_FORMAT`` and ``MONTH_DAY_FORMAT``. - -.. _cache docs: ../cache/ -.. _middleware docs: ../middleware/ -.. _session docs: ../sessions/ -.. _See available choices: http://www.postgresql.org/docs/8.1/static/datetime-keywords.html#DATETIME-TIMEZONE-SET-TABLE -.. _template documentation: ../templates_python/ - -Creating your own settings -========================== - -There's nothing stopping you from creating your own settings, for your own -Django apps. Just follow these conventions: - - * Setting names are in all uppercase. - * For settings that are sequences, use tuples instead of lists. This is - purely for performance. - * Don't reinvent an already-existing setting. - -Using settings without setting DJANGO_SETTINGS_MODULE -===================================================== - -In some cases, you might want to bypass the ``DJANGO_SETTINGS_MODULE`` -environment variable. For example, if you're using the template system by -itself, you likely don't want to have to set up an environment variable -pointing to a settings module. - -In these cases, you can configure Django's settings manually. Do this by -calling ``django.conf.settings.configure()``. - -Example:: - - from django.conf import settings - - settings.configure(DEBUG=True, TEMPLATE_DEBUG=True, - TEMPLATE_DIRS=('/home/web-apps/myapp', '/home/web-apps/base')) - -Pass ``configure()`` as many keyword arguments as you'd like, with each keyword -argument representing a setting and its value. Each argument name should be all -uppercase, with the same name as the settings described above. If a particular -setting is not passed to ``configure()`` and is needed at some later point, -Django will use the default setting value. - -Configuring Django in this fashion is mostly necessary -- and, indeed, -recommended -- when you're using a piece of the framework inside a larger -application. - -Consequently, when configured via ``settings.configure()``, Django will not -make any modifications to the process environment variables. (See the -explanation of ``TIME_ZONE``, above, for why this would normally occur.) It's -assumed that you're already in full control of your environment in these cases. - -Custom default settings ------------------------ - -If you'd like default values to come from somewhere other than -``django.conf.global_settings``, you can pass in a module or class that -provides the default settings as the ``default_settings`` argument (or as the -first positional argument) in the call to ``configure()``. - -In this example, default settings are taken from ``myapp_defaults``, and the -``DEBUG`` setting is set to ``True``, regardless of its value in -``myapp_defaults``:: - - from django.conf import settings - from myapp import myapp_defaults - - settings.configure(default_settings=myapp_defaults, DEBUG=True) - -The following example, which uses ``myapp_defaults`` as a positional argument, -is equivalent:: - - settings.configure(myapp_defaults, DEBUG = True) - -Normally, you will not need to override the defaults in this fashion. The -Django defaults are sufficiently tame that you can safely use them. Be aware -that if you do pass in a new default module, it entirely *replaces* the Django -defaults, so you must specify a value for every possible setting that might be -used in that code you are importing. Check in -``django.conf.settings.global_settings`` for the full list. - -Either configure() or DJANGO_SETTINGS_MODULE is required --------------------------------------------------------- - -If you're not setting the ``DJANGO_SETTINGS_MODULE`` environment variable, you -*must* call ``configure()`` at some point before using any code that reads -settings. - -If you don't set ``DJANGO_SETTINGS_MODULE`` and don't call ``configure()``, -Django will raise an ``ImportError`` exception the first time a setting -is accessed. - -If you set ``DJANGO_SETTINGS_MODULE``, access settings values somehow, *then* -call ``configure()``, Django will raise a ``RuntimeError`` indicating -that settings have already been configured. - -Also, it's an error to call ``configure()`` more than once, or to call -``configure()`` after any setting has been accessed. - -It boils down to this: Use exactly one of either ``configure()`` or -``DJANGO_SETTINGS_MODULE``. Not both, and not neither. - -.. _@login_required: ../authentication/#the-login-required-decorator - -Error reporting via e-mail -========================== - -Server errors -------------- - -When ``DEBUG`` is ``False``, Django will e-mail the users listed in the -``ADMINS`` setting whenever your code raises an unhandled exception and results -in an internal server error (HTTP status code 500). This gives the -administrators immediate notification of any errors. - -To disable this behavior, just remove all entries from the ``ADMINS`` setting. - -404 errors ----------- - -When ``DEBUG`` is ``False``, ``SEND_BROKEN_LINK_EMAILS`` is ``True`` and your -``MIDDLEWARE_CLASSES`` setting includes ``CommonMiddleware``, Django will -e-mail the users listed in the ``MANAGERS`` setting whenever your code raises -a 404 and the request has a referer. (It doesn't bother to e-mail for 404s -that don't have a referer.) - -You can tell Django to stop reporting particular 404s by tweaking the -``IGNORABLE_404_ENDS`` and ``IGNORABLE_404_STARTS`` settings. Both should be a -tuple of strings. For example:: - - IGNORABLE_404_ENDS = ('.php', '.cgi') - IGNORABLE_404_STARTS = ('/phpmyadmin/',) - -In this example, a 404 to any URL ending with ``.php`` or ``.cgi`` will *not* -be reported. Neither will any URL starting with ``/phpmyadmin/``. - -To disable this behavior, just remove all entries from the ``MANAGERS`` setting. diff --git a/docs/ref/templates/api.txt b/docs/ref/templates/api.txt new file mode 100644 index 0000000000..c78f130972 --- /dev/null +++ b/docs/ref/templates/api.txt @@ -0,0 +1,612 @@ +.. _ref-templates-api: + +==================================================== +The Django template language: For Python programmers +==================================================== + +This document explains the Django template system from a technical +perspective -- how it works and how to extend it. If you're just looking for +reference on the language syntax, see :ref:`topics-templates`. + +If you're looking to use the Django template system as part of another +application -- i.e., without the rest of the framework -- make sure to read +the `configuration`_ section later in this document. + +.. _configuration: `configuring the template system in standalone mode`_ + +Basics +====== + +A **template** is a text document, or a normal Python string, that is marked-up +using the Django template language. A template can contain **block tags** or +**variables**. + +A **block tag** is a symbol within a template that does something. + +This definition is deliberately vague. For example, a block tag can output +content, serve as a control structure (an "if" statement or "for" loop), grab +content from a database or enable access to other template tags. + +Block tags are surrounded by ``"{%"`` and ``"%}"``. + +Example template with block tags:: + + {% if is_logged_in %}Thanks for logging in!{% else %}Please log in.{% endif %} + +A **variable** is a symbol within a template that outputs a value. + +Variable tags are surrounded by ``"{{"`` and ``"}}"``. + +Example template with variables:: + + My first name is {{ first_name }}. My last name is {{ last_name }}. + +A **context** is a "variable name" -> "variable value" mapping that is passed +to a template. + +A template **renders** a context by replacing the variable "holes" with values +from the context and executing all block tags. + +Using the template system +========================= + +Using the template system in Python is a two-step process: + + * First, you compile the raw template code into a ``Template`` object. + * Then, you call the ``render()`` method of the ``Template`` object with a + given context. + +Compiling a string +------------------ + +The easiest way to create a ``Template`` object is by instantiating it +directly. The class lives at ``django.template.Template``. The constructor +takes one argument -- the raw template code:: + + >>> from django.template import Template + >>> t = Template("My name is {{ my_name }}.") + >>> print t + <django.template.Template instance> + +.. admonition:: Behind the scenes + + The system only parses your raw template code once -- when you create the + ``Template`` object. From then on, it's stored internally as a "node" + structure for performance. + + Even the parsing itself is quite fast. Most of the parsing happens via a + single call to a single, short, regular expression. + +Rendering a context +------------------- + +Once you have a compiled ``Template`` object, you can render a context -- or +multiple contexts -- with it. The ``Context`` class lives at +``django.template.Context``, and the constructor takes one (optional) +argument: a dictionary mapping variable names to variable values. Call the +``Template`` object's ``render()`` method with the context to "fill" the +template:: + + >>> from django.template import Context, Template + >>> t = Template("My name is {{ my_name }}.") + + >>> c = Context({"my_name": "Adrian"}) + >>> t.render(c) + "My name is Adrian." + + >>> c = Context({"my_name": "Dolores"}) + >>> t.render(c) + "My name is Dolores." + +Variable names must consist of any letter (A-Z), any digit (0-9), an underscore +or a dot. + +Dots have a special meaning in template rendering. A dot in a variable name +signifies **lookup**. Specifically, when the template system encounters a dot +in a variable name, it tries the following lookups, in this order: + + * Dictionary lookup. Example: ``foo["bar"]`` + * Attribute lookup. Example: ``foo.bar`` + * Method call. Example: ``foo.bar()`` + * List-index lookup. Example: ``foo[bar]`` + +The template system uses the first lookup type that works. It's short-circuit +logic. + +Here are a few examples:: + + >>> from django.template import Context, Template + >>> t = Template("My name is {{ person.first_name }}.") + >>> d = {"person": {"first_name": "Joe", "last_name": "Johnson"}} + >>> t.render(Context(d)) + "My name is Joe." + + >>> class PersonClass: pass + >>> p = PersonClass() + >>> p.first_name = "Ron" + >>> p.last_name = "Nasty" + >>> t.render(Context({"person": p})) + "My name is Ron." + + >>> class PersonClass2: + ... def first_name(self): + ... return "Samantha" + >>> p = PersonClass2() + >>> t.render(Context({"person": p})) + "My name is Samantha." + + >>> t = Template("The first stooge in the list is {{ stooges.0 }}.") + >>> c = Context({"stooges": ["Larry", "Curly", "Moe"]}) + >>> t.render(c) + "The first stooge in the list is Larry." + +Method lookups are slightly more complex than the other lookup types. Here are +some things to keep in mind: + + * If, during the method lookup, a method raises an exception, the exception + will be propagated, unless the exception has an attribute + ``silent_variable_failure`` whose value is ``True``. If the exception + *does* have a ``silent_variable_failure`` attribute, the variable will + render as an empty string. Example:: + + >>> t = Template("My name is {{ person.first_name }}.") + >>> class PersonClass3: + ... def first_name(self): + ... raise AssertionError, "foo" + >>> p = PersonClass3() + >>> t.render(Context({"person": p})) + Traceback (most recent call last): + ... + AssertionError: foo + + >>> class SilentAssertionError(Exception): + ... silent_variable_failure = True + >>> class PersonClass4: + ... def first_name(self): + ... raise SilentAssertionError + >>> p = PersonClass4() + >>> t.render(Context({"person": p})) + "My name is ." + + Note that ``django.core.exceptions.ObjectDoesNotExist``, which is the + base class for all Django database API ``DoesNotExist`` exceptions, has + ``silent_variable_failure = True``. So if you're using Django templates + with Django model objects, any ``DoesNotExist`` exception will fail + silently. + + * A method call will only work if the method has no required arguments. + Otherwise, the system will move to the next lookup type (list-index + lookup). + + * Obviously, some methods have side effects, and it'd be either foolish or + a security hole to allow the template system to access them. + + A good example is the ``delete()`` method on each Django model object. + The template system shouldn't be allowed to do something like this:: + + I will now delete this valuable data. {{ data.delete }} + + To prevent this, set a function attribute ``alters_data`` on the method. + The template system won't execute a method if the method has + ``alters_data=True`` set. The dynamically-generated ``delete()`` and + ``save()`` methods on Django model objects get ``alters_data=True`` + automatically. Example:: + + def sensitive_function(self): + self.database_record.delete() + sensitive_function.alters_data = True + +.. _invalid-template-variables: + +How invalid variables are handled +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Generally, if a variable doesn't exist, the template system inserts the +value of the :setting:`TEMPLATE_STRING_IF_INVALID` setting, which is set to +``''`` (the empty string) by default. + +Filters that are applied to an invalid variable will only be applied if +:setting:`TEMPLATE_STRING_IF_INVALID` is set to ``''`` (the empty string). If +:setting:`TEMPLATE_STRING_IF_INVALID` is set to any other value, variable +filters will be ignored. + +This behavior is slightly different for the ``if``, ``for`` and ``regroup`` +template tags. If an invalid variable is provided to one of these template +tags, the variable will be interpreted as ``None``. Filters are always +applied to invalid variables within these template tags. + +If :setting:`TEMPLATE_STRING_IF_INVALID` contains a ``'%s'``, the format marker will +be replaced with the name of the invalid variable. + +.. admonition:: For debug purposes only! + + While :setting:`TEMPLATE_STRING_IF_INVALID` can be a useful debugging tool, + it is a bad idea to turn it on as a 'development default'. + + Many templates, including those in the Admin site, rely upon the + silence of the template system when a non-existent variable is + encountered. If you assign a value other than ``''`` to + :setting:`TEMPLATE_STRING_IF_INVALID`, you will experience rendering + problems with these templates and sites. + + Generally, :setting:`TEMPLATE_STRING_IF_INVALID` should only be enabled + in order to debug a specific template problem, then cleared + once debugging is complete. + +Playing with Context objects +---------------------------- + +Most of the time, you'll instantiate ``Context`` objects by passing in a +fully-populated dictionary to ``Context()``. But you can add and delete items +from a ``Context`` object once it's been instantiated, too, using standard +dictionary syntax:: + + >>> c = Context({"foo": "bar"}) + >>> c['foo'] + 'bar' + >>> del c['foo'] + >>> c['foo'] + '' + >>> c['newvariable'] = 'hello' + >>> c['newvariable'] + 'hello' + +A ``Context`` object is a stack. That is, you can ``push()`` and ``pop()`` it. +If you ``pop()`` too much, it'll raise +``django.template.ContextPopException``:: + + >>> c = Context() + >>> c['foo'] = 'first level' + >>> c.push() + >>> c['foo'] = 'second level' + >>> c['foo'] + 'second level' + >>> c.pop() + >>> c['foo'] + 'first level' + >>> c['foo'] = 'overwritten' + >>> c['foo'] + 'overwritten' + >>> c.pop() + Traceback (most recent call last): + ... + django.template.ContextPopException + +Using a ``Context`` as a stack comes in handy in some custom template tags, as +you'll see below. + +.. _subclassing-context-requestcontext: + +Subclassing Context: RequestContext +----------------------------------- + +Django comes with a special ``Context`` class, +``django.template.RequestContext``, that acts slightly differently than the +normal ``django.template.Context``. The first difference is that it takes an +:class:`~django.http.HttpRequest` as its first argument. For example:: + + c = RequestContext(request, { + 'foo': 'bar', + } + +The second difference is that it automatically populates the context with a few +variables, according to your :setting:`TEMPLATE_CONTEXT_PROCESSORS` setting`. + +The :setting:`TEMPLATE_CONTEXT_PROCESSORS` setting is a tuple of callables -- +called **context processors** -- that take a request object as their argument +and return a dictionary of items to be merged into the context. By default, +:setting:`TEMPLATE_CONTEXT_PROCESSORS` is set to:: + + ("django.core.context_processors.auth", + "django.core.context_processors.debug", + "django.core.context_processors.i18n", + "django.core.context_processors.media") + +Each processor is applied in order. That means, if one processor adds a +variable to the context and a second processor adds a variable with the same +name, the second will override the first. The default processors are explained +below. + +Also, you can give ``RequestContext`` a list of additional processors, using the +optional, third positional argument, ``processors``. In this example, the +``RequestContext`` instance gets a ``ip_address`` variable:: + + def ip_address_processor(request): + return {'ip_address': request.META['REMOTE_ADDR']} + + def some_view(request): + # ... + c = RequestContext(request, { + 'foo': 'bar', + }, [ip_address_processor]) + return t.render(c) + +.. note:: + If you're using Django's ``render_to_response()`` shortcut to populate a + template with the contents of a dictionary, your template will be passed a + ``Context`` instance by default (not a ``RequestContext``). To use a + ``RequestContext`` in your template rendering, pass an optional third + argument to ``render_to_response()``: a ``RequestContext`` + instance. Your code might look like this:: + + def some_view(request): + # ... + return render_to_response('my_template.html', + my_data_dictionary, + context_instance=RequestContext(request)) + +Here's what each of the default processors does: + +django.core.context_processors.auth +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +If :setting:`TEMPLATE_CONTEXT_PROCESSORS` contains this processor, every +``RequestContext`` will contain these three variables: + + * ``user`` -- An ``auth.User`` instance representing the currently + logged-in user (or an ``AnonymousUser`` instance, if the client isn't + logged in). + + * ``messages`` -- A list of messages (as strings) for the currently + logged-in user. Behind the scenes, this calls + ``request.user.get_and_delete_messages()`` for every request. That method + collects the user's messages and deletes them from the database. + + Note that messages are set with ``user.message_set.create``. + + * ``perms`` -- An instance of + ``django.core.context_processors.PermWrapper``, representing the + permissions that the currently logged-in user has. + +django.core.context_processors.debug +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +If :setting:`TEMPLATE_CONTEXT_PROCESSORS` contains this processor, every +``RequestContext`` will contain these two variables -- but only if your +:setting:`DEBUG` setting is set to ``True`` and the request's IP address +(``request.META['REMOTE_ADDR']``) is in the :setting:`INTERNAL_IPS` setting: + + * ``debug`` -- ``True``. You can use this in templates to test whether + you're in :setting:`DEBUG` mode. + * ``sql_queries`` -- A list of ``{'sql': ..., 'time': ...}`` dictionaries, + representing every SQL query that has happened so far during the request + and how long it took. The list is in order by query. + +django.core.context_processors.i18n +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +If :setting:`TEMPLATE_CONTEXT_PROCESSORS` contains this processor, every +``RequestContext`` will contain these two variables: + + * ``LANGUAGES`` -- The value of the :setting:`LANGUAGES` setting. + * ``LANGUAGE_CODE`` -- ``request.LANGUAGE_CODE``, if it exists. Otherwise, + the value of the :setting:`LANGUAGE_CODE` setting`. + +See :ref:`topics-i18n` for more. + +django.core.context_processors.media +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**New in Django development version** + +If :setting:`TEMPLATE_CONTEXT_PROCESSORS` contains this processor, every +``RequestContext`` will contain a variable ``MEDIA_URL``, providing the +value of the :setting:`MEDIA_URL` setting. + +django.core.context_processors.request +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +If :setting:`TEMPLATE_CONTEXT_PROCESSORS` contains this processor, every +``RequestContext`` will contain a variable ``request``, which is the current +:class:`~django.http.HttpRequest`. Note that this processor is not enabled by default; +you'll have to activate it. + +Writing your own context processors +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +A context processor has a very simple interface: It's just a Python function +that takes one argument, an ``HttpRequest`` object, and returns a dictionary +that gets added to the template context. Each context processor *must* return +a dictionary. + +Custom context processors can live anywhere in your code base. All Django cares +about is that your custom context processors are pointed-to by your +:setting:`TEMPLATE_CONTEXT_PROCESSORS` setting. + +Loading templates +----------------- + +Generally, you'll store templates in files on your filesystem rather than using +the low-level ``Template`` API yourself. Save templates in a directory +specified as a **template directory**. + +Django searches for template directories in a number of places, depending on +your template-loader settings (see "Loader types" below), but the most basic +way of specifying template directories is by using the :setting:`TEMPLATE_DIRS` +setting. + +The TEMPLATE_DIRS setting +~~~~~~~~~~~~~~~~~~~~~~~~~ + +Tell Django what your template directories are by using the +:setting:`TEMPLATE_DIRS` setting in your settings file. This should be set to a +list or tuple of strings that contain full paths to your template +directory(ies). Example:: + + TEMPLATE_DIRS = ( + "/home/html/templates/lawrence.com", + "/home/html/templates/default", + ) + +Your templates can go anywhere you want, as long as the directories and +templates are readable by the Web server. They can have any extension you want, +such as ``.html`` or ``.txt``, or they can have no extension at all. + +Note that these paths should use Unix-style forward slashes, even on Windows. + +.. _ref-templates-api-the-python-api: + +The Python API +~~~~~~~~~~~~~~ + +Django has two ways to load templates from files: + +``django.template.loader.get_template(template_name)`` + ``get_template`` returns the compiled template (a ``Template`` object) for + the template with the given name. If the template doesn't exist, it raises + ``django.template.TemplateDoesNotExist``. + +``django.template.loader.select_template(template_name_list)`` + ``select_template`` is just like ``get_template``, except it takes a list + of template names. Of the list, it returns the first template that exists. + +For example, if you call ``get_template('story_detail.html')`` and have the +above :setting:`TEMPLATE_DIRS` setting, here are the files Django will look for, +in order: + + * ``/home/html/templates/lawrence.com/story_detail.html`` + * ``/home/html/templates/default/story_detail.html`` + +If you call ``select_template(['story_253_detail.html', 'story_detail.html'])``, +here's what Django will look for: + + * ``/home/html/templates/lawrence.com/story_253_detail.html`` + * ``/home/html/templates/default/story_253_detail.html`` + * ``/home/html/templates/lawrence.com/story_detail.html`` + * ``/home/html/templates/default/story_detail.html`` + +When Django finds a template that exists, it stops looking. + +.. admonition:: Tip + + You can use ``select_template()`` for super-flexible "templatability." For + example, if you've written a news story and want some stories to have + custom templates, use something like + ``select_template(['story_%s_detail.html' % story.id, 'story_detail.html'])``. + That'll allow you to use a custom template for an individual story, with a + fallback template for stories that don't have custom templates. + +Using subdirectories +~~~~~~~~~~~~~~~~~~~~ + +It's possible -- and preferable -- to organize templates in subdirectories of +the template directory. The convention is to make a subdirectory for each +Django app, with subdirectories within those subdirectories as needed. + +Do this for your own sanity. Storing all templates in the root level of a +single directory gets messy. + +To load a template that's within a subdirectory, just use a slash, like so:: + + get_template('news/story_detail.html') + +Using the same :setting:`TEMPLATE_DIRS` setting from above, this example +``get_template()`` call will attempt to load the following templates: + + * ``/home/html/templates/lawrence.com/news/story_detail.html`` + * ``/home/html/templates/default/news/story_detail.html`` + +.. _template-loaders: + +Loader types +~~~~~~~~~~~~ + +By default, Django uses a filesystem-based template loader, but Django comes +with a few other template loaders, which know how to load templates from other +sources. + +These other loaders are disabled by default, but you can activate them by +editing your :setting:`TEMPLATE_LOADERS` setting. :setting:`TEMPLATE_LOADERS` +should be a tuple of strings, where each string represents a template loader. +Here are the template loaders that come with Django: + +``django.template.loaders.filesystem.load_template_source`` + Loads templates from the filesystem, according to :setting:`TEMPLATE_DIRS`. + +``django.template.loaders.app_directories.load_template_source`` + Loads templates from Django apps on the filesystem. For each app in + :setting:`INSTALLED_APPS`, the loader looks for a ``templates`` subdirectory. If + the directory exists, Django looks for templates in there. + + This means you can store templates with your individual apps. This also + makes it easy to distribute Django apps with default templates. + + For example, for this setting:: + + INSTALLED_APPS = ('myproject.polls', 'myproject.music') + + ...then ``get_template('foo.html')`` will look for templates in these + directories, in this order: + + * ``/path/to/myproject/polls/templates/foo.html`` + * ``/path/to/myproject/music/templates/foo.html`` + + Note that the loader performs an optimization when it is first imported: + It caches a list of which :setting:`INSTALLED_APPS` packages have a ``templates`` + subdirectory. + +``django.template.loaders.eggs.load_template_source`` + Just like ``app_directories`` above, but it loads templates from Python + eggs rather than from the filesystem. + +Django uses the template loaders in order according to the :setting:`TEMPLATE_LOADERS` +setting. It uses each loader until a loader finds a match. + +The ``render_to_string()`` shortcut +=================================== + +To cut down on the repetitive nature of loading and rendering +templates, Django provides a shortcut function which largely +automates the process: ``render_to_string()`` in +``django.template.loader``, which loads a template, renders it and +returns the resulting string:: + + from django.template.loader import render_to_string + rendered = render_to_string('my_template.html', { 'foo': 'bar' }) + +The ``render_to_string`` shortcut takes one required argument -- +``template_name``, which should be the name of the template to load +and render -- and two optional arguments:: + + dictionary + A dictionary to be used as variables and values for the + template's context. This can also be passed as the second + positional argument. + + context_instance + An instance of ``Context`` or a subclass (e.g., an instance of + ``RequestContext``) to use as the template's context. This can + also be passed as the third positional argument. + +See also the :func:`~django.shortcuts.render_to_response()` shortcut, which +calls ``render_to_string`` and feeds the result into an ``HttpResponse`` +suitable for returning directly from a view. + +Configuring the template system in standalone mode +================================================== + +.. note:: + + This section is only of interest to people trying to use the template + system as an output component in another application. If you're using the + template system as part of a Django application, nothing here applies to + you. + +Normally, Django will load all the configuration information it needs from its +own default configuration file, combined with the settings in the module given +in the :setting:`DJANGO_SETTINGS_MODULE` environment variable. But if you're +using the template system independently of the rest of Django, the environment +variable approach isn't very convenient, because you probably want to configure +the template system in line with the rest of your application rather than +dealing with settings files and pointing to them via environment variables. + +To solve this problem, you need to use the manual configuration option described +in :ref:`settings-without-django-settings-module`. Simply import the appropriate +pieces of the templating system and then, *before* you call any of the +templating functions, call ``django.conf.settings.configure()`` with any +settings you wish to specify. You might want to consider setting at least +:setting:`TEMPLATE_DIRS` (if you're going to use template loaders), +:setting:`DEFAULT_CHARSET` (although the default of ``utf-8`` is probably fine) +and :setting:`TEMPLATE_DEBUG`. All available settings are described in the +:ref:`settings documentation <ref-settings>`, and any setting starting with +``TEMPLATE_`` is of obvious interest. diff --git a/docs/templates.txt b/docs/ref/templates/builtins.txt similarity index 63% rename from docs/templates.txt rename to docs/ref/templates/builtins.txt index 99dbcb84b4..feca435ffe 100644 --- a/docs/templates.txt +++ b/docs/ref/templates/builtins.txt @@ -1,567 +1,21 @@ -================================================== -The Django template language: For template authors -================================================== +.. _ref-templates-builtins: -.. admonition:: About this document +================================== +Built-in template tags and filters +================================== - This document explains the language syntax of the Django template system. If - you're looking for a more technical perspective on how it works and how to - extend it, see `The Django template language: For Python programmers`_. +This document describes Django's built-in template tags and filters. It is +recommended that you use the :ref:`automatic documentation +<template-built-in-reference>`, if available, as this will also include +documentation for any custom tags or filters installed. -Django's template language is designed to strike a balance between power and -ease. It's designed to feel comfortable to those used to working with HTML. If -you have any exposure to other text-based template languages, such as Smarty_ -or CheetahTemplate_, you should feel right at home with Django's templates. - -.. admonition:: Philosophy - - If you have a background in programming, or if you're used to languages - like PHP which mix programming code directly into HTML, you'll want to - bear in mind that the Django template system is not simply Python embedded - into HTML. This is by design: the template system is meant to express - presentation, not program logic. - - The Django template system provides tags which function similarly to some - programming constructs -- an ``{% if %}`` tag for boolean tests, a ``{% - for %}`` tag for looping, etc. -- but these are not simply executed as the - corresponding Python code, and the template system will not execute - arbitrary Python expressions. Only the tags, filters and syntax listed - below are supported by default (although you can add `your own - extensions`_ to the template language as needed). - -.. _`The Django template language: For Python programmers`: ../templates_python/ -.. _Smarty: http://smarty.php.net/ -.. _CheetahTemplate: http://www.cheetahtemplate.org/ -.. _your own extensions: ../templates_python/#extending-the-template-system - -Templates -========= - -A template is simply a text file. It can generate any text-based format (HTML, -XML, CSV, etc.). - -A template contains **variables**, which get replaced with values when the -template is evaluated, and **tags**, which control the logic of the template. - -Below is a minimal template that illustrates a few basics. Each element will be -explained later in this document.:: - - {% extends "base_generic.html" %} - - {% block title %}{{ section.title }}{% endblock %} - - {% block content %} - <h1>{{ section.title }}</h1> - - {% for story in story_list %} - <h2> - <a href="{{ story.get_absolute_url }}"> - {{ story.headline|upper }} - </a> - </h2> - <p>{{ story.tease|truncatewords:"100" }}</p> - {% endfor %} - {% endblock %} - -.. admonition:: Philosophy - - Why use a text-based template instead of an XML-based one (like Zope's - TAL)? We wanted Django's template language to be usable for more than - just XML/HTML templates. At World Online, we use it for e-mails, - JavaScript and CSV. You can use the template language for any text-based - format. - - Oh, and one more thing: Making humans edit XML is sadistic! - -Variables -========= - -Variables look like this: ``{{ variable }}``. When the template engine -encounters a variable, it evaluates that variable and replaces it with the -result. - -Use a dot (``.``) to access attributes of a variable. - -.. admonition:: Behind the scenes - - Technically, when the template system encounters a dot, it tries the - following lookups, in this order: - - * Dictionary lookup - * Attribute lookup - * Method call - * List-index lookup - -In the above example, ``{{ section.title }}`` will be replaced with the -``title`` attribute of the ``section`` object. - -If you use a variable that doesn't exist, the template system will insert -the value of the ``TEMPLATE_STRING_IF_INVALID`` setting, which is set to ``''`` -(the empty string) by default. - -See `Using the built-in reference`_, below, for help on finding what variables -are available in a given template. - -Filters -======= - -You can modify variables for display by using **filters**. - -Filters look like this: ``{{ name|lower }}``. This displays the value of the -``{{ name }}`` variable after being filtered through the ``lower`` filter, -which converts text to lowercase. Use a pipe (``|``) to apply a filter. - -Filters can be "chained." The output of one filter is applied to the next. -``{{ text|escape|linebreaks }}`` is a common idiom for escaping text contents, -then converting line breaks to ``<p>`` tags. - -Some filters take arguments. A filter argument looks like this: ``{{ -bio|truncatewords:30 }}``. This will display the first 30 words of the ``bio`` -variable. - -Filter arguments that contain spaces must be quoted; for example, to join a list -with commas and spaced you'd use ``{{ list|join:", " }}``. - -The `Built-in filter reference`_ below describes all the built-in filters. - -Tags -==== - -Tags look like this: ``{% tag %}``. Tags are more complex than variables: Some -create text in the output, some control flow by performing loops or logic, and -some load external information into the template to be used by later variables. - -Some tags require beginning and ending tags (i.e. -``{% tag %} ... tag contents ... {% endtag %}``). The `Built-in tag reference`_ -below describes all the built-in tags. You can create your own tags, if you -know how to write Python code. - -Comments -======== - -To comment-out part of a line in a template, use the comment syntax: ``{# #}``. - -For example, this template would render as ``'hello'``:: - - {# greeting #}hello - -A comment can contain any template code, invalid or not. For example:: - - {# {% if foo %}bar{% else %} #} - -This syntax can only be used for single-line comments (no newlines are -permitted between the ``{#`` and ``#}`` delimiters). If you need to comment -out a multiline portion of the template, see the ``comment`` tag, below__. - -__ comment_ - -Template inheritance -==================== - -The most powerful -- and thus the most complex -- part of Django's template -engine is template inheritance. Template inheritance allows you to build a base -"skeleton" template that contains all the common elements of your site and -defines **blocks** that child templates can override. - -It's easiest to understand template inheritance by starting with an example:: - - <!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" xml:lang="en" lang="en"> - <head> - <link rel="stylesheet" href="style.css" /> - <title>{% block title %}My amazing site{% endblock %}</title> - </head> - - <body> - <div id="sidebar"> - {% block sidebar %} - <ul> - <li><a href="/">Home</a></li> - <li><a href="/blog/">Blog</a></li> - </ul> - {% endblock %} - </div> - - <div id="content"> - {% block content %}{% endblock %} - </div> - </body> - </html> - -This template, which we'll call ``base.html``, defines a simple HTML skeleton -document that you might use for a simple two-column page. It's the job of -"child" templates to fill the empty blocks with content. - -In this example, the ``{% block %}`` tag defines three blocks that child -templates can fill in. All the ``block`` tag does is to tell the template -engine that a child template may override those portions of the template. - -A child template might look like this:: - - {% extends "base.html" %} - - {% block title %}My amazing blog{% endblock %} - - {% block content %} - {% for entry in blog_entries %} - <h2>{{ entry.title }}</h2> - <p>{{ entry.body }}</p> - {% endfor %} - {% endblock %} - -The ``{% extends %}`` tag is the key here. It tells the template engine that -this template "extends" another template. When the template system evaluates -this template, first it locates the parent -- in this case, "base.html". - -At that point, the template engine will notice the three ``{% block %}`` tags -in ``base.html`` and replace those blocks with the contents of the child -template. Depending on the value of ``blog_entries``, the output might look -like:: - - <!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" xml:lang="en" lang="en"> - <head> - <link rel="stylesheet" href="style.css" /> - <title>My amazing blog</title> - </head> - - <body> - <div id="sidebar"> - <ul> - <li><a href="/">Home</a></li> - <li><a href="/blog/">Blog</a></li> - </ul> - </div> - - <div id="content"> - <h2>Entry one</h2> - <p>This is my first entry.</p> - - <h2>Entry two</h2> - <p>This is my second entry.</p> - </div> - </body> - </html> - -Note that since the child template didn't define the ``sidebar`` block, the -value from the parent template is used instead. Content within a ``{% block %}`` -tag in a parent template is always used as a fallback. - -You can use as many levels of inheritance as needed. One common way of using -inheritance is the following three-level approach: - - * Create a ``base.html`` template that holds the main look-and-feel of your - site. - * Create a ``base_SECTIONNAME.html`` template for each "section" of your - site. For example, ``base_news.html``, ``base_sports.html``. These - templates all extend ``base.html`` and include section-specific - styles/design. - * Create individual templates for each type of page, such as a news - article or blog entry. These templates extend the appropriate section - template. - -This approach maximizes code reuse and makes it easy to add items to shared -content areas, such as section-wide navigation. - -Here are some tips for working with inheritance: - - * If you use ``{% extends %}`` in a template, it must be the first template - tag in that template. Template inheritance won't work, otherwise. - - * More ``{% block %}`` tags in your base templates are better. Remember, - child templates don't have to define all parent blocks, so you can fill - in reasonable defaults in a number of blocks, then only define the ones - you need later. It's better to have more hooks than fewer hooks. - - * If you find yourself duplicating content in a number of templates, it - probably means you should move that content to a ``{% block %}`` in a - parent template. - - * If you need to get the content of the block from the parent template, - the ``{{ block.super }}`` variable will do the trick. This is useful - if you want to add to the contents of a parent block instead of - completely overriding it. Data inserted using ``{{ block.super }}`` will - not be automatically escaped (see the `next section`_), since it was - already escaped, if necessary, in the parent template. - - * For extra readability, you can optionally give a *name* to your - ``{% endblock %}`` tag. For example:: - - {% block content %} - ... - {% endblock content %} - - In larger templates, this technique helps you see which ``{% block %}`` - tags are being closed. - -Finally, note that you can't define multiple ``{% block %}`` tags with the same -name in the same template. This limitation exists because a block tag works in -"both" directions. That is, a block tag doesn't just provide a hole to fill -- -it also defines the content that fills the hole in the *parent*. If there were -two similarly-named ``{% block %}`` tags in a template, that template's parent -wouldn't know which one of the blocks' content to use. - -.. _next section: #automatic-html-escaping - -Automatic HTML escaping -======================= - -**New in Django development version** - -When generating HTML from templates, there's always a risk that a variable will -include characters that affect the resulting HTML. For example, consider this -template fragment:: - - Hello, {{ name }}. - -At first, this seems like a harmless way to display a user's name, but consider -what would happen if the user entered his name as this:: - - <script>alert('hello')</script> - -With this name value, the template would be rendered as:: - - Hello, <script>alert('hello')</script> - -...which means the browser would pop-up a JavaScript alert box! - -Similarly, what if the name contained a ``'<'`` symbol, like this? - - <b>username - -That would result in a rendered template like this:: - - Hello, <b>username - -...which, in turn, would result in the remainder of the Web page being bolded! - -Clearly, user-submitted data shouldn't be trusted blindly and inserted directly -into your Web pages, because a malicious user could use this kind of hole to -do potentially bad things. This type of security exploit is called a -`Cross Site Scripting`_ (XSS) attack. - -To avoid this problem, you have two options: - - * One, you can make sure to run each untrusted variable through the - ``escape`` filter (documented below), which converts potentially harmful - HTML characters to unharmful ones. This was the default solution - in Django for its first few years, but the problem is that it puts the - onus on *you*, the developer / template author, to ensure you're escaping - everything. It's easy to forget to escape data. - - * Two, you can take advantage of Django's automatic HTML escaping. The - remainder of this section describes how auto-escaping works. - -By default in the Django development version, every template automatically -escapes the output of every variable tag. Specifically, these five characters -are escaped: - - * ``<`` is converted to ``<`` - * ``>`` is converted to ``>`` - * ``'`` (single quote) is converted to ``'`` - * ``"`` (double quote) is converted to ``"`` - * ``&`` is converted to ``&`` - -Again, we stress that this behavior is on by default. If you're using Django's -template system, you're protected. - -.. _Cross Site Scripting: http://en.wikipedia.org/wiki/Cross-site_scripting - -How to turn it off ------------------- - -If you don't want data to be auto-escaped, on a per-site, per-template level or -per-variable level, you can turn it off in several ways. - -Why would you want to turn it off? Because sometimes, template variables -contain data that you *intend* to be rendered as raw HTML, in which case you -don't want their contents to be escaped. For example, you might store a blob of -HTML in your database and want to embed that directly into your template. Or, -you might be using Django's template system to produce text that is *not* HTML --- like an e-mail message, for instance. - -For individual variables -~~~~~~~~~~~~~~~~~~~~~~~~ - -To disable auto-escaping for an individual variable, use the ``safe`` filter:: - - This will be escaped: {{ data }} - This will not be escaped: {{ data|safe }} - -Think of *safe* as shorthand for *safe from further escaping* or *can be -safely interpreted as HTML*. In this example, if ``data`` contains ``'<b>'``, -the output will be:: - - This will be escaped: <b> - This will not be escaped: <b> - -For template blocks -~~~~~~~~~~~~~~~~~~~ - -To control auto-escaping for a template, wrap the template (or just a -particular section of the template) in the ``autoescape`` tag, like so:: - - {% autoescape off %} - Hello {{ name }} - {% endautoescape %} - -The ``autoescape`` tag takes either ``on`` or ``off`` as its argument. At -times, you might want to force auto-escaping when it would otherwise be -disabled. Here is an example template:: - - Auto-escaping is on by default. Hello {{ name }} - - {% autoescape off %} - This will not be auto-escaped: {{ data }}. - - Nor this: {{ other_data }} - {% autoescape on %} - Auto-escaping applies again: {{ name }} - {% endautoescape %} - {% endautoescape %} - -The auto-escaping tag passes its effect onto templates that extend the -current one as well as templates included via the ``include`` tag, just like -all block tags. For example:: - - # base.html - - {% autoescape off %} - <h1>{% block title %}{% endblock %}</h1> - {% block content %} - {% endblock %} - {% endautoescape %} - - - # child.html - - {% extends "base.html" %} - {% block title %}This & that{% endblock %} - {% block content %}{{ greeting }}{% endblock %} - -Because auto-escaping is turned off in the base template, it will also be -turned off in the child template, resulting in the following rendered -HTML when the ``greeting`` variable contains the string ``<b>Hello!</b>``:: - - <h1>This & that</h1> - <b>Hello!</b> - -Notes ------ - -Generally, template authors don't need to worry about auto-escaping very much. -Developers on the Python side (people writing views and custom filters) need to -think about the cases in which data shouldn't be escaped, and mark data -appropriately, so things Just Work in the template. - -If you're creating a template that might be used in situations where you're -not sure whether auto-escaping is enabled, then add an ``escape`` filter to any -variable that needs escaping. When auto-escaping is on, there's no danger of -the ``escape`` filter *double-escaping* data -- the ``escape`` filter does not -affect auto-escaped variables. - -String literals and automatic escaping --------------------------------------- - -As we mentioned earlier, filter arguments can be strings:: - - {{ data|default:"This is a string literal." }} - -All string literals are inserted **without** any automatic escaping into the -template -- they act as if they were all passed through the ``safe`` filter. -The reasoning behind this is that the template author is in control of what -goes into the string literal, so they can make sure the text is correctly -escaped when the template is written. - -This means you would write :: - - {{ data|default:"3 < 2" }} - -...rather than :: - - {{ data|default:"3 < 2" }} <-- Bad! Don't do this. - -This doesn't affect what happens to data coming from the variable itself. -The variable's contents are still automatically escaped, if necessary, because -they're beyond the control of the template author. - -Using the built-in reference -============================ - -Django's admin interface includes a complete reference of all template tags and -filters available for a given site. To see it, go to your admin interface and -click the "Documentation" link in the upper right of the page. - -The reference is divided into 4 sections: tags, filters, models, and views. - -The **tags** and **filters** sections describe all the built-in tags (in fact, -the tag and filter references below come directly from those pages) as well as -any custom tag or filter libraries available. - -The **views** page is the most valuable. Each URL in your site has a separate -entry here, and clicking on a URL will show you: - - * The name of the view function that generates that view. - * A short description of what the view does. - * The **context**, or a list of variables available in the view's template. - * The name of the template or templates that are used for that view. - -Each view documentation page also has a bookmarklet that you can use to jump -from any page to the documentation page for that view. - -Because Django-powered sites usually use database objects, the **models** -section of the documentation page describes each type of object in the system -along with all the fields available on that object. - -Taken together, the documentation pages should tell you every tag, filter, -variable and object available to you in a given template. - -Custom tag and filter libraries -=============================== - -Certain applications provide custom tag and filter libraries. To access them in -a template, use the ``{% load %}`` tag:: - - {% load comments %} - - {% comment_form for blogs.entries entry.id with is_public yes %} - -In the above, the ``load`` tag loads the ``comments`` tag library, which then -makes the ``comment_form`` tag available for use. Consult the documentation -area in your admin to find the list of custom libraries in your installation. - -The ``{% load %}`` tag can take multiple library names, separated by spaces. -Example:: - - {% load comments i18n %} - -Custom libraries and template inheritance ------------------------------------------ - -When you load a custom tag or filter library, the tags/filters are only made -available to the current template -- not any parent or child templates along -the template-inheritance path. - -For example, if a template ``foo.html`` has ``{% load comments %}``, a child -template (e.g., one that has ``{% extends "foo.html" %}``) will *not* have -access to the comments template tags and filters. The child template is -responsible for its own ``{% load comments %}``. - -This is a feature for the sake of maintainability and sanity. - -Built-in tag and filter reference -================================= - -For those without an admin site available, reference for the stock tags and -filters follows. Because Django is highly customizable, the reference in your -admin should be considered the final word on what tags and filters are -available, and what they do. +.. _ref-templates-builtins-tags: Built-in tag reference ---------------------- +.. templatetag:: autoescape + autoescape ~~~~~~~~~~ @@ -580,17 +34,23 @@ The only exceptions are variables that are already marked as "safe" from escaping, either by the code that populated the variable, or because it has had the ``safe`` or ``escape`` filters applied. +.. templatetag:: block + block ~~~~~ Define a block that can be overridden by child templates. See -`Template inheritance`_ for more information. +:ref:`Template inheritance <template-inheritance>` for more information. + +.. templatetag:: comment comment ~~~~~~~ Ignore everything between ``{% comment %}`` and ``{% endcomment %}`` +.. templatetag:: cycle + cycle ~~~~~ @@ -625,12 +85,16 @@ In this syntax, each value will be interpreted as literal text. The comma-based syntax exists for backwards-compatibility, and should not be used for new projects. +.. templatetag:: debug + debug ~~~~~ Output a whole load of debugging information, including the current context and imported modules. +.. templatetag:: extends + extends ~~~~~~~ @@ -646,7 +110,9 @@ This tag can be used in two ways: parent template. If the variable evaluates to a ``Template`` object, Django will use that object as the parent template. -See `Template inheritance`_ for more information. +See :ref:`template-inheritance` for more information. + +.. templatetag:: filter filter ~~~~~~ @@ -662,6 +128,8 @@ Sample usage:: This text will be HTML-escaped, and will appear in all lowercase. {% endfilter %} +.. templatetag:: firstof + firstof ~~~~~~~ @@ -687,6 +155,8 @@ passed variables are False:: {% firstof var1 var2 var3 "fallback value" %} +.. templatetag:: for + for ~~~ @@ -736,6 +206,8 @@ The for loop sets a number of variables available within the loop: current one ========================== ================================================ +.. templatetag:: if + if ~~ @@ -799,6 +271,8 @@ same operator. For example, this is valid:: {% if athlete_list or coach_list or parent_list or teacher_list %} +.. templatetag:: ifchanged + ifchanged ~~~~~~~~~ @@ -819,7 +293,7 @@ The 'ifchanged' block tag is used within a loop. It has two possible uses. 2. If given a variable, check whether that variable has changed. For example, the following shows the date every time it changes, but - only shows the hour if both the hour and the date have changed:: + only shows the hour if both the hour and the date has changed:: {% for date in days %} {% ifchanged date.date %} {{ date.date }} {% endifchanged %} @@ -828,18 +302,7 @@ The 'ifchanged' block tag is used within a loop. It has two possible uses. {% endifchanged %} {% endfor %} -The ``ifchanged`` tag also takes an optional ``{% else %}`` clause that will -be displayed if the value has not changed:: - - {% for match in matches %} - <div style="background-color: - {% ifchanged match.ballot_id %} - {% cycle red,blue %} - {% else %} - grey - {% endifchanged %} - ">{{ match }}</div> - {% endfor %} +.. templatetag:: ifequal ifequal ~~~~~~~ @@ -865,11 +328,15 @@ You cannot check for equality with Python objects such as ``True`` or ``False``. If you need to test if something is true or false, use the ``if`` tag instead. +.. templatetag:: ifnotequal + ifnotequal ~~~~~~~~~~ Just like ``ifequal``, except it tests that the two arguments are not equal. +.. templatetag:: include + include ~~~~~~~ @@ -902,12 +369,16 @@ including it. This example produces the output ``"Hello, John"``: See also: ``{% ssi %}``. +.. templatetag:: load + load ~~~~ Load a custom template tag set. -See `Custom tag and filter libraries`_ for more information. +See :ref:`Custom tag and filter libraries <howto-custom-template-tags>` for more information. + +.. templatetag:: now now ~~~ @@ -992,12 +463,14 @@ escaped, because it's not a format character:: This would display as "It is the 4th of September". +.. templatetag:: regroup + regroup ~~~~~~~ Regroup a list of alike objects by a common attribute. -This complex tag is best illustrated by use of an example: say that ``people`` +This complex tag is best illustrated by use of an example: say that ``people`` is a list of people represented by dictionaries with ``first_name``, ``last_name``, and ``gender`` keys:: @@ -1088,6 +561,8 @@ filter, if your data is in a list of dictionaries:: {% regroup people|dictsort:"gender" by gender as gender_list %} +.. templatetag:: spaceless + spaceless ~~~~~~~~~ @@ -1115,6 +590,8 @@ this example, the space around ``Hello`` won't be stripped:: </strong> {% endspaceless %} +.. templatetag:: ssi + ssi ~~~ @@ -1132,11 +609,11 @@ file are evaluated as template code, within the current context:: {% ssi /home/html/ljworld.com/includes/right_generic.html parsed %} Note that if you use ``{% ssi %}``, you'll need to define -`ALLOWED_INCLUDE_ROOTS`_ in your Django settings, as a security measure. +:setting:`ALLOWED_INCLUDE_ROOTS` in your Django settings, as a security measure. See also: ``{% include %}``. -.. _ALLOWED_INCLUDE_ROOTS: ../settings/#allowed-include-roots +.. templatetag:: templatetag templatetag ~~~~~~~~~~~ @@ -1161,6 +638,8 @@ The argument tells which template bit to output: ``closecomment`` ``#}`` ================== ======= +.. templatetag:: url + url ~~~ @@ -1181,7 +660,7 @@ For example, suppose you have a view, ``app_views.client``, whose URLconf takes a client ID (here, ``client()`` is a method inside the views file ``app_views.py``). The URLconf line might look like this:: - ('^client/(\d+)/$', 'project_name.app_name.app_views.client') + ('^client/(\d+)/$', 'app_views.client') If this app's URLconf is included into the project's URLconf under a path such as this:: @@ -1190,15 +669,15 @@ such as this:: ...then, in a template, you can create a link to this view like this:: - {% url project_name.app_name.app_views.client client.id %} + {% url app_views.client client.id %} The template tag will output the string ``/clients/client/123/``. -**New in development version:** If you're using `named URL patterns`_, -you can refer to the name of the pattern in the ``url`` tag instead of -using the path to the view. +**New in development version:** If you're using :ref:`named URL patterns +<naming-url-patterns>`, you can refer to the name of the pattern in the ``url`` +tag instead of using the path to the view. -.. _named URL patterns: ../url_dispatch/#naming-url-patterns +.. templatetag:: widthratio widthratio ~~~~~~~~~~ @@ -1210,10 +689,12 @@ For example:: <img src="bar.gif" height="10" width="{% widthratio this_value max_value 100 %}" /> -Above, if ``this_value`` is 175 and ``max_value`` is 200, the the image in the +Above, if ``this_value`` is 175 and ``max_value`` is 200, the image in the above example will be 88 pixels wide (because 175/200 = .875; .875 * 100 = 87.5 which is rounded up to 88). +.. templatetag:: with + with ~~~~ @@ -1231,9 +712,13 @@ For example:: The populated variable (in the example above, ``total``) is only available between the ``{% with %}`` and ``{% endwith %}`` tags. +.. _ref-templates-builtins-filters: + Built-in filter reference ------------------------- +.. templatefilter:: add + add ~~~ @@ -1245,6 +730,8 @@ For example:: If ``value`` is ``4``, then the output will be ``6``. +.. templatefilter:: addslashes + addslashes ~~~~~~~~~~ @@ -1253,16 +740,22 @@ Adds slashes before quotes. Useful for escaping strings in CSV, for example. **New in Django development version**: For escaping data in JavaScript strings, use the `escapejs`_ filter instead. +.. templatefilter:: capfirst + capfirst ~~~~~~~~ Capitalizes the first character of the value. +.. templatefilter:: center + center ~~~~~~ Centers the value in a field of a given width. +.. templatefilter:: cut + cut ~~~ @@ -1274,6 +767,8 @@ For example:: If ``value`` is ``"String with spaces"``, the output will be ``"Stringwithspaces"``. +.. templatefilter:: date + date ~~~~ @@ -1287,6 +782,8 @@ If ``value`` is a ``datetime`` object (e.g., the result of ``datetime.datetime.now()``), the output will be the string ``'Wed 09 Jan 2008'``. +.. templatefilter:: default + default ~~~~~~~ @@ -1298,6 +795,8 @@ For example:: If ``value`` is ``""`` (the empty string), the output will be ``nothing``. +.. templatefilter:: default_if_none + default_if_none ~~~~~~~~~~~~~~~ @@ -1313,6 +812,8 @@ For example:: If ``value`` is ``None``, the output will be the string ``"nothing"``. +.. templatefilter:: dictsort + dictsort ~~~~~~~~ @@ -1339,6 +840,8 @@ then the output would be:: {'name': 'zed', 'age': 19}, ] +.. templatefilter:: dictsortreversed + dictsortreversed ~~~~~~~~~~~~~~~~ @@ -1346,6 +849,8 @@ Takes a list of dictionaries and returns that list sorted in reverse order by the key given in the argument. This works exactly the same as the above filter, but the returned value will be in reverse order. +.. templatefilter:: divisibleby + divisibleby ~~~~~~~~~~~ @@ -1357,6 +862,8 @@ For example:: If ``value`` is ``21``, the output would be ``True``. +.. templatefilter:: escape + escape ~~~~~~ @@ -1382,6 +889,8 @@ multiple escaping passes to be applied, use the ``force_escape`` filter. this filter has changed slightly. The replacements are only made once, after all other filters are applied -- including filters before and after it. +.. templatefilter:: escapejs + escapejs ~~~~~~~~ @@ -1391,6 +900,8 @@ Escapes characters for use in JavaScript strings. This does *not* make the string safe for use in HTML, but does protect you from syntax errors when using templates to generate JavaScript/JSON. +.. templatefilter:: filesizeformat + filesizeformat ~~~~~~~~~~~~~~ @@ -1403,6 +914,8 @@ For example:: If ``value`` is 123456789, the output would be ``117.7 MB``. +.. templatefilter:: first + first ~~~~~ @@ -1414,6 +927,8 @@ For example:: If ``value`` is the list ``['a', 'b', 'c']``, the output will be ``'a'``. +.. templatefilter:: fix_ampersands + fix_ampersands ~~~~~~~~~~~~~~ @@ -1429,6 +944,8 @@ If ``value`` is ``Tom & Jerry``, the output will be ``Tom & Jerry``. useful, because ampersands are automatically escaped in templates. See escape_ for more on how auto-escaping works. +.. templatefilter:: floatformat + floatformat ~~~~~~~~~~~ @@ -1469,6 +986,8 @@ displayed. For example: Using ``floatformat`` with no argument is equivalent to using ``floatformat`` with an argument of ``-1``. +.. templatefilter:: force_escape + force_escape ~~~~~~~~~~~~ @@ -1480,6 +999,8 @@ is useful in the rare cases where you need multiple escaping or want to apply other filters to the escaped results. Normally, you want to use the ``escape`` filter. +.. templatefilter:: get_digit + get_digit ~~~~~~~~~ @@ -1494,6 +1015,8 @@ For example:: If ``value`` is ``123456789``, the output will be ``8``. +.. templatefilter:: iriendcode + iriencode ~~~~~~~~~ @@ -1504,6 +1027,8 @@ strings containing non-ASCII characters in a URL. It's safe to use this filter on a string that has already gone through the ``urlencode`` filter. +.. templatefilter:: join + join ~~~~ @@ -1516,6 +1041,8 @@ For example:: If ``value`` is the list ``['a', 'b', 'c']``, the output will be the string ``"a // b // c"``. +.. templatefilter:: last + last ~~~~ @@ -1530,6 +1057,8 @@ For example:: If ``value`` is the list ``['a', 'b', 'c', 'd']``, the output will be the string ``"d"``. +.. templatefilter:: length + length ~~~~~~ @@ -1541,6 +1070,8 @@ For example:: If ``value`` is ``['a', 'b', 'c', 'd']``, the output will be ``4``. +.. templatefilter:: length_is + length_is ~~~~~~~~~ @@ -1552,6 +1083,8 @@ For example:: If ``value`` is ``['a', 'b', 'c', 'd']``, the output will be ``True``. +.. templatefilter:: linebreaks + linebreaks ~~~~~~~~~~ @@ -1566,17 +1099,23 @@ For example:: If ``value`` is ``Joel\nis a slug``, the output will be ``<p>Joel<br>is a slug</p>``. +.. templatefilter:: linebreaksbr + linebreaksbr ~~~~~~~~~~~~ Converts all newlines in a piece of plain text to HTML line breaks (``<br />``). +.. templatefilter:: linenumbers + linenumbers ~~~~~~~~~~~ Displays text with line numbers. +.. templatefilter:: ljust + ljust ~~~~~ @@ -1584,6 +1123,8 @@ Left-aligns the value in a field of a given width. **Argument:** field size +.. templatefilter:: lower + lower ~~~~~ @@ -1595,6 +1136,8 @@ For example:: If ``value`` is ``Still MAD At Yoko``, the output will be ``still mad at yoko``. +.. templatefilter:: make_list + make_list ~~~~~~~~~ @@ -1609,6 +1152,8 @@ If ``value`` is the string ``"Joel"``, the output would be the list ``[u'J', u'o', u'e', u'l']``. If ``value`` is ``123``, the output will be the list ``[1, 2, 3]``. +.. templatefilter:: phone2numeric + phone2numeric ~~~~~~~~~~~~~ @@ -1619,6 +1164,8 @@ equivalent. For example, ``'800-COLLECT'`` will be converted to The input doesn't have to be a valid phone number. This will happily convert any string. +.. templatefilter:: pluralize + pluralize ~~~~~~~~~ @@ -1641,6 +1188,8 @@ singular and plural suffix, separated by a comma. Example:: You have {{ num_cherries }} cherr{{ num_cherries|pluralize:"y,ies" }}. + +.. templatefilter:: pprint pprint ~~~~~~ @@ -1649,6 +1198,8 @@ A wrapper around `pprint.pprint`__ -- for debugging, really. __ http://www.python.org/doc/2.5/lib/module-pprint.html +.. templatefilter:: random + random ~~~~~~ @@ -1660,6 +1211,8 @@ For example:: If ``value`` is the list ``['a', 'b', 'c', 'd']``, the output could be ``"b"``. +.. templatefilter:: removetags + removetags ~~~~~~~~~~ @@ -1672,6 +1225,8 @@ For example:: If ``value`` is ``"<b>Joel</b> <button>is</button> a <span>slug</span>"`` the output will be ``"Joel <button>is</button> a slug"``. +.. templatefilter:: rjust + rjust ~~~~~ @@ -1679,12 +1234,16 @@ Right-aligns the value in a field of a given width. **Argument:** field size +.. templatefilter:: safe + safe ~~~~ Marks a string as not requiring further HTML escaping prior to output. When autoescaping is off, this filter has no effect. +.. templatefilter:: slice + slice ~~~~~ @@ -1696,6 +1255,8 @@ for an introduction. Example: ``{{ some_list|slice:":2" }}`` +.. templatefilter:: slugify + slugify ~~~~~~~ @@ -1709,11 +1270,13 @@ For example:: If ``value`` is ``"Joel is a slug"``, the output will be ``"joel-is-a-slug"``. +.. templatefilter:: stringformat + stringformat ~~~~~~~~~~~~ Formats the variable according to the argument, a string formatting specifier. -This specifier uses Python string formating syntax, with the exception that +This specifier uses Python string formatting syntax, with the exception that the leading "%" is dropped. See http://docs.python.org/lib/typesseq-strings.html for documentation of @@ -1725,6 +1288,8 @@ For example:: If ``value`` is ``"Joel is a slug"``, the output will be ``"Joel is a slug"``. +.. templatefilter:: striptags + striptags ~~~~~~~~~ @@ -1737,6 +1302,8 @@ For example:: If ``value`` is ``"<b>Joel</b> <button>is</button> a <span>slug</span>"``, the output will be ``"Joel is a slug"``. +.. templatefilter:: time + time ~~~~ @@ -1752,6 +1319,8 @@ For example:: If ``value`` is equivalent to ``datetime.datetime.now()``, the output will be the string ``"01:23"``. +.. templatefilter:: timesince + timesince ~~~~~~~~~ @@ -1766,6 +1335,8 @@ then ``{{ comment_date|timesince:blog_date }}`` would return "8 hours". Minutes is the smallest unit used, and "0 minutes" will be returned for any date that is in the future relative to the comparison point. +.. templatefilter:: timeuntil + timeuntil ~~~~~~~~~ @@ -1781,11 +1352,15 @@ the comparison point (instead of *now*). If ``from_date`` contains 22 June Minutes is the smallest unit used, and "0 minutes" will be returned for any date that is in the past relative to the comparison point. +.. templatefilter:: title + title ~~~~~ Converts a string into titlecase. +.. templatefilter:: truncatewords + truncatewords ~~~~~~~~~~~~~ @@ -1799,6 +1374,8 @@ For example:: If ``value`` is ``"Joel is a slug"``, the output will be ``"Joel is ..."``. +.. templatefilter:: truncatewords_html + truncatewords_html ~~~~~~~~~~~~~~~~~~ @@ -1809,6 +1386,8 @@ closed immediately after the truncation. This is less efficient than ``truncatewords``, so should only be used when it is being passed HTML text. +.. templatefilter:: unordered_list + unordered_list ~~~~~~~~~~~~~~ @@ -1837,6 +1416,8 @@ The list is assumed to be in the proper format. For example, if ``var`` contains Note: the previous more restrictive and verbose format is still supported: ``['States', [['Kansas', [['Lawrence', []], ['Topeka', []]]], ['Illinois', []]]]``, +.. templatefilter:: upper + upper ~~~~~ @@ -1848,11 +1429,15 @@ For example:: If ``value`` is ``"Joel is a slug"``, the output will be ``"JOEL IS A SLUG"``. +.. templatefilter:: urlencode + urlencode ~~~~~~~~~ Escapes a value for use in a URL. +.. templatefilter:: urlize + urlize ~~~~~~ @@ -1869,6 +1454,8 @@ If ``value`` is ``"Check out www.djangoproject.com"``, the output will be ``"Check out <a href="http://www.djangoproject.com">www.djangoproject.com</a>"``. +.. templatefilter:: urlizetrunc + urlizetrunc ~~~~~~~~~~~ @@ -1887,11 +1474,15 @@ If ``value`` is ``"Check out www.djangoproject.com"``, the output would be ``'Check out <a href="http://www.djangoproject.com">www.djangopr...</a>'``. +.. templatefilter:: wordcount + wordcount ~~~~~~~~~ Returns the number of words. +.. templatefilter:: wordwrap + wordwrap ~~~~~~~~ @@ -1909,6 +1500,8 @@ If ``value`` is ``Joel is a slug``, the output would be:: is a slug +.. templatefilter:: yesno + yesno ~~~~~ @@ -1936,9 +1529,7 @@ django.contrib.humanize ----------------------- A set of Django template filters useful for adding a "human touch" to data. See -the `humanize documentation`_. - -.. _humanize documentation: ../add_ons/#humanize +:ref:`ref-contrib-humanize`. django.contrib.markup --------------------- @@ -1949,16 +1540,10 @@ A collection of template filters that implement these common markup languages: * Markdown * ReST (ReStructured Text) -See the `markup section`_ of the `add-ons documentation`_ for more -information. - -.. _markup section: ../add_ons/#markup -.. _add-ons documentation: ../add_ons/ +See :ref:`ref-contrib-markup`. django.contrib.webdesign ------------------------ -A collection of template tags that can be useful while designing a Web site, -such as a generator of Lorem Ipsum text. See the `webdesign documentation`_. - -.. _webdesign documentation: ../webdesign/ +A collection of template tags that can be useful while designing a website, +such as a generator of Lorem Ipsum text. See :ref:`ref-contrib-webdesign`. diff --git a/docs/ref/templates/index.txt b/docs/ref/templates/index.txt new file mode 100644 index 0000000000..d7bf99aa8c --- /dev/null +++ b/docs/ref/templates/index.txt @@ -0,0 +1,20 @@ +.. _ref-templates-index: + +Template reference +================== + +Django's template engine provides a powerful mini-language for defining the +user-facing layer of your application, encouraging a clean separation of +application and presentation logic. Templates can be maintained by anyone with +an understanding of HTML; no knowledge of Python is required. + +.. toctree:: + :maxdepth: 2 + + builtins + api + +.. seealso:: + + For information on writing your own custom tags and filters, see + :ref:`howto-custom-template-tags`. \ No newline at end of file diff --git a/docs/unicode.txt b/docs/ref/unicode.txt similarity index 92% rename from docs/unicode.txt rename to docs/ref/unicode.txt index a2c4e7fbe6..985ab15096 100644 --- a/docs/unicode.txt +++ b/docs/ref/unicode.txt @@ -1,3 +1,5 @@ +.. _ref-unicode: + ====================== Unicode data in Django ====================== @@ -60,12 +62,12 @@ You can use Unicode strings, or you can use normal strings (sometimes called If your code only uses ASCII data, it's safe to use your normal strings, passing them around at will, because ASCII is a subset of UTF-8. -Don't be fooled into thinking that if your ``DEFAULT_CHARSET`` setting is set +Don't be fooled into thinking that if your :setting:`DEFAULT_CHARSET` setting is set to something other than ``'utf-8'`` you can use that other encoding in your -bytestrings! ``DEFAULT_CHARSET`` only applies to the strings generated as +bytestrings! :setting:`DEFAULT_CHARSET` only applies to the strings generated as the result of template rendering (and e-mail). Django will always assume UTF-8 encoding for internal bytestrings. The reason for this is that the -``DEFAULT_CHARSET`` setting is not actually under your control (if you are the +:setting:`DEFAULT_CHARSET` setting is not actually under your control (if you are the application developer). It's under the control of the person installing and using your application -- and if that person chooses a different setting, your code must still continue to work. Ergo, it cannot rely on that setting. @@ -93,9 +95,7 @@ Calling ``unicode()`` with the lazy translation as the argument will generate a Unicode string in the current locale. For more details about lazy translation objects, refer to the -internationalization_ documentation. - -.. _internationalization: ../i18n/#lazy-translation +:ref:`internationalization <topics-i18n>` documentation. Useful utility functions ------------------------ @@ -123,15 +123,15 @@ for converting back and forth between Unicode and bytestrings. If you pass ``smart_unicode()`` an object that has a ``__unicode__`` method, it will use that method to do the conversion. - * ``force_unicode(s, encoding='utf-8', strings_only=False, errors='strict')`` - is identical to ``smart_unicode()`` in almost all cases. The difference - is when the first argument is a `lazy translation`_ instance. While - ``smart_unicode()`` preserves lazy translations, ``force_unicode()`` - forces those objects to a Unicode string (causing the translation to - occur). Normally, you'll want to use ``smart_unicode()``. However, - ``force_unicode()`` is useful in template tags and filters that - absolutely *must* have a string to work with, not just something that can - be converted to a string. + * ``force_unicode(s, encoding='utf-8', strings_only=False, + errors='strict')`` is identical to ``smart_unicode()`` in almost all + cases. The difference is when the first argument is a :ref:`lazy + translation <lazy-translations>` instance. While ``smart_unicode()`` + preserves lazy translations, ``force_unicode()`` forces those objects to a + Unicode string (causing the translation to occur). Normally, you'll want + to use ``smart_unicode()``. However, ``force_unicode()`` is useful in + template tags and filters that absolutely *must* have a string to work + with, not just something that can be converted to a string. * ``smart_str(s, encoding='utf-8', strings_only=False, errors='strict')`` is essentially the opposite of ``smart_unicode()``. It forces the first @@ -144,12 +144,10 @@ Normally, you'll only need to use ``smart_unicode()``. Call it as early as possible on any input data that might be either Unicode or a bytestring, and from then on, you can treat the result as always being Unicode. -.. _lazy translation: ../i18n/#lazy-translation - URI and IRI handling ~~~~~~~~~~~~~~~~~~~~ -Web frameworks have to deal with URLs (which are a type of URI_). One +Web frameworks have to deal with URLs (which are a type of IRI_). One requirement of URLs is that they are encoded using only ASCII characters. However, in an international environment, you might need to construct a URL from an IRI_ -- very loosely speaking, a URI that can contain Unicode @@ -288,12 +286,12 @@ You can use either Unicode or bytestrings when creating templates manually:: But the common case is to read templates from the filesystem, and this creates a slight complication: not all filesystems store their data encoded as UTF-8. -If your template files are not stored with a UTF-8 encoding, set the ``FILE_CHARSET`` +If your template files are not stored with a UTF-8 encoding, set the :setting:`FILE_CHARSET` setting to the encoding of the files on disk. When Django reads in a template -file, it will convert the data from this encoding to Unicode. (``FILE_CHARSET`` +file, it will convert the data from this encoding to Unicode. (:setting:`FILE_CHARSET` is set to ``'utf-8'`` by default.) -The ``DEFAULT_CHARSET`` setting controls the encoding of rendered templates. +The :setting:`DEFAULT_CHARSET` setting controls the encoding of rendered templates. This is set to UTF-8 by default. Template tags and filters @@ -345,7 +343,7 @@ two fields will return their members as Unicode data. All other attributes and methods of ``HttpRequest`` return data exactly as it was submitted by the client. -By default, the ``DEFAULT_CHARSET`` setting is used as the assumed encoding +By default, the :setting:`DEFAULT_CHARSET` setting is used as the assumed encoding for form data. If you need to change this for a particular form, you can set the ``encoding`` attribute on an ``HttpRequest`` instance. For example:: diff --git a/docs/release_notes_0.95.txt b/docs/releases/0.95.txt similarity index 97% rename from docs/release_notes_0.95.txt rename to docs/releases/0.95.txt index a61b10d567..b74160128b 100644 --- a/docs/release_notes_0.95.txt +++ b/docs/releases/0.95.txt @@ -1,8 +1,9 @@ +.. _releases-0.95: + ================================= Django version 0.95 release notes ================================= - Welcome to the Django 0.95 release. This represents a significant advance in Django development since the 0.91 @@ -98,10 +99,10 @@ easy checklist_ for reference when undertaking the porting operation. Problem reports and getting help ================================ -Need help resolving a problem with Django? The documentation in the -distribution is also available online_ at the `Django Web site`_. The FAQ_ -document is especially recommended, as it contains a number of issues that -come up time and again. +Need help resolving a problem with Django? The documentation in the distribution +is also available online_ at the `Django Web site`_. The :ref:`FAQ <faq-index>` +document is especially recommended, as it contains a number of issues that come +up time and again. For more personalized help, the `django-users`_ mailing list is a very active list, with more than 2,000 subscribers who can help you solve any sort of @@ -116,7 +117,6 @@ available at any hour of the day -- to help, or just to chat. .. _online: http://www.djangoproject.com/documentation/0.95/ .. _Django Web site: http://www.djangoproject.com/ -.. _FAQ: http://www.djangoproject.com/documentation/faq/ .. _django-users: http://groups.google.com/group/django-users Thanks for using Django! diff --git a/docs/release_notes_0.96.txt b/docs/releases/0.96.txt similarity index 95% rename from docs/release_notes_0.96.txt rename to docs/releases/0.96.txt index 59931541e1..186a0e8da9 100644 --- a/docs/release_notes_0.96.txt +++ b/docs/releases/0.96.txt @@ -1,3 +1,5 @@ +.. _releases-0.96: + ================================= Django version 0.96 release notes ================================= @@ -34,7 +36,7 @@ exceptions if you attempt to use an older version. If you're currently unable to upgrade your copy of ``MySQLdb`` to meet this requirement, a separate, backwards-compatible backend, called "mysql_old", has been added to Django. To use this backend, change -the ``DATABASE_ENGINE`` setting in your Django settings file from +the :setting:`DATABASE_ENGINE` setting in your Django settings file from this:: DATABASE_ENGINE = "mysql" @@ -49,12 +51,12 @@ provided only to ease this transition, and is considered deprecated; aside from any necessary security fixes, it will not be actively maintained, and it will be removed in a future release of Django. -Also, note that some features, like the new ``DATABASE_OPTIONS`` +Also, note that some features, like the new :setting:`DATABASE_OPTIONS` setting (see the `databases documentation`_ for details), are only available on the "mysql" backend, and will not be made available for "mysql_old". -.. _databases documentation: ../databases/ +.. _databases documentation: http://www.djangoproject.com/documentation/0.96/databases/ Database constraint names changed --------------------------------- @@ -167,7 +169,7 @@ old forms system and start with the new. For more information about ``django.newforms``, read the `newforms documentation`_. -.. _newforms documentation: ../newforms/ +.. _newforms documentation: http://www.djangoproject.com/documentation/0.96/newforms/ URLconf improvements -------------------- @@ -227,8 +229,8 @@ See `the testing documentation`_ for the full details. .. _doctest: http://docs.python.org/lib/module-doctest.html .. _unittest: http://docs.python.org/lib/module-unittest.html -.. _the testing documentation: ../testing/ -.. _serialization formats: ../serialization/ +.. _the testing documentation: http://www.djangoproject.com/documentation/0.96/testing/ +.. _serialization formats: http://www.djangoproject.com/documentation/0.96/serialization/ Improvements to the admin interface ----------------------------------- diff --git a/docs/release_notes_1.0_alpha.txt b/docs/releases/1.0-alpha-1.txt similarity index 99% rename from docs/release_notes_1.0_alpha.txt rename to docs/releases/1.0-alpha-1.txt index 6fce66532e..1b13b7c58a 100644 --- a/docs/release_notes_1.0_alpha.txt +++ b/docs/releases/1.0-alpha-1.txt @@ -1,3 +1,5 @@ +.. _releases-1.0-alpha-1: + ================================ Django 1.0 alpha release notes ================================ diff --git a/docs/release_notes_1.0_alpha_2.txt b/docs/releases/1.0-alpha-2.txt similarity index 81% rename from docs/release_notes_1.0_alpha_2.txt rename to docs/releases/1.0-alpha-2.txt index c2f0ca5598..8916678ad5 100644 --- a/docs/release_notes_1.0_alpha_2.txt +++ b/docs/releases/1.0-alpha-2.txt @@ -1,8 +1,9 @@ +.. _releases-1.0-alpha-2: + ================================ Django 1.0 alpha 2 release notes ================================ - Welcome to Django 1.0 alpha 2! This is the second in a series of preview/development releases leading @@ -18,11 +19,11 @@ such use is strongly discouraged. What's new in Django 1.0 alpha 2 ================================ -Django's development trunk has been the site of nearly constant -activity over the past year, with several major new features landing -since the 0.96 release. For features which were new as of Django 1.0 -alpha 1, see `the 1.0 alpha 1 release notes`_. Since the 1.0 alpha 1 -release several new features have landed, including: +Django's development trunk has been the site of nearly constant activity over +the past year, with several major new features landing since the 0.96 release. +For features which were new as of Django 1.0 alpha 1, see :ref:`the 1.0 alpha 1 +release notes <releases-1.0-alpha-1`. Since the 1.0 alpha 1 release several new +features have landed, including: ``django.contrib.gis`` (`GeoDjango`_) A project over a year in the making, this adds world-class GIS @@ -34,12 +35,11 @@ release several new features have landed, including: for their efforts in creating and completing this feature. Pluggable file storage - Django's built-in ``FileField`` and ``ImageField`` now can take - advantage of pluggable file-storage backends, allowing extensive - customization of where and how uploaded files get stored by - Django. For details, see `the files documentation`_; big thanks go - to Marty Alchin for putting in the hard work to get this - completed. + Django's built-in ``FileField`` and ``ImageField`` now can take advantage of + pluggable file-storage backends, allowing extensive customization of where + and how uploaded files get stored by Django. For details, see :ref:`the + files documentation <topics-files>`; big thanks go to Marty Alchin for + putting in the hard work to get this completed. Jython compatibility Thanks to a lot of work from Leo Soto during a Google Summer of @@ -49,20 +49,17 @@ Jython compatibility Machine. Django is now compatible with the forthcoming Jython 2.5 release. -There are many other new features and improvements in this release, -including two major performance boosts: strings marked for translation -using `Django's internationalization system`_ now consume far less -memory, and Django's internal dispatcher -- which is invoked -frequently during request/response processing and when working with -Django's object-relational mapper -- is now significantly faster. +There are many other new features and improvements in this release, including +two major performance boosts: strings marked for translation using +:ref:`Django's internationalization system <topics-i18n>` now consume far less +memory, and Django's internal dispatcher -- which is invoked frequently during +request/response processing and when working with Django's object-relational +mapper -- is now significantly faster. -.. _the 1.0 alpha 1 release notes: ../release_notes_1.0_alpha/ .. _GeoDjango: http://geodjango.org/ .. _Geographic Information Systems: http://en.wikipedia.org/wiki/Geographic_information_system .. _Its documentation: http://geodjango.org/docs/ -.. _the files documentation: ../files/ .. _Jython: http://www.jython.org/ -.. _Django's internationalization system: ../i18n/ The Django 1.0 roadmap diff --git a/docs/release_notes_1.0_beta_1.txt b/docs/releases/1.0-beta.txt similarity index 86% rename from docs/release_notes_1.0_beta_1.txt rename to docs/releases/1.0-beta.txt index 23c2c10663..69f15e7f2d 100644 --- a/docs/release_notes_1.0_beta_1.txt +++ b/docs/releases/1.0-beta.txt @@ -1,8 +1,9 @@ +.. _releases-1.0-beta: + =============================== Django 1.0 beta 1 release notes =============================== - Welcome to Django 1.0 beta 1! This is the third in a series of preview/development releases leading @@ -14,15 +15,14 @@ helping to identify and resolve bugs prior to the final 1.0 release. As such, this release is *not* intended for production use, and any such use is discouraged. - What's new in Django 1.0 beta 1 =============================== -Django's development trunk has been the site of nearly constant -activity over the past year, with several major new features landing -since the 0.96 release. For features which were new as of Django 1.0 -alpha 1, see `the 1.0 alpha 1 release notes`_. For features which were -new as of Django 1.0 alpha 2, see `the 1.0 alpha 2 release notes`_. +Django's development trunk has been the site of nearly constant activity over +the past year, with several major new features landing since the 0.96 release. +For features which were new as of Django 1.0 alpha 1, see :ref:`the 1.0 alpha 1 +release notes <releases-1.0-alpha-1>`. For features which were new as of Django +1.0 alpha 2, see :ref:`the 1.0 alpha 2 release notes <releases-1.0-alpha-2>`. This beta release does not contain any major new features, but does include several smaller updates and improvements to Django: @@ -30,15 +30,15 @@ include several smaller updates and improvements to Django: Generic relations in forms and admin Classes are now included in ``django.contrib.contenttypes`` which can be used to support generic relations in both the admin - interface and in end-user forms. See `the documentation for - generic relations`_ for details. + interface and in end-user forms. See :ref:`the documentation for + generic relations <generic-relations>` for details. Improved flexibility in the admin Following up on the refactoring of Django's administrative interface (``django.contrib.admin``), introduced in Django 1.0 alpha 1, two new hooks have been added to allow customized pre- and post-save handling of model instances in the admin. Full - details are in `the admin documentation`_. + details are in :ref:`the admin documentation <ref-contrib-admin>`. ``INSERT``/``UPDATE`` distinction Although Django's default behavior of having a model's ``save()`` @@ -47,7 +47,7 @@ Improved flexibility in the admin cases, there are occasional situations where forcing one or the other is useful. As a result, models can now support an additional parameter to ``save()`` which can force a specific - operation. Consult `the database API documentation`_ for details + operation. Consult the database API documentation for details and important notes about appropriate use of this parameter. Split ``CacheMiddleware`` @@ -58,7 +58,8 @@ Split ``CacheMiddleware`` into and reading from the cache) separately, offering additional flexibility for situations where combining these functions into a single middleware posed problems. Full details, including updated - notes on appropriate use, are in `the caching documentation`_. + notes on appropriate use, are in + :ref:`the caching documentation <topics-cache>`. Removal of deprecated features A number of features and methods which had previously been marked @@ -79,12 +80,7 @@ collations have been resolved, Windows packaging and installation has been improved and the method by which Django generates unique session identifiers has been made much more robust. -.. _the 1.0 alpha 1 release notes: ../release_notes_1.0_alpha/ -.. _the 1.0 alpha 2 release notes: ../release_notes_1.0_alpha_2/ .. _the documentation for generic relations: ../contenttypes/#generic-relations -.. _the admin documentation: ../admin/#modeladmin-methods -.. _the database API documentation: ../db-api/#forcing-an-insert-or-update -.. _the caching documentation: ../cache/#the-per-site-cache .. _the Django wiki: http://code.djangoproject.com/wiki/BackwardsIncompatibleChanges#Removedseveralmoredeprecatedfeaturesfor1.0 diff --git a/docs/releases/index.txt b/docs/releases/index.txt new file mode 100644 index 0000000000..b9c01ec5ed --- /dev/null +++ b/docs/releases/index.txt @@ -0,0 +1,26 @@ +.. _releases-index: + +Release notes +============= + +Releases notes for the official Django releases. Each release note will tell you +what's new in each version, and will also describe any backwards-incompatible +changes made in that version. + +.. toctree:: + :maxdepth: 1 + + 0.95 + 0.96 + 1.0-alpha-1 + 1.0-alpha-2 + 1.0-beta + +.. seealso:: + + The list of `backwards-incompatible changes`_ made in the current + development "trunk". If you're running versions of Django newer than an + official release, you should keep track of new pieces pointed there. It's + also fun reading if you're looking forward to new versions of Django. + +.. _backwards-incompatible changes: http://code.djangoproject.com/wiki/BackwardsIncompatibleChanges \ No newline at end of file diff --git a/docs/sitemaps.txt b/docs/sitemaps.txt deleted file mode 100644 index 3e7411c168..0000000000 --- a/docs/sitemaps.txt +++ /dev/null @@ -1,334 +0,0 @@ -===================== -The sitemap framework -===================== - -Django comes with a high-level sitemap-generating framework that makes -creating sitemap_ XML files easy. - -.. _sitemap: http://www.sitemaps.org/ - -Overview -======== - -A sitemap is an XML file on your Web site that tells search-engine indexers how -frequently your pages change and how "important" certain pages are in relation -to other pages on your site. This information helps search engines index your -site. - -The Django sitemap framework automates the creation of this XML file by letting -you express this information in Python code. - -It works much like Django's `syndication framework`_. To create a sitemap, just -write a ``Sitemap`` class and point to it in your URLconf_. - -.. _syndication framework: ../syndication_feeds/ -.. _URLconf: ../url_dispatch/ - -Installation -============ - -To install the sitemap app, follow these steps: - - 1. Add ``'django.contrib.sitemaps'`` to your INSTALLED_APPS_ setting. - 2. Make sure ``'django.template.loaders.app_directories.load_template_source'`` - is in your TEMPLATE_LOADERS_ setting. It's in there by default, so - you'll only need to change this if you've changed that setting. - 3. Make sure you've installed the `sites framework`_. - -(Note: The sitemap application doesn't install any database tables. The only -reason it needs to go into ``INSTALLED_APPS`` is so that the -``load_template_source`` template loader can find the default templates.) - -.. _INSTALLED_APPS: ../settings/#installed-apps -.. _TEMPLATE_LOADERS: ../settings/#template-loaders -.. _sites framework: ../sites/ - -Initialization -============== - -To activate sitemap generation on your Django site, add this line to your -URLconf_:: - - (r'^sitemap.xml$', 'django.contrib.sitemaps.views.sitemap', {'sitemaps': sitemaps}) - -This tells Django to build a sitemap when a client accesses ``/sitemap.xml``. - -The name of the sitemap file is not important, but the location is. Search -engines will only index links in your sitemap for the current URL level and -below. For instance, if ``sitemap.xml`` lives in your root directory, it may -reference any URL in your site. However, if your sitemap lives at -``/content/sitemap.xml``, it may only reference URLs that begin with -``/content/``. - -The sitemap view takes an extra, required argument: ``{'sitemaps': sitemaps}``. -``sitemaps`` should be a dictionary that maps a short section label (e.g., -``blog`` or ``news``) to its ``Sitemap`` class (e.g., ``BlogSitemap`` or -``NewsSitemap``). It may also map to an *instance* of a ``Sitemap`` class -(e.g., ``BlogSitemap(some_var)``). - -.. _URLconf: ../url_dispatch/ - -Sitemap classes -=============== - -A ``Sitemap`` class is a simple Python class that represents a "section" of -entries in your sitemap. For example, one ``Sitemap`` class could represent all -the entries of your weblog, while another could represent all of the events in -your events calendar. - -In the simplest case, all these sections get lumped together into one -``sitemap.xml``, but it's also possible to use the framework to generate a -sitemap index that references individual sitemap files, one per section. (See -`Creating a sitemap index`_ below.) - -``Sitemap`` classes must subclass ``django.contrib.sitemaps.Sitemap``. They can -live anywhere in your codebase. - -A simple example -================ - -Let's assume you have a blog system, with an ``Entry`` model, and you want your -sitemap to include all the links to your individual blog entries. Here's how -your sitemap class might look:: - - from django.contrib.sitemaps import Sitemap - from mysite.blog.models import Entry - - class BlogSitemap(Sitemap): - changefreq = "never" - priority = 0.5 - - def items(self): - return Entry.objects.filter(is_draft=False) - - def lastmod(self, obj): - return obj.pub_date - -Note: - - * ``changefreq`` and ``priority`` are class attributes corresponding to - ``<changefreq>`` and ``<priority>`` elements, respectively. They can be - made callable as functions, as ``lastmod`` was in the example. - * ``items()`` is simply a method that returns a list of objects. The objects - returned will get passed to any callable methods corresponding to a - sitemap property (``location``, ``lastmod``, ``changefreq``, and - ``priority``). - * ``lastmod`` should return a Python ``datetime`` object. - * There is no ``location`` method in this example, but you can provide it - in order to specify the URL for your object. By default, ``location()`` - calls ``get_absolute_url()`` on each object and returns the result. - -Sitemap class reference -======================= - -A ``Sitemap`` class can define the following methods/attributes: - -``items`` ---------- - -**Required.** A method that returns a list of objects. The framework doesn't -care what *type* of objects they are; all that matters is that these objects -get passed to the ``location()``, ``lastmod()``, ``changefreq()`` and -``priority()`` methods. - -``location`` ------------- - -**Optional.** Either a method or attribute. - -If it's a method, it should return the absolute URL for a given object as -returned by ``items()``. - -If it's an attribute, its value should be a string representing an absolute URL -to use for *every* object returned by ``items()``. - -In both cases, "absolute URL" means a URL that doesn't include the protocol or -domain. Examples: - - * Good: ``'/foo/bar/'`` - * Bad: ``'example.com/foo/bar/'`` - * Bad: ``'http://example.com/foo/bar/'`` - -If ``location`` isn't provided, the framework will call the -``get_absolute_url()`` method on each object as returned by ``items()``. - -``lastmod`` ------------ - -**Optional.** Either a method or attribute. - -If it's a method, it should take one argument -- an object as returned by -``items()`` -- and return that object's last-modified date/time, as a Python -``datetime.datetime`` object. - -If it's an attribute, its value should be a Python ``datetime.datetime`` object -representing the last-modified date/time for *every* object returned by -``items()``. - -``changefreq`` --------------- - -**Optional.** Either a method or attribute. - -If it's a method, it should take one argument -- an object as returned by -``items()`` -- and return that object's change frequency, as a Python string. - -If it's an attribute, its value should be a string representing the change -frequency of *every* object returned by ``items()``. - -Possible values for ``changefreq``, whether you use a method or attribute, are: - - * ``'always'`` - * ``'hourly'`` - * ``'daily'`` - * ``'weekly'`` - * ``'monthly'`` - * ``'yearly'`` - * ``'never'`` - -``priority`` ------------- - -**Optional.** Either a method or attribute. - -If it's a method, it should take one argument -- an object as returned by -``items()`` -- and return that object's priority, as either a string or float. - -If it's an attribute, its value should be either a string or float representing -the priority of *every* object returned by ``items()``. - -Example values for ``priority``: ``0.4``, ``1.0``. The default priority of a -page is ``0.5``. See the `sitemaps.org documentation`_ for more. - -.. _sitemaps.org documentation: http://www.sitemaps.org/protocol.html#prioritydef - -Shortcuts -========= - -The sitemap framework provides a couple convenience classes for common cases: - -``FlatPageSitemap`` -------------------- - -The ``django.contrib.sitemaps.FlatPageSitemap`` class looks at all flatpages_ -defined for the current ``SITE_ID`` (see the `sites documentation`_) and -creates an entry in the sitemap. These entries include only the ``location`` -attribute -- not ``lastmod``, ``changefreq`` or ``priority``. - -.. _flatpages: ../flatpages/ -.. _sites documentation: ../sites/ - -``GenericSitemap`` ------------------- - -The ``GenericSitemap`` class works with any `generic views`_ you already have. -To use it, create an instance, passing in the same ``info_dict`` you pass to -the generic views. The only requirement is that the dictionary have a -``queryset`` entry. It may also have a ``date_field`` entry that specifies a -date field for objects retrieved from the ``queryset``. This will be used for -the ``lastmod`` attribute in the generated sitemap. You may also pass -``priority`` and ``changefreq`` keyword arguments to the ``GenericSitemap`` -constructor to specify these attributes for all URLs. - -.. _generic views: ../generic_views/ - -Example -------- - -Here's an example of a URLconf_ using both:: - - from django.conf.urls.defaults import * - from django.contrib.sitemaps import FlatPageSitemap, GenericSitemap - from mysite.blog.models import Entry - - info_dict = { - 'queryset': Entry.objects.all(), - 'date_field': 'pub_date', - } - - sitemaps = { - 'flatpages': FlatPageSitemap, - 'blog': GenericSitemap(info_dict, priority=0.6), - } - - urlpatterns = patterns('', - # some generic view using info_dict - # ... - - # the sitemap - (r'^sitemap.xml$', 'django.contrib.sitemaps.views.sitemap', {'sitemaps': sitemaps}) - ) - -.. _URLconf: ../url_dispatch/ - -Creating a sitemap index -======================== - -The sitemap framework also has the ability to create a sitemap index that -references individual sitemap files, one per each section defined in your -``sitemaps`` dictionary. The only differences in usage are: - - * You use two views in your URLconf: ``django.contrib.sitemaps.views.index`` - and ``django.contrib.sitemaps.views.sitemap``. - * The ``django.contrib.sitemaps.views.sitemap`` view should take a - ``section`` keyword argument. - -Here is what the relevant URLconf lines would look like for the example above:: - - (r'^sitemap.xml$', 'django.contrib.sitemaps.views.index', {'sitemaps': sitemaps}) - (r'^sitemap-(?P<section>.+).xml$', 'django.contrib.sitemaps.views.sitemap', {'sitemaps': sitemaps}) - -This will automatically generate a ``sitemap.xml`` file that references -both ``sitemap-flatpages.xml`` and ``sitemap-blog.xml``. The ``Sitemap`` -classes and the ``sitemaps`` dict don't change at all. - -If one of your sitemaps is going to have more than 50,000 URLs you should -create an index file. Your sitemap will be paginated and the index will -reflect that. - -Pinging Google -============== - -You may want to "ping" Google when your sitemap changes, to let it know to -reindex your site. The framework provides a function to do just that: -``django.contrib.sitemaps.ping_google()``. - -``ping_google()`` takes an optional argument, ``sitemap_url``, which should be -the absolute URL of your site's sitemap (e.g., ``'/sitemap.xml'``). If this -argument isn't provided, ``ping_google()`` will attempt to figure out your -sitemap by performing a reverse looking in your URLconf. - -``ping_google()`` raises the exception -``django.contrib.sitemaps.SitemapNotFound`` if it cannot determine your sitemap -URL. - -One useful way to call ``ping_google()`` is from a model's ``save()`` method:: - - from django.contrib.sitemaps import ping_google - - class Entry(models.Model): - # ... - def save(self): - super(Entry, self).save() - try: - ping_google() - except Exception: - # Bare 'except' because we could get a variety - # of HTTP-related exceptions. - pass - -A more efficient solution, however, would be to call ``ping_google()`` from a -cron script, or some other scheduled task. The function makes an HTTP request -to Google's servers, so you may not want to introduce that network overhead -each time you call ``save()``. - -Pinging Google via `manage.py` ------------------------------- - -**New in Django development version** - -Once the sitemaps application is added to your project, you may also -ping the Google server's through the command line manage.py interface:: - - python manage.py ping_google [/sitemap.xml] - diff --git a/docs/topics/auth.txt b/docs/topics/auth.txt new file mode 100644 index 0000000000..ca73b92ea8 --- /dev/null +++ b/docs/topics/auth.txt @@ -0,0 +1,1334 @@ +.. _topics-auth: + +============================= +User authentication in Django +============================= + +.. module:: django.contrib.auth + :synopsis: Django's authentication framework. + +Django comes with a user authentication system. It handles user accounts, +groups, permissions and cookie-based user sessions. This document explains how +things work. + +Overview +======== + +The auth system consists of: + + * Users + * Permissions: Binary (yes/no) flags designating whether a user may perform + a certain task. + * Groups: A generic way of applying labels and permissions to more than one + user. + * Messages: A simple way to queue messages for given users. + +Installation +============ + +Authentication support is bundled as a Django application in +``django.contrib.auth``. To install it, do the following: + + 1. Put ``'django.contrib.auth'`` in your :setting:`INSTALLED_APPS` setting. + 2. Run the command ``manage.py syncdb``. + +Note that the default :file:`settings.py` file created by +:djadmin:`django-admin.py startproject` includes ``'django.contrib.auth'`` in +:setting:`INSTALLED_APPS` for convenience. If your :setting:`INSTALLED_APPS` +already contains ``'django.contrib.auth'``, feel free to run +:djadmin:`manage.py syncdb` again; you can run that command as many times as +you'd like, and each time it'll only install what's needed. + +The :djadmin:`syncdb` command creates the necessary database tables, creates +permission objects for all installed apps that need 'em, and prompts you to +create a superuser account the first time you run it. + +Once you've taken those steps, that's it. + +Users +===== + +.. class:: models.User + +API reference +------------- + +Fields +~~~~~~ + +.. class:: models.User + + :class:`~django.contrib.auth.models.User` objects have the following fields: + + .. attribute:: models.User.username + + Required. 30 characters or fewer. Alphanumeric characters only (letters, + digits and underscores). + + .. attribute:: models.User.first_name + + Optional. 30 characters or fewer. + + .. attribute:: models.User.last_name + + Optional. 30 characters or fewer. + + .. attribute:: models.User.email + + Optional. E-mail address. + + .. attribute:: models.User.password + + Required. A hash of, and metadata about, the password. (Django doesn't + store the raw password.) Raw passwords can be arbitrarily long and can + contain any character. See the "Passwords" section below. + + .. attribute:: models.User.is_staff + + Boolean. Designates whether this user can access the admin site. + + .. attribute:: models.User.is_active + + Boolean. Designates whether this account can be used to log in. Set this + flag to ``False`` instead of deleting accounts. + + .. attribute:: models.User.is_superuser + + Boolean. Designates that this user has all permissions without explicitly + assigning them. + + .. attribute:: models.User.last_login + + A datetime of the user's last login. Is set to the current date/time by + default. + + .. attribute:: models.User.date_joined + + A datetime designating when the account was created. Is set to the current + date/time by default when the account is created. + +Methods +~~~~~~~ + +.. class:: models.User + + :class:`~django.contrib.auth.models.User` objects have two many-to-many + fields: models.User. ``groups`` and ``user_permissions``. + :class:`~django.contrib.auth.models.User` objects can access their related + objects in the same way as any other :ref:`Django model <topics-db-models>`: + + .. code-block:: python + + myuser.groups = [group_list] + myuser.groups.add(group, group, ...) + myuser.groups.remove(group, group, ...) + myuser.groups.clear() + myuser.user_permissions = [permission_list] + myuser.user_permissions.add(permission, permission, ...) + myuser.user_permissions.remove(permission, permission, ...) + myuser.user_permissions.clear() + + In addition to those automatic API methods, + :class:`~django.contrib.auth.models.User` objects have the following custom + methods: + + .. method:: models.User.is_anonymous() + + Always returns ``False``. This is a way of differentiating + :class:`~django.contrib.auth.models.User` and + :class:`~django.contrib.auth.models.AnonymousUser` objects. + Generally, you should prefer using + :meth:`~django.contrib.auth.models.User.is_authenticated()` to this + method. + + .. method:: models.User.is_authenticated() + + Always returns ``True``. This is a way to + tell if the user has been authenticated. This does not imply any + permissions, and doesn't check if the user is active - it only indicates + that the user has provided a valid username and password. + + .. method:: models.User.get_full_name() + + Returns the :attr:`~django.contrib.auth.models.User.first_name` plus the + :attr:`~django.contrib.auth.models.User.last_name`, + with a space in between. + + .. method:: models.User.set_password(raw_password) + + Sets the user's password to the given raw string, taking care of the + password hashing. Doesn't save the + :class:`~django.contrib.auth.models.User` object. + + .. method:: models.User.check_password(raw_password) + + Returns ``True`` if the given raw string is the correct password for the + user. (This takes care of the password hashing in making the comparison.) + + .. method:: models.User.set_unusable_password() + + **New in Django development version.** + Marks the user as having no password set. This isn't the same as having + a blank string for a password. + :meth:`~django.contrib.auth.models.User.check_password()` for this user + will never return ``True``. Doesn't save the + :class:`~django.contrib.auth.models.User` object. + + You may need this if authentication for your application takes place + against an existing external source such as an LDAP directory. + + .. method:: models.User.has_usable_password() + + **New in Django development version.** + Returns ``False`` if + :meth:`~django.contrib.auth.models.User.set_unusable_password()` has + been called for this user. + + .. method:: models.User.get_group_permissions() + + Returns a list of permission strings that the user has, through his/her + groups. + + .. method:: models.User.get_all_permissions() + + Returns a list of permission strings that the user has, both through group + and user permissions. + + .. method:: models.User.has_perm(perm) + + Returns ``True`` if the user has the specified permission, where perm is + in the format ``"package.codename"``. If the user is inactive, this method + will always return ``False``. + + .. method:: models.User.has_perms(perm_list) + + Returns ``True`` if the user has each of the specified permissions, where + each perm is in the format ``"package.codename"``. If the user is inactive, + this method will always return ``False``. + + .. method:: models.User.has_module_perms(package_name) + + Returns ``True`` if the user has any permissions in the given package (the + Django app label). If the user is inactive, this method will always return + ``False``. + + .. method:: models.User.get_and_delete_messages() + + Returns a list of :class:`~django.contrib.auth.models.Message` objects in + the user's queue and deletes the messages from the queue. + + .. method:: models.User.email_user(subject, message, from_email=None) + + Sends an e-mail to the user. If + :attr:`~django.contrib.auth.models.User.from_email` is ``None``, Django + uses the :setting:`DEFAULT_FROM_EMAIL`. + + .. method:: models.User.get_profile() + + Returns a site-specific profile for this user. Raises + :exc:`django.contrib.auth.models.SiteProfileNotAvailable` if the current + site doesn't allow profiles. For information on how to define a + site-specific user profile, see the section on + `storing additional user information`_ below. + +.. _storing additional user information: #storing-additional-information-about-users + +Manager functions +~~~~~~~~~~~~~~~~~ + +.. class:: models.UserManager + + The :class:`~django.contrib.auth.models.User` model has a custom manager + that has the following helper functions: + + .. method:: models.UserManager.create_user(username, email, password=None) + + Creates, saves and returns a :class:`~django.contrib.auth.models.User`. + The :attr:`~django.contrib.auth.models.User.username`, + :attr:`~django.contrib.auth.models.User.email` and + :attr:`~django.contrib.auth.models.User.password` are set as given, and the + :class:`~django.contrib.auth.models.User` gets ``is_active=True``. + + If no password is provided, + :meth:`~django.contrib.auth.models.User.set_unusable_password()` will be + called. + + See `Creating users`_ for example usage. + + .. method:: models.UserManager.make_random_password(length=10, allowed_chars='abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789') + + Returns a random password with the given length and given string of + allowed characters. (Note that the default value of ``allowed_chars`` + doesn't contain letters that can cause user confusion, including ``1``, + ``I`` and ``0``). + +Basic usage +----------- + +.. _topics-auth-creating-users: + +Creating users +~~~~~~~~~~~~~~ + +The most basic way to create users is to use the +:meth:`~django.contrib.auth.models.UserManager.create_user` helper function +that comes with Django:: + + >>> from django.contrib.auth.models import User + >>> user = User.objects.create_user('john', 'lennon@thebeatles.com', 'johnpassword') + + # At this point, user is a User object that has already been saved + # to the database. You can continue to change its attributes + # if you want to change other fields. + >>> user.is_staff = True + >>> user.save() + +Changing passwords +~~~~~~~~~~~~~~~~~~ + +Change a password with :meth:`~django.contrib.auth.models.User.set_password()`:: + + >>> from django.contrib.auth.models import User + >>> u = User.objects.get(username__exact='john') + >>> u.set_password('new password') + >>> u.save() + +Don't set the :attr:`~django.contrib.auth.models.User.password` attribute +directly unless you know what you're doing. This is explained in the next +section. + +Passwords +--------- + +The :attr:`~django.contrib.auth.models.User.password` attribute of a +:class:`~django.contrib.auth.models.User` object is a string in this format:: + + hashtype$salt$hash + +That's hashtype, salt and hash, separated by the dollar-sign character. + +Hashtype is either ``sha1`` (default), ``md5`` or ``crypt`` -- the algorithm +used to perform a one-way hash of the password. Salt is a random string used +to salt the raw password to create the hash. Note that the ``crypt`` method is +only supported on platforms that have the standard Python ``crypt`` module +available, and ``crypt`` support is only available in the Django development +version. + +For example:: + + sha1$a1976$a36cc8cbf81742a8fb52e221aaeab48ed7f58ab4 + +The :meth:`~django.contrib.auth.models.User.set_password` and +:meth:`~django.contrib.auth.models.User.check_password` functions handle the +setting and checking of these values behind the scenes. + +Previous Django versions, such as 0.90, used simple MD5 hashes without password +salts. For backwards compatibility, those are still supported; they'll be +converted automatically to the new style the first time +:meth:`~django.contrib.auth.models.User.check_password()` works correctly for +a given user. + +Anonymous users +--------------- + +.. class:: models.AnonymousUser + + :class:`django.contrib.auth.models.AnonymousUser` is a class that + implements the :class:`django.contrib.auth.models.User` interface, with + these differences: + + * :attr:`~django.contrib.auth.models.User.id` is always ``None``. + * :attr:`~django.contrib.auth.models.User.is_staff` and + :attr:`~django.contrib.auth.models.User.is_superuser` are always ``False``. + * :attr:`~django.contrib.auth.models.User.is_active` is always ``False``. + * :attr:`~django.contrib.auth.models.User.groups` and + :attr:`~django.contrib.auth.models.User.user_permissions` are always empty. + * :meth:`~django.contrib.auth.models.User.is_anonymous()` returns ``True`` + instead of ``False``. + * :meth:`~django.contrib.auth.models.User.is_authenticated()` returns + ``False`` instead of ``True``. + * :meth:`~django.contrib.auth.models.User.has_perm()` always returns ``False``. + * :meth:`~django.contrib.auth.models.User.set_password()`, + :meth:`~django.contrib.auth.models.User.check_password()`, + :meth:`~django.contrib.auth.models.User.save()`, + :meth:`~django.contrib.auth.models.User.delete()`, + :meth:`~django.contrib.auth.models.User.set_groups()` and + :meth:`~django.contrib.auth.models.User.set_permissions()` raise + :exc:`NotImplementedError`. + +In practice, you probably won't need to use +:class:`~django.contrib.auth.models.AnonymousUser` objects on your own, but +they're used by Web requests, as explained in the next section. + +Creating superusers +------------------- + +:djadmin:`manage.py syncdb <syncdb>` prompts you to create a superuser the first time +you run it after adding ``'django.contrib.auth'`` to your +:setting:`INSTALLED_APPS`. If you need to create a superuser at a later date, +you can use a command line utility. + +**New in Django development version.**:: + + manage.py createsuperuser --username=joe --email=joe@example.com + +You will be prompted for a password. After you enter one, the user will be +created immediately. If you leave off the :djadminopt:`--username` or the +:djadminopt:`--email` options, it will prompt you for those values. + +If you're using an older release of Django, the old way of creating a superuser +on the command line still works:: + + python /path/to/django/contrib/auth/create_superuser.py + +...where :file:`/path/to` is the path to the Django codebase on your +filesystem. The ``manage.py`` command is preferred because it figures +out the correct path and environment for you. + +.. _auth-profiles: + +Storing additional information about users +------------------------------------------ + +If you'd like to store additional information related to your users, +Django provides a method to specify a site-specific related model -- +termed a "user profile" -- for this purpose. + +To make use of this feature, define a model with fields for the +additional information you'd like to store, or additional methods +you'd like to have available, and also add a +:class:`~django.db.models.Field.ForeignKey` from your model to the +:class:`~django.contrib.auth.models.User` model, specified with ``unique=True`` +to ensure only one instance of your model can be created for each +:class:`~django.contrib.auth.models.User`. + +To indicate that this model is the user profile model for a given +site, fill in the setting :setting:`AUTH_PROFILE_MODULE` with a string +consisting of the following items, separated by a dot: + +1. The (normalized to lower-case) name of the application in which the + user profile model is defined (in other words, an all-lowercase + version of the name which was passed to + :djadmin:`manage.py startapp <startapp>` to create the application). + +2. The (normalized to lower-case) name of the model class. + +For example, if the profile model was a class named ``UserProfile`` +and was defined inside an application named ``accounts``, the +appropriate setting would be:: + + AUTH_PROFILE_MODULE = 'accounts.userprofile' + +When a user profile model has been defined and specified in this +manner, each :class:`~django.contrib.auth.models.User` object will have a +method -- :class:`~django.contrib.auth.models.User.get_profile()` +-- which returns the instance of the user profile model associated +with that :class:`~django.contrib.auth.models.User`. + +For more information, see `Chapter 12 of the Django book`_. + +.. _Chapter 12 of the Django book: http://www.djangobook.com/en/1.0/chapter12/#cn222 + +Authentication in Web requests +============================== + +Until now, this document has dealt with the low-level APIs for manipulating +authentication-related objects. On a higher level, Django can hook this +authentication framework into its system of +:class:`request objects <django.http.HttpRequest>`. + +First, install the +:class:`~django.contrib.sessions.middleware.SessionMiddleware` and +:class:`~django.contrib.auth.middleware.AuthenticationMiddleware` +middlewares by adding them to your :setting:`MIDDLEWARE_CLASSES` setting. See +the :ref:`session documentation <topics-http-sessions>` for more information. + +Once you have those middlewares installed, you'll be able to access +:attr:`request.user <django.http.HttpRequest.user>` in views. +:attr:`request.user <django.http.HttpRequest.user>` will give you a +:class:`~django.contrib.auth.models.User` object representing the currently +logged-in user. If a user isn't currently logged in, +:attr:`request.user <django.http.HttpRequest.user>` will be set to an instance +of :class:`~django.contrib.auth.models.AnonymousUser` (see the previous +section). You can tell them apart with +:meth:`~django.contrib.auth.models.User.is_authenticated()`, like so:: + + if request.user.is_authenticated(): + # Do something for authenticated users. + else: + # Do something for anonymous users. + +How to log a user in +-------------------- + +Django provides two functions in :mod:`django.contrib.auth`: +:func:`~django.contrib.auth.authenticate()` and +:func:`~django.contrib.auth.login()`. + +.. function:: authenticate() + + To authenticate a given username and password, use + :func:`~django.contrib.auth.authenticate()`. It + takes two keyword arguments, ``username`` and ``password``, and it returns + a :class:`~django.contrib.auth.models.User` object if the password is + valid for the given username. If the password is invalid, + :func:`~django.contrib.auth.authenticate()` returns ``None``. Example:: + + from django.contrib.auth import authenticate + user = authenticate(username='john', password='secret') + if user is not None: + if user.is_active: + print "You provided a correct username and password!" + else: + print "Your account has been disabled!" + else: + print "Your username and password were incorrect." + +.. function:: login() + + To log a user in, in a view, use :func:`~django.contrib.auth.login()`. It + takes an :class:`~django.http.HttpRequest` object and a + :class:`~django.contrib.auth.models.User` object. + :func:`~django.contrib.auth.login()` saves the user's ID in the session, + using Django's session framework, so, as mentioned above, you'll need to + make sure to have the session middleware installed. + + This example shows how you might use both + :func:`~django.contrib.auth.authenticate()` and + :func:`~django.contrib.auth.login()`:: + + from django.contrib.auth import authenticate, login + + def my_view(request): + username = request.POST['username'] + password = request.POST['password'] + user = authenticate(username=username, password=password) + if user is not None: + if user.is_active: + login(request, user) + # Redirect to a success page. + else: + # Return a 'disabled account' error message + else: + # Return an 'invalid login' error message. + +.. admonition:: Calling ``authenticate()`` first + + When you're manually logging a user in, you *must* call + :func:`~django.contrib.auth.authenticate()` before you call + :func:`~django.contrib.auth.login()`. + :func:`~django.contrib.auth.authenticate()` + sets an attribute on the :class:`~django.contrib.auth.models.User` noting + which authentication backend successfully authenticated that user (see + the `backends documentation`_ for details), and this information is + needed later during the login process. + +.. _backends documentation: #other-authentication-sources + +Manually checking a user's password +----------------------------------- + +.. function:: check_password() + + If you'd like to manually authenticate a user by comparing a + plain-text password to the hashed password in the database, use the + convenience function :func:`django.contrib.auth.models.check_password`. It + takes two arguments: the plain-text password to check, and the full + value of a user's ``password`` field in the database to check against, + and returns ``True`` if they match, ``False`` otherwise. + +How to log a user out +--------------------- + +.. function:: logout() + + To log out a user who has been logged in via + :func:`django.contrib.auth.login()`, use + :func:`django.contrib.auth.logout()` within your view. It takes an + :class:`~django.http.HttpRequest` object and has no return value. + Example:: + + from django.contrib.auth import logout + + def logout_view(request): + logout(request) + # Redirect to a success page. + + Note that :func:`~django.contrib.auth.logout()` doesn't throw any errors + if the user wasn't logged in. + + **New in Django development version:** When you call + :func:`~django.contrib.auth.logout()`, the session + data for the current request is completely cleaned out. All existing data + is removed. This is to prevent another person from using the same web + browser to log in and have access to the previous user's session data. + If you want to put anything into the session that will be available to + the user immediately after logging out, do that *after* calling + :func:`django.contrib.auth.logout()`. + +Limiting access to logged-in users +---------------------------------- + +The raw way +~~~~~~~~~~~ + +The simple, raw way to limit access to pages is to check +:meth:`request.user.is_authenticated() +<django.contrib.auth.models.User.is_authenticated()>` and either redirect to a +login page:: + + from django.http import HttpResponseRedirect + + def my_view(request): + if not request.user.is_authenticated(): + return HttpResponseRedirect('/login/?next=%s' % request.path) + # ... + +...or display an error message:: + + def my_view(request): + if not request.user.is_authenticated(): + return render_to_response('myapp/login_error.html') + # ... + +The login_required decorator +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. function:: decorators.login_required() + + As a shortcut, you can use the convenient + :func:`~django.contrib.auth.decorators.login_required` decorator:: + + from django.contrib.auth.decorators import login_required + + def my_view(request): + # ... + my_view = login_required(my_view) + + Here's an equivalent example, using the more compact decorator syntax + introduced in Python 2.4:: + + from django.contrib.auth.decorators import login_required + + @login_required + def my_view(request): + # ... + + In the Django development version, + :func:`~django.contrib.auth.decorators.login_required` also takes an + optional ``redirect_field_name`` parameter. Example:: + + from django.contrib.auth.decorators import login_required + + def my_view(request): + # ... + my_view = login_required(redirect_field_name='redirect_to')(my_view) + + Again, an equivalent example of the more compact decorator syntax + introduced in Python 2.4:: + + from django.contrib.auth.decorators import login_required + + @login_required(redirect_field_name='redirect_to') + def my_view(request): + # ... + + :func:`~django.contrib.auth.decorators.login_required` does the following: + + * If the user isn't logged in, redirect to + :setting:`settings.LOGIN_URL <LOGIN_URL>` (``/accounts/login/`` by + default), passing the current absolute URL in the query string as + ``next`` or the value of ``redirect_field_name``. For example: + ``/accounts/login/?next=/polls/3/``. + + * If the user is logged in, execute the view normally. The view code + is free to assume the user is logged in. + +Note that you'll need to map the appropriate Django view to +:setting:`settings.LOGIN_URL <LOGIN_URL>`. For example, using the defaults, add +the following line to your URLconf:: + + (r'^accounts/login/$', 'django.contrib.auth.views.login'), + +.. function:: views.login() + + Here's what ``django.contrib.auth.views.login`` does: + + * If called via ``GET``, it displays a login form that POSTs to the same + URL. More on this in a bit. + + * If called via ``POST``, it tries to log the user in. If login is + successful, the view redirects to the URL specified in ``next``. If + ``next`` isn't provided, it redirects to :setting:`settings.LOGIN_REDIRECT_URL <LOGIN_REDIRECT_URL>` + (which defaults to ``/accounts/profile/``). If login isn't successful, + it redisplays the login form. + + It's your responsibility to provide the login form in a template called + ``registration/login.html`` by default. This template gets passed three + template context variables: + + * ``form``: A :class:`~django.forms.Form` object representing the + login form. See the :ref:`forms documentation <topics-forms-index>` + for more on ``FormWrapper`` objects. + + * ``next``: The URL to redirect to after successful login. This may contain + a query string, too. + + * ``site_name``: The name of the current + :class:`~django.contrib.sites.models.Site``, according to the + :setting:`SITE_ID` setting. If you're using the Django development version + and you don't have the site framework installed, this will be set to the + value of ``request.META['SERVER_NAME']``. For more on sites, see + :ref:`ref-contrib-sites`. + + If you'd prefer not to call the template :file:`registration/login.html`, + you can pass the ``template_name`` parameter via the extra arguments to + the view in your URLconf. For example, this URLconf line would use + :file:`myapp/login.html` instead:: + + (r'^accounts/login/$', 'django.contrib.auth.views.login', {'template_name': 'myapp/login.html'}), + + Here's a sample :file:`registration/login.html` template you can use as a + starting point. It assumes you have a :file:`base.html` template that + defines a ``content`` block:: + + {% extends "base.html" %} + + {% block content %} + + {% if form.errors %} + <p>Your username and password didn't match. Please try again.</p> + {% endif %} + + <form method="post" action="."> + <table> + <tr><td>{{ form.username.label_tag }}</td><td>{{ form.username }}</td></tr> + <tr><td>{{ form.password.label_tag }}</td><td>{{ form.password }}</td></tr> + </table> + + <input type="submit" value="login" /> + <input type="hidden" name="next" value="{{ next }}" /> + </form> + + {% endblock %} + + .. _forms documentation: ../forms/ + .. _site framework docs: ../sites/ + +Other built-in views +-------------------- + +In addition to the ``login`` view, the authentication system includes a +few other useful built-in views: + +.. function:: django.contrib.auth.views.logout + + Logs a user out. + + **Optional arguments:** + + * ``template_name``: The full name of a template to display after + logging the user out. This will default to + :file:`registration/logged_out.html` if no argument is supplied. + + **Template context:** + + * ``title``: The string "Logged out", localized. + +.. function:: django.contrib.auth.views.logout_then_login + + Logs a user out, then redirects to the login page. + + **Optional arguments:** + + * ``login_url``: The URL of the login page to redirect to. This + will default to :setting:`settings.LOGIN_URL <LOGIN_URL>` if not + supplied. + +.. function:: django.contrib.auth.views.password_change + + Allows a user to change their password. + + **Optional arguments:** + + * ``template_name``: The full name of a template to use for + displaying the password change form. This will default to + :file:`registration/password_change_form.html` if not supplied. + + **Template context:** + + * ``form``: The password change form. + +.. function:: django.contrib.auth.views.password_change_done + + The page shown after a user has changed their password. + + **Optional arguments:** + + * ``template_name``: The full name of a template to use. This will + default to :file:`registration/password_change_done.html` if not + supplied. + +.. function:: django.contrib.auth.views.password_reset + + Allows a user to reset their password, and sends them the new password + in an e-mail. + + **Optional arguments:** + + * ``template_name``: The full name of a template to use for + displaying the password reset form. This will default to + :file:`registration/password_reset_form.html` if not supplied. + + * ``email_template_name``: The full name of a template to use for + generating the e-mail with the new password. This will default to + :file:`registration/password_reset_email.html` if not supplied. + + **Template context:** + + * ``form``: The form for resetting the user's password. + +.. function:: django.contrib.auth.views.password_reset_done + + The page shown after a user has reset their password. + + **Optional arguments:** + + * ``template_name``: The full name of a template to use. This will + default to :file:`registration/password_reset_done.html` if not + supplied. + +.. function:: django.contrib.auth.views.redirect_to_login + + Redirects to the login page, and then back to another URL after a + successful login. + + **Required arguments:** + + * ``next``: The URL to redirect to after a successful login. + + **Optional arguments:** + + * ``login_url``: The URL of the login page to redirect to. This + will default to :setting:`settings.LOGIN_URL <LOGIN_URL>` if not + supplied. + +Built-in forms +--------------------- + +If you don't want to use the built-in views, but want the convenience +of not having to write forms for this functionality, the authentication +system provides several built-in forms: + + * :class:`django.contrib.auth.forms.AdminPasswordChangeForm`: A form used + in the admin interface to change a user's password. + + * :class:`django.contrib.auth.forms.AuthenticationForm`: A form for + logging a user in. + + * :class:`django.contrib.auth.forms.PasswordChangeForm`: A form for + allowing a user to change their password. + + * :class:`django.contrib.auth.forms.PasswordResetForm`: A form for + resetting a user's password and e-mailing the new password to them. + + * :class:`django.contrib.auth.forms.UserCreationForm`: A form for creating + a new user. + +Limiting access to logged-in users that pass a test +--------------------------------------------------- + +To limit access based on certain permissions or some other test, you'd do +essentially the same thing as described in the previous section. + +The simple way is to run your test on +:attr:`request.user <django.http.HttpRequest.user>` in the view directly. +For example, this view checks to make sure the user is logged in and has the +permission ``polls.can_vote``:: + + def my_view(request): + if not (request.user.is_authenticated() and request.user.has_perm('polls.can_vote')): + return HttpResponse("You can't vote in this poll.") + # ... + +.. function:: decorators.user_passes_test() + + As a shortcut, you can use the convenient ``user_passes_test`` decorator:: + + from django.contrib.auth.decorators import user_passes_test + + def my_view(request): + # ... + my_view = user_passes_test(lambda u: u.has_perm('polls.can_vote'))(my_view) + + We're using this particular test as a relatively simple example. However, + if you just want to test whether a permission is available to a user, you + can use the :func:`django.contrib.auth.decorators.permission_required()` + decorator, described later in this document. + + Here's the same thing, using Python 2.4's decorator syntax:: + + from django.contrib.auth.decorators import user_passes_test + + @user_passes_test(lambda u: u.has_perm('polls.can_vote')) + def my_view(request): + # ... + + :func:`~django.contrib.auth.decorators.user_passes_test` takes a required + argument: a callable that takes a + :class:`~django.contrib.auth.models.User` object and returns ``True`` if + the user is allowed to view the page. Note that + :func:`~django.contrib.auth.decorators.user_passes_test` does not + automatically check that the :class:`~django.contrib.auth.models.User` is + not anonymous. + + :func:`~django.contrib.auth.decorators.user_passes_test()` takes an + optional ``login_url`` argument, which lets you specify the URL for your + login page (:setting:`settings.LOGIN_URL <LOGIN_URL>` by default). + + Example in Python 2.3 syntax:: + + from django.contrib.auth.decorators import user_passes_test + + def my_view(request): + # ... + my_view = user_passes_test(lambda u: u.has_perm('polls.can_vote'), login_url='/login/')(my_view) + + Example in Python 2.4 syntax:: + + from django.contrib.auth.decorators import user_passes_test + + @user_passes_test(lambda u: u.has_perm('polls.can_vote'), login_url='/login/') + def my_view(request): + # ... + +The permission_required decorator +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. function:: decorators.permission_required() + + It's a relatively common task to check whether a user has a particular + permission. For that reason, Django provides a shortcut for that case: the + :func:`~django.contrib.auth.decorators.permission_required()` decorator. + Using this decorator, the earlier example can be written as:: + + from django.contrib.auth.decorators import permission_required + + def my_view(request): + # ... + my_view = permission_required('polls.can_vote')(my_view) + + Note that :func:`~django.contrib.auth.decorators.permission_required()` + also takes an optional ``login_url`` parameter. Example:: + + from django.contrib.auth.decorators import permission_required + + def my_view(request): + # ... + my_view = permission_required('polls.can_vote', login_url='/loginpage/')(my_view) + + As in the ``login_required`` decorator, ``login_url`` defaults to + :setting:`settings.LOGIN_URL <LOGIN_URL>`. + +Limiting access to generic views +-------------------------------- + +To limit access to a :ref:`generic view <ref-generic-views>`, write a thin +wrapper around the view, and point your URLconf to your wrapper instead of the +generic view itself. For example:: + + from django.views.generic.date_based import object_detail + + @login_required + def limited_object_detail(*args, **kwargs): + return object_detail(*args, **kwargs) + +Permissions +=========== + +Django comes with a simple permissions system. It provides a way to assign +permissions to specific users and groups of users. + +It's used by the Django admin site, but you're welcome to use it in your own +code. + +The Django admin site uses permissions as follows: + + * Access to view the "add" form and add an object is limited to users with + the "add" permission for that type of object. + * Access to view the change list, view the "change" form and change an + object is limited to users with the "change" permission for that type of + object. + * Access to delete an object is limited to users with the "delete" + permission for that type of object. + +Permissions are set globally per type of object, not per specific object +instance. For example, it's possible to say "Mary may change news stories," but +it's not currently possible to say "Mary may change news stories, but only the +ones she created herself" or "Mary may only change news stories that have a +certain status, publication date or ID." The latter functionality is something +Django developers are currently discussing. + +Default permissions +------------------- + +When ``django.contrib.auth`` is listed in your :setting:`INSTALLED_APPS` +setting, it will ensure that three default permissions -- add, change +and delete -- are created for each Django model defined in one of your +installed applications. + +These permissions will be created when you run +:djadmin:`manage.py syncdb <syncdb>`; the first time you run ``syncdb`` after +adding ``django.contrib.auth`` to :setting:`INSTALLED_APPS`, the default +permissions will be created for all previously-installed models, as well as +for any new models being installed at that time. Afterward, it will create +default permissions for new models each time you run +:djadmin:`manage.py syncdb <syncdb>`. + +.. _custom-permissions: + +Custom permissions +------------------ + +To create custom permissions for a given model object, use the ``permissions`` +:ref:`model Meta attribute <meta-options>`. + +This example model creates three custom permissions:: + + class USCitizen(models.Model): + # ... + class Meta: + permissions = ( + ("can_drive", "Can drive"), + ("can_vote", "Can vote in elections"), + ("can_drink", "Can drink alcohol"), + ) + +The only thing this does is create those extra permissions when you run +:djadmin:`manage.py syncdb <syncdb>`. + +API reference +------------- + +.. class:: models.Permission + + Just like users, permissions are implemented in a Django model that lives in + `django/contrib/auth/models.py`_. + +.. _django/contrib/auth/models.py: http://code.djangoproject.com/browser/django/trunk/django/contrib/auth/models.py + +Fields +~~~~~~ + +:class:`~django.contrib.auth.models.Permission` objects have the following +fields: + +.. attribute:: models.Permission.name + + Required. 50 characters or fewer. Example: ``'Can vote'``. + +.. attribute:: models.Permission.content_type + + Required. A reference to the ``django_content_type`` database table, + which contains a record for each installed Django model. + +.. attribute:: models.Permission.codename + + Required. 100 characters or fewer. Example: ``'can_vote'``. + +Methods +~~~~~~~ + +:class:`~django.contrib.auth.models.Permission` objects have the standard +data-access methods like any other :ref:`Django model <ref-models-instances>`. + +Authentication data in templates +================================ + +The currently logged-in user and his/her permissions are made available in the +:ref:`template context <ref-templates-api>` when you use +:class:`~django.template.context.RequestContext`. + +.. admonition:: Technicality + + Technically, these variables are only made available in the template context + if you use :class:`~django.template.context.RequestContext` *and* your + :setting:`TEMPLATE_CONTEXT_PROCESSORS` setting contains + ``"django.core.context_processors.auth"``, which is default. For more, see + the :ref:`RequestContext docs <subclassing-context-requestcontext>`. + +Users +----- + +The currently logged-in user, either a +:class:`~django.contrib.auth.models.User` instance or an +:class:`~django.contrib.auth.models.AnonymousUser` instance, is stored in the +template variable ``{{ user }}``:: + + {% if user.is_authenticated %} + <p>Welcome, {{ user.username }}. Thanks for logging in.</p> + {% else %} + <p>Welcome, new user. Please log in.</p> + {% endif %} + +Permissions +----------- + +The currently logged-in user's permissions are stored in the template variable +``{{ perms }}``. This is an instance of +:class:`django.core.context_processors.PermWrapper`, which is a +template-friendly proxy of permissions. + +In the ``{{ perms }}`` object, single-attribute lookup is a proxy to +:meth:`User.has_module_perms <django.contrib.auth.models.User.has_module_perms>`. +This example would display ``True`` if the logged-in user had any permissions +in the ``foo`` app:: + + {{ perms.foo }} + +Two-level-attribute lookup is a proxy to +:meth:`User.has_perm <django.contrib.auth.models.User.has_perm>`. This example +would display ``True`` if the logged-in user had the permission +``foo.can_vote``:: + + {{ perms.foo.can_vote }} + +Thus, you can check permissions in template ``{% if %}`` statements:: + + {% if perms.foo %} + <p>You have permission to do something in the foo app.</p> + {% if perms.foo.can_vote %} + <p>You can vote!</p> + {% endif %} + {% if perms.foo.can_drive %} + <p>You can drive!</p> + {% endif %} + {% else %} + <p>You don't have permission to do anything in the foo app.</p> + {% endif %} + +Groups +====== + +Groups are a generic way of categorizing users so you can apply permissions, or +some other label, to those users. A user can belong to any number of groups. + +A user in a group automatically has the permissions granted to that group. For +example, if the group ``Site editors`` has the permission +``can_edit_home_page``, any user in that group will have that permission. + +Beyond permissions, groups are a convenient way to categorize users to give +them some label, or extended functionality. For example, you could create a +group ``'Special users'``, and you could write code that could, say, give them +access to a members-only portion of your site, or send them members-only e-mail +messages. + +Messages +======== + +The message system is a lightweight way to queue messages for given users. + +A message is associated with a :class:`~django.contrib.auth.models.User`. +There's no concept of expiration or timestamps. + +Messages are used by the Django admin after successful actions. For example, +``"The poll Foo was created successfully."`` is a message. + +The API is simple: + +.. method:: models.User.message_set.create(message) + + To create a new message, use + ``user_obj.message_set.create(message='message_text')``. + + To retrieve/delete messages, use + :meth:`user_obj.get_and_delete_messages() <django.contrib.auth.models.User.get_and_delete_messages>`, + which returns a list of ``Message`` objects in the user's queue (if any) + and deletes the messages from the queue. + +In this example view, the system saves a message for the user after creating +a playlist:: + + def create_playlist(request, songs): + # Create the playlist with the given songs. + # ... + request.user.message_set.create(message="Your playlist was added successfully.") + return render_to_response("playlists/create.html", + context_instance=RequestContext(request)) + +When you use :class:`~django.template.context.RequestContext`, the currently +logged-in user and his/her messages are made available in the +:ref:`template context <ref-templates-api>` as the template variable +``{{ messages }}``. Here's an example of template code that displays messages:: + + {% if messages %} + <ul> + {% for message in messages %} + <li>{{ message }}</li> + {% endfor %} + </ul> + {% endif %} + +Note that :class:`~django.template.context.RequestContext` calls +:meth:`~django.contrib.auth.models.User.get_and_delete_messages` behind the +scenes, so any messages will be deleted even if you don't display them. + +Finally, note that this messages framework only works with users in the user +database. To send messages to anonymous users, use the +:ref:`session framework <topics-http-sessions>`. + +.. _authentication-backends: + +Other authentication sources +============================ + +The authentication that comes with Django is good enough for most common cases, +but you may have the need to hook into another authentication source -- that +is, another source of usernames and passwords or authentication methods. + +For example, your company may already have an LDAP setup that stores a username +and password for every employee. It'd be a hassle for both the network +administrator and the users themselves if users had separate accounts in LDAP +and the Django-based applications. + +So, to handle situations like this, the Django authentication system lets you +plug in another authentication sources. You can override Django's default +database-based scheme, or you can use the default system in tandem with other +systems. + +Specifying authentication backends +---------------------------------- + +Behind the scenes, Django maintains a list of "authentication backends" that it +checks for authentication. When somebody calls +:func:`django.contrib.auth.authenticate()` -- as described in "How to log a +user in" above -- Django tries authenticating across all of its authentication +backends. If the first authentication method fails, Django tries the second +one, and so on, until all backends have been attempted. + +The list of authentication backends to use is specified in the +:setting:`AUTHENTICATION_BACKENDS` setting. This should be a tuple of Python +path names that point to Python classes that know how to authenticate. These +classes can be anywhere on your Python path. + +By default, :setting:`AUTHENTICATION_BACKENDS` is set to:: + + ('django.contrib.auth.backends.ModelBackend',) + +That's the basic authentication scheme that checks the Django users database. + +The order of :setting:`AUTHENTICATION_BACKENDS` matters, so if the same username +and password is valid in multiple backends, Django will stop processing at the +first positive match. + +Writing an authentication backend +--------------------------------- + +An authentication backend is a class that implements two methods: +``get_user(user_id)`` and ``authenticate(**credentials)``. + +The ``get_user`` method takes a ``user_id`` -- which could be a username, +database ID or whatever -- and returns a ``User`` object. + +The ``authenticate`` method takes credentials as keyword arguments. Most of +the time, it'll just look like this:: + + class MyBackend: + def authenticate(self, username=None, password=None): + # Check the username/password and return a User. + +But it could also authenticate a token, like so:: + + class MyBackend: + def authenticate(self, token=None): + # Check the token and return a User. + +Either way, ``authenticate`` should check the credentials it gets, and it +should return a ``User`` object that matches those credentials, if the +credentials are valid. If they're not valid, it should return ``None``. + +The Django admin system is tightly coupled to the Django ``User`` object +described at the beginning of this document. For now, the best way to deal with +this is to create a Django ``User`` object for each user that exists for your +backend (e.g., in your LDAP directory, your external SQL database, etc.) You +can either write a script to do this in advance, or your ``authenticate`` +method can do it the first time a user logs in. + +Here's an example backend that authenticates against a username and password +variable defined in your ``settings.py`` file and creates a Django ``User`` +object the first time a user authenticates:: + + from django.conf import settings + from django.contrib.auth.models import User, check_password + + class SettingsBackend: + """ + Authenticate against the settings ADMIN_LOGIN and ADMIN_PASSWORD. + + Use the login name, and a hash of the password. For example: + + ADMIN_LOGIN = 'admin' + ADMIN_PASSWORD = 'sha1$4e987$afbcf42e21bd417fb71db8c66b321e9fc33051de' + """ + def authenticate(self, username=None, password=None): + login_valid = (settings.ADMIN_LOGIN == username) + pwd_valid = check_password(password, settings.ADMIN_PASSWORD) + if login_valid and pwd_valid: + try: + user = User.objects.get(username=username) + except User.DoesNotExist: + # Create a new user. Note that we can set password + # to anything, because it won't be checked; the password + # from settings.py will. + user = User(username=username, password='get from settings.py') + user.is_staff = True + user.is_superuser = True + user.save() + return user + return None + + def get_user(self, user_id): + try: + return User.objects.get(pk=user_id) + except User.DoesNotExist: + return None + +Handling authorization in custom backends +----------------------------------------- + +Custom auth backends can provide their own permissions. + +The user model will delegate permission lookup functions +(:meth:`~django.contrib.auth.models.User.get_group_permissions()`, +:meth:`~django.contrib.auth.models.User.get_all_permissions()`, +:meth:`~django.contrib.auth.models.User.has_perm()`, and +:meth:`~django.contrib.auth.models.User.has_module_perms()`) to any +authentication backend that implements these functions. + +The permissions given to the user will be the superset of all permissions +returned by all backends. That is, Django grants a permission to a user that +any one backend grants. + +The simple backend above could implement permissions for the magic admin +fairly simply:: + + class SettingsBackend: + + # ... + + def has_perm(self, user_obj, perm): + if user_obj.username == settings.ADMIN_LOGIN: + return True + else: + return False + +This gives full permissions to the user granted access in the above example. +Notice that the backend auth functions all take the user object as an argument, +and they also accept the same arguments given to the associated +:class:`django.contrib.auth.models.User` functions. + +A full authorization implementation can be found in +`django/contrib/auth/backends.py`_, which is the default backend and queries +the ``auth_permission`` table most of the time. + +.. _django/contrib/auth/backends.py: http://code.djangoproject.com/browser/django/trunk/django/contrib/auth/backends.py diff --git a/docs/cache.txt b/docs/topics/cache.txt similarity index 98% rename from docs/cache.txt rename to docs/topics/cache.txt index 1a7e63d720..f2eb17d930 100644 --- a/docs/cache.txt +++ b/docs/topics/cache.txt @@ -1,8 +1,10 @@ +.. _topics-cache: + ======================== Django's cache framework ======================== -A fundamental tradeoff in dynamic Web sites is, well, they're dynamic. Each +A fundamental trade-off in dynamic Web sites is, well, they're dynamic. Each time a user requests a page, the Web server makes all sorts of calculations -- from database queries to template rendering to business logic -- to create the page that your site's visitor sees. This is a lot more expensive, from a @@ -158,6 +160,11 @@ cache is multi-process and thread-safe. To use it, set ``CACHE_BACKEND`` to ``"locmem:///"``. For example:: CACHE_BACKEND = 'locmem:///' + +Note that each process will have its own private cache instance, which means no +cross-process caching is possible. This obviously also means the local memory +cache isn't particularly memory-efficient, so it's probably not a good choice +for production environments. Dummy caching (for development) ------------------------------- @@ -179,7 +186,7 @@ Using a custom cache backend **New in Django development version** While Django includes support for a number of cache backends out-of-the-box, -sometimes you will want to use a customised verison or your own backend. To +sometimes you will want to use a customised version or your own backend. To use an external cache backend with Django, use a Python import path as the scheme portion (the part before the initial colon) of the ``CACHE_BACKEND`` URI, like so:: @@ -194,6 +201,7 @@ Note: Without a really compelling reason, like a host that doesn't support the them, you should stick to the cache backends included with Django. They've been really well-tested and are quite easy to use. + CACHE_BACKEND arguments ----------------------- @@ -280,9 +288,7 @@ Additionally, the cache middleware automatically sets a few headers in each * Sets the ``Cache-Control`` header to give a max age for the page -- again, from the ``CACHE_MIDDLEWARE_SECONDS`` setting. -See the `middleware documentation`_ for more on middleware. - -.. _`middleware documentation`: ../middleware/ +See :ref:`topics-http-middleware` for more on middleware. **New in Django development version** diff --git a/docs/topics/db/index.txt b/docs/topics/db/index.txt new file mode 100644 index 0000000000..83e84d7196 --- /dev/null +++ b/docs/topics/db/index.txt @@ -0,0 +1,17 @@ +.. _topics-db-index: + +Models and databases +==================== + +A model is the single, definitive source of data about your data. It contains +the essential fields and behaviors of the data you're storing. Generally, each +model maps to a single database table. + +.. toctree:: + :maxdepth: 1 + + models + queries + managers + sql + transactions diff --git a/docs/topics/db/managers.txt b/docs/topics/db/managers.txt new file mode 100644 index 0000000000..dabe0d6a0b --- /dev/null +++ b/docs/topics/db/managers.txt @@ -0,0 +1,191 @@ +.. _topics-db-managers: + +======== +Managers +======== + +.. currentmodule:: django.db.models + +.. class:: Manager() + +A ``Manager`` is the interface through which database query operations are +provided to Django models. At least one ``Manager`` exists for every model in +a Django application. + +The way ``Manager`` classes work is documented :ref:`topics-db-queries`; this +document specifically touches on model options that customize ``Manager`` +behavior. + +Manager names +============= + +By default, Django adds a ``Manager`` with the name ``objects`` to every Django +model class. However, if you want to use ``objects`` as a field name, or if you +want to use a name other than ``objects`` for the ``Manager``, you can rename +it on a per-model basis. To rename the ``Manager`` for a given class, define a +class attribute of type ``models.Manager()`` on that model. For example:: + + from django.db import models + + class Person(models.Model): + #... + people = models.Manager() + +Using this example model, ``Person.objects`` will generate an +``AttributeError`` exception, but ``Person.people.all()`` will provide a list +of all ``Person`` objects. + +.. _custom-managers: + +Custom Managers +=============== + +You can use a custom ``Manager`` in a particular model by extending the base +``Manager`` class and instantiating your custom ``Manager`` in your model. + +There are two reasons you might want to customize a ``Manager``: to add extra +``Manager`` methods, and/or to modify the initial ``QuerySet`` the ``Manager`` +returns. + +Adding extra Manager methods +---------------------------- + +Adding extra ``Manager`` methods is the preferred way to add "table-level" +functionality to your models. (For "row-level" functionality -- i.e., functions +that act on a single instance of a model object -- use :ref:`Model methods +<model-methods>`, not custom ``Manager`` methods.) + +A custom ``Manager`` method can return anything you want. It doesn't have to +return a ``QuerySet``. + +For example, this custom ``Manager`` offers a method ``with_counts()``, which +returns a list of all ``OpinionPoll`` objects, each with an extra +``num_responses`` attribute that is the result of an aggregate query:: + + class PollManager(models.Manager): + def with_counts(self): + from django.db import connection + cursor = connection.cursor() + cursor.execute(""" + SELECT p.id, p.question, p.poll_date, COUNT(*) + FROM polls_opinionpoll p, polls_response r + WHERE p.id = r.poll_id + GROUP BY 1, 2, 3 + ORDER BY 3 DESC""") + result_list = [] + for row in cursor.fetchall(): + p = self.model(id=row[0], question=row[1], poll_date=row[2]) + p.num_responses = row[3] + result_list.append(p) + return result_list + + class OpinionPoll(models.Model): + question = models.CharField(max_length=200) + poll_date = models.DateField() + objects = PollManager() + + class Response(models.Model): + poll = models.ForeignKey(Poll) + person_name = models.CharField(max_length=50) + response = models.TextField() + +With this example, you'd use ``OpinionPoll.objects.with_counts()`` to return +that list of ``OpinionPoll`` objects with ``num_responses`` attributes. + +Another thing to note about this example is that ``Manager`` methods can +access ``self.model`` to get the model class to which they're attached. + +Modifying initial Manager QuerySets +----------------------------------- + +A ``Manager``'s base ``QuerySet`` returns all objects in the system. For +example, using this model:: + + class Book(models.Model): + title = models.CharField(max_length=100) + author = models.CharField(max_length=50) + +...the statement ``Book.objects.all()`` will return all books in the database. + +You can override a ``Manager``\'s base ``QuerySet`` by overriding the +``Manager.get_query_set()`` method. ``get_query_set()`` should return a +``QuerySet`` with the properties you require. + +For example, the following model has *two* ``Manager``\s -- one that returns +all objects, and one that returns only the books by Roald Dahl:: + + # First, define the Manager subclass. + class DahlBookManager(models.Manager): + def get_query_set(self): + return super(DahlBookManager, self).get_query_set().filter(author='Roald Dahl') + + # Then hook it into the Book model explicitly. + class Book(models.Model): + title = models.CharField(max_length=100) + author = models.CharField(max_length=50) + + objects = models.Manager() # The default manager. + dahl_objects = DahlBookManager() # The Dahl-specific manager. + +With this sample model, ``Book.objects.all()`` will return all books in the +database, but ``Book.dahl_objects.all()`` will only return the ones written by +Roald Dahl. + +Of course, because ``get_query_set()`` returns a ``QuerySet`` object, you can +use ``filter()``, ``exclude()`` and all the other ``QuerySet`` methods on it. +So these statements are all legal:: + + Book.dahl_objects.all() + Book.dahl_objects.filter(title='Matilda') + Book.dahl_objects.count() + +This example also pointed out another interesting technique: using multiple +managers on the same model. You can attach as many ``Manager()`` instances to +a model as you'd like. This is an easy way to define common "filters" for your +models. + +For example:: + + class MaleManager(models.Manager): + def get_query_set(self): + return super(MaleManager, self).get_query_set().filter(sex='M') + + class FemaleManager(models.Manager): + def get_query_set(self): + return super(FemaleManager, self).get_query_set().filter(sex='F') + + class Person(models.Model): + first_name = models.CharField(max_length=50) + last_name = models.CharField(max_length=50) + sex = models.CharField(max_length=1, choices=(('M', 'Male'), ('F', 'Female'))) + people = models.Manager() + men = MaleManager() + women = FemaleManager() + +This example allows you to request ``Person.men.all()``, ``Person.women.all()``, +and ``Person.people.all()``, yielding predictable results. + +If you use custom ``Manager`` objects, take note that the first +``Manager`` Django encounters (in the order in which they're defined +in the model) has a special status. Django interprets this first +``Manager`` defined in a class as the "default" ``Manager``, and +several parts of Django (though not the admin application) will use +that ``Manager`` exclusively for that model. As a result, it's often a +good idea to be careful in your choice of default manager, in order to +avoid a situation where overriding of ``get_query_set()`` results in +an inability to retrieve objects you'd like to work with. + +Using managers for related object access +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +By default, Django uses a "bare" (i.e. default) manager when accessing related +objects (i.e. ``choice.poll``). If this default isn't appropriate for your +default manager, you can force Django to use a custom manager for related object +attributes by giving it a ``use_for_related_fields`` property:: + + class MyManager(models.Manager):: + use_for_related_fields = True + ... + + + ... diff --git a/docs/topics/db/models.txt b/docs/topics/db/models.txt new file mode 100644 index 0000000000..17874364ca --- /dev/null +++ b/docs/topics/db/models.txt @@ -0,0 +1,746 @@ +.. _topics-db-models: + +============== +Writing models +============== + +.. module:: django.db.models + +A model is the single, definitive source of data about your data. It contains +the essential fields and behaviors of the data you're storing. Generally, each +model maps to a single database table. + +The basics: + + * Each model is a Python class that subclasses + :class:`django.db.models.Model`. + + * Each attribute of the model represents a database field. + + * With all of this, Django gives you an automatically-generated + database-access API; see :ref:`topics-db-queries`. + +.. seealso:: + + A companion to this document is the `official repository of model + examples`_. (In the Django source distribution, these examples are in the + ``tests/modeltests`` directory.) + + .. _official repository of model examples: http://www.djangoproject.com/documentation/models/ + +Quick example +============= + +This example model defines a ``Person``, which has a ``first_name`` and +``last_name``:: + + from django.db import models + + class Person(models.Model): + first_name = models.CharField(max_length=30) + last_name = models.CharField(max_length=30) + +``first_name`` and ``last_name`` are :term:`fields <field>` of the model. Each +field is specified as a class attribute, and each attribute maps to a database +column. + +The above ``Person`` model would create a database table like this: + +.. code-block:: sql + + CREATE TABLE myapp_person ( + "id" serial NOT NULL PRIMARY KEY, + "first_name" varchar(30) NOT NULL, + "last_name" varchar(30) NOT NULL + ); + +Some technical notes: + + * The name of the table, ``myapp_person``, is automatically derived from + some model metadata but can be overridden. See :ref:`table-names` for more + details.. + + * An ``id`` field is added automatically, but this behavior can be + overridden. See :ref:`automatic-primary-key-fields`. + + * The ``CREATE TABLE`` SQL in this example is formatted using PostgreSQL + syntax, but it's worth noting Django uses SQL tailored to the database + backend specified in your :ref:`settings file <topics-settings>`. + +Using models +============ + +Once you have defined your models, you need to tell Django you're going to *use* +those models. Do this by editing your settings file and changing the +:setting:`INSTALLED_APPS` setting to add the name of the module that contains +your ``models.py``. + +For example, if the models for your application live in the module +``mysite.myapp.models`` (the package structure that is created for an +application by the :djadmin:`manage.py startapp <startapp>` script), +:setting:`INSTALLED_APPS` should read, in part:: + + INSTALLED_APPS = ( + #... + 'mysite.myapp', + #... + ) + +When you add new apps to :setting:`INSTALLED_APPS`, be sure to run +:djadmin:`manage.py syncdb <syncdb>`. + +Fields +====== + +The most important part of a model -- and the only required part of a model -- +is the list of database fields it defines. Fields are specified by class +attributes. + +Example:: + + class Musician(models.Model): + first_name = models.CharField(max_length=50) + last_name = models.CharField(max_length=50) + instrument = models.CharField(max_length=100) + + class Album(models.Model): + artist = models.ForeignKey(Musician) + name = models.CharField(max_length=100) + release_date = models.DateField() + num_stars = models.IntegerField() + +Field types +----------- + +Each field in your model should be an instance of the appropriate +:class:`~django.db.models.Field` class. Django uses the field class types to +determine a few things: + + * The database column type (e.g. ``INTEGER``, ``VARCHAR``). + + * The widget to use in Django's admin interface, if you care to use it + (e.g. ``<input type="text">``, ``<select>``). + + * The minimal validation requirements, used in Django's admin and in + automatically-generated forms. + +Django ships with dozens of built-in field types; you can find the complete list +in the :ref:`model field reference <model-field-types>`. You can easily write +your own fields if Django's built-in ones don't do the trick; see +:ref:`howto-custom-model-fields`. + +Field options +------------- + +Each field takes a certain set of field-specific arguments (documented in the +:ref:`model field reference <model-field-types>`). For example, +:class:`~django.db.models.CharField` (and its subclasses) require a +:attr:`~django.db.models.CharField.max_length` argument which specifies the size +of the ``VARCHAR`` database field used to store the data. + +There's also a set of common arguments available to all field types. All are +optional. They're fully explained in the :ref:`reference +<common-model-field-options>`, but here's a quick summary of the most often-used +ones: + + :attr:`~Field.null` + If ``True``, Django will store empty values as ``NULL`` in the database. + Default is ``False``. + + :attr:`~ieldblank` + + If ``True``, the field is allowed to be blank. Default is ``False``. + + Note that this is different than :attr:`~Field.null`. + :attr:`~Field.null` is purely database-related, whereas + :attr:`~Field.blank` is validation-related. If a field has + :attr:`blank=True <Field.blank>`, validation on Django's admin site will + allow entry of an empty value. If a field has :attr:`blank=False + <Field.blank>`, the field will be required. + + :attr:`~Field.choices` + + An iterable (e.g., a list or tuple) of 2-tuples to use as choices for + this field. If this is given, Django's admin will use a select box + instead of the standard text field and will limit choices to the choices + given. + + A choices list looks like this:: + + YEAR_IN_SCHOOL_CHOICES = ( + ('FR', 'Freshman'), + ('SO', 'Sophomore'), + ('JR', 'Junior'), + ('SR', 'Senior'), + ('GR', 'Graduate'), + ) + + :attr:`~Field.default` + + The default value for the field. This can be a value or a callable + object. If callable it will be called every time a new object is + created. + + :attr:`~Field.help_text` + + Extra "help" text to be displayed under the field on the object's admin + form. It's useful for documentation even if your object doesn't have an + admin form. + + :attr:`~Field.primary_key`` + + If ``True``, this field is the primary key for the model. + + If you don't specify :attr:`primary_key=True <Field.primary_key>` for + any fields in your model, Django will automatically add an + :class:`IntegerField` to hold the primary key, so you don't need to set + :attr:`primary_key=True <Field.primary_key>` on any of your fields + unless you want to override the default primary-key behavior. For more, + see :ref:`automatic-primary-key-fields`. + + :attr:`~Field.unique` + + If ``True``, this field must be unique throughout the table. + +Again, these are just short descriptions of the most common field options. Full +details can be found in the :ref:`common model field option reference +<common-model-field-options>`. + +.. _automatic-primary-key-fields: + +Automatic primary key fields +---------------------------- + +By default, Django gives each model the following field:: + + id = models.AutoField(primary_key=True) + +This is an auto-incrementing primary key. + +If you'd like to specify a custom primary key, just specify +:attr:`primary_key=True <Field.primary_key>` on one of your fields. If Django +sees you've explicitly set :attr:`Field.primary_key`, it won't add the automatic +``id`` column. + +Each model requires exactly one field to have :attr:`primary_key=True +<Field.primary_key>`. + +Verbose field names +------------------- + +Each field type, except for :class:`~django.db.models.ForeignKey`, +:class:`~django.db.models.ManyToManyField` and +:class:`~django.db.models.OneToOneField`, takes an optional first positional +argument -- a verbose name. If the verbose name isn't given, Django will +automatically create it using the field's attribute name, converting underscores +to spaces. + +In this example, the verbose name is ``"Person's first name"``:: + + first_name = models.CharField("Person's first name", max_length=30) + +In this example, the verbose name is ``"first name"``:: + + first_name = models.CharField(max_length=30) + +:class:`~django.db.models.ForeignKey`, +:class:`~django.db.models.ManyToManyField` and +:class:`~django.db.models.OneToOneField` require the first argument to be a +model class, so use the :attr:`~Field.verbose_name` keyword argument:: + + poll = models.ForeignKey(Poll, verbose_name="the related poll") + sites = models.ManyToManyField(Site, verbose_name="list of sites") + place = models.OneToOneField(Place, verbose_name="related place") + +The convention is not to capitalize the first letter of the +:attr:`~Field.verbose_name`. Django will automatically capitalize the first +letter where it needs to. + +Relationships +------------- + +Clearly, the power of relational databases lies in relating tables to each +other. Django offers ways to define the three most common types of database +relationships: Many-to-one, many-to-many and one-to-one. + +Many-to-one relationships +~~~~~~~~~~~~~~~~~~~~~~~~~ + +To define a many-to-one relationship, use :class:`~django.db.models.ForeignKey`. +You use it just like any other :class:`~django.db.models.Field` type: by +including it as a class attribute of your model. + +:class:`~django.db.models.ForeignKey` requires a positional argument: the class +to which the model is related. + +For example, if a ``Car`` model has a ``Manufacturer`` -- that is, a +``Manufacturer`` makes multiple cars but each ``Car`` only has one +``Manufacturer`` -- use the following definitions:: + + class Manufacturer(models.Model): + # ... + + class Car(models.Model): + manufacturer = models.ForeignKey(Manufacturer) + # ... + +You can also create :ref:`recursive relationships <recursive-relationships>` (an +object with a many-to-one relationship to itself) and :ref:`relationsips to +models not yet defined <lazy-relationships>`; see :ref:`the model field +reference <ref-foreignkey>` for details.` + +It's suggested, but not required, that the name of a +:class:`~django.db.models.ForeignKey` field (``manufacturer`` in the example +above) be the name of the model, lowercase. You can, of course, call the field +whatever you want. For example:: + + class Car(models.Model): + company_that_makes_it = models.ForeignKey(Manufacturer) + # ... + +.. seealso:: + + See the `Many-to-one relationship model example`_ for a full example. + +.. _Many-to-one relationship model example: http://www.djangoproject.com/models/many_to_one/ + +:class:`~django.db.models.ForeignKey` fields also accept a number of extra +arguments which are explained in :ref:`the model field reference +<foreign-key-arguments>`. These options help define how the relationship should +work; all are optional. + +Many-to-many relationships +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +To define a many-to-many relationship, use +:class:`~django.db.models.ManyToManyField`. You use it just like any other +:class:`~django.db.models.Field` type: by including it as a class attribute of +your model. + +:class:`~django.db.models.ManyToManyField` requires a positional argument: the +class to which the model is related. + +For example, if a ``Pizza`` has multiple ``Topping`` objects -- that is, a +``Topping`` can be on multiple pizzas and each ``Pizza`` has multiple toppings +-- here's how you'd represent that:: + + class Topping(models.Model): + # ... + + class Pizza(models.Model): + # ... + toppings = models.ManyToManyField(Topping) + +As with :class:`~django.db.models.ForeignKey`, you can also create +:ref:`recursive relationships <recursive-relationships>` (an object with a +many-to-one relationship to itself) and :ref:`relationships to models not yet +defined <lazy-relationships>`; see :ref:`the model field reference +<ref-manytomany>` for details.` + +It's suggested, but not required, that the name of a +:class:`~django.db.models.ManyToManyField` (``toppings`` in the example above) +be a plural describing the set of related model objects. + +It doesn't matter which model gets the +:class:`~django.db.models.ManyToManyField`, but you only need it in one of the +models -- not in both. + +Generally, :class:`~django.db.models.ManyToManyField` instances should go in the +object that's going to be edited in the admin interface, if you're using +Django's admin. In the above example, ``toppings`` is in ``Pizza`` (rather than +``Topping`` having a ``pizzas`` :class:`~django.db.models.ManyToManyField` ) +because it's more natural to think about a ``Pizza`` having toppings than a +topping being on multiple pizzas. The way it's set up above, the ``Pizza`` admin +form would let users select the toppings. + +.. seealso:: + + See the `Many-to-many relationship model example`_ for a full example. + +.. _Many-to-many relationship model example: http://www.djangoproject.com/models/many_to_many/ + +:class:`~django.db.models.ManyToManyField` fields also accept a number of extra +arguments which are explained in :ref:`the model field reference +<manytomany-arguments>`. These options help define how the relationship should +work; all are optional. + +Extra fields on many-to-many relationships +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**New in Django development version** + +When you're only dealing with simple many-to-many relationships such as +mixing and matching pizzas and toppings, a standard ``ManyToManyField`` +is all you need. However, sometimes you may need to associate data with the +relationship between two models. + +For example, consider the case of an application tracking the musical groups +which musicians belong to. There is a many-to-many relationship between a person +and the groups of which they are a member, so you could use a ManyToManyField +to represent this relationship. However, there is a lot of detail about the +membership that you might want to collect, such as the date at which the person +joined the group. + +For these situations, Django allows you to specify the model that will be used +to govern the many-to-many relationship. You can then put extra fields on the +intermediate model. The intermediate model is associated with the +``ManyToManyField`` using the ``through`` argument to point to the model +that will act as an intermediary. For our musician example, the code would look +something like this:: + + class Person(models.Model): + name = models.CharField(max_length=128) + + def __unicode__(self): + return self.name + + class Group(models.Model): + name = models.CharField(max_length=128) + members = models.ManyToManyField(Person, through='Membership') + + def __unicode__(self): + return self.name + + class Membership(models.Model): + person = models.ForeignKey(Person) + group = models.ForeignKey(Group) + date_joined = models.DateField() + invite_reason = models.CharField(max_length=64) + +When you set up the intermediary model, you explicitly specify foreign +keys to the models that are involved in the ManyToMany relation. This +explicit declaration defines how the two models are related. + +There are a few restrictions on the intermediate model: + + * Your intermediate model must contain one - and *only* one - foreign key + on the target model (this would be ``Person`` in our example). If you + have more than one foreign key, a validation error will be raised. + + * Your intermediate model must contain one - and *only* one - foreign key + on the source model (this would be ``Group`` in our example). If you + have more than one foreign key, a validation error will be raised. + + * The only exception to this is a model which has a many-to-many + relationship to itself, through an intermediary model. In this + case, two foreign keys to the same model are permitted, but they + will be treated as the two (different) sides of the many-to-many + relation. + + * When defining a many-to-many relationship from a model to + itself, using an intermediary model, you *must* use + ``symmetrical=False`` (see the documentation for + ``ManyToManyField`` above). + +Now that you have set up your ``ManyToManyField`` to use your intermediary +model (Membership, in this case), you're ready to start creating some +many-to-many relationships. You do this by creating instances of the +intermediate model:: + + >>> ringo = Person.objects.create(name="Ringo Starr") + >>> paul = Person.objects.create(name="Paul McCartney") + >>> beatles = Group.objects.create(name="The Beatles") + >>> m1 = Membership(person=ringo, group=beatles, + ... date_joined=date(1962, 8, 16), + ... invite_reason= "Needed a new drummer.") + >>> m1.save() + >>> beatles.members.all() + [<Person: Ringo Starr>] + >>> ringo.group_set.all() + [<Group: The Beatles>] + >>> m2 = Membership.objects.create(person=paul, group=beatles, + ... date_joined=date(1960, 8, 1), + ... invite_reason= "Wanted to form a band.") + >>> beatles.members.all() + [<Person: Ringo Starr>, <Person: Paul McCartney>] + +Unlike normal many-to-many fields, you *can't* use ``add``, ``create``, +or assignment (i.e., ``beatles.members = [...]``) to create relationships:: + + # THIS WILL NOT WORK + >>> beatles.members.add(john) + # NEITHER WILL THIS + >>> beatles.members.create(name="George Harrison") + # AND NEITHER WILL THIS + >>> beatles.members = [john, paul, ringo, george] + +Why? You can't just create a relationship between a Person and a Group - you +need to specify all the detail for the relationship required by the +Membership table. The simple ``add``, ``create`` and assignment calls +don't provide a way to specify this extra detail. As a result, they are +disabled for many-to-many relationships that use an intermediate model. +The only way to create a many-to-many relationship with an intermediate table +is to create instances of the intermediate model. + +The ``remove`` method is disabled for similar reasons. However, the +``clear()`` method can be used to remove all many-to-many relationships +for an instance:: + + # Beatles have broken up + >>> beatles.members.clear() + +Once you have established the many-to-many relationships by creating instances +of your intermediate model, you can issue queries. Just as with normal +many-to-many relationships, you can query using the attributes of the +many-to-many-related model:: + + # Find all the groups with a member whose name starts with 'Paul' + >>> Groups.objects.filter(person__name__startswith='Paul') + [<Group: The Beatles>] + +As you are using an intermediate table, you can also query on the attributes +of the intermediate model:: + + # Find all the members of the Beatles that joined after 1 Jan 1961 + >>> Person.objects.filter( + ... group__name='The Beatles', + ... membership__date_joined__gt=date(1961,1,1)) + [<Person: Ringo Starr] + + +One-to-one relationships +------------------------ + +One-to-one relationships are very similar to many-to-one relationships. If you +define a ``OneToOneField`` on your model, instances of that model will have +access to the related object via a simple attribute of the model. + +For example:: + + class EntryDetail(models.Model): + entry = models.OneToOneField(Entry) + details = models.TextField() + + ed = EntryDetail.objects.get(id=2) + ed.entry # Returns the related Entry object. + +The difference comes in "reverse" queries. The related model in a one-to-one +relationship also has access to a ``Manager`` object, but that ``Manager`` +represents a single object, rather than a collection of objects:: + + e = Entry.objects.get(id=2) + e.entrydetail # returns the related EntryDetail object + +If no object has been assigned to this relationship, Django will raise +a ``DoesNotExist`` exception. + +Instances can be assigned to the reverse relationship in the same way as +you would assign the forward relationship:: + + e.entrydetail = ed + +Models across files +~~~~~~~~~~~~~~~~~~~ + +It's perfectly OK to relate a model to one from another app. To do this, just +import the related model at the top of the model that holds your model. Then, +just refer to the other model class wherever needed. For example:: + + from mysite.geography.models import ZipCode + + class Restaurant(models.Model): + # ... + zip_code = models.ForeignKey(ZipCode) + +Field name restrictions +----------------------- + +Django places only two restrictions on model field names: + + 1. A field name cannot be a Python reserved word, because that would result + in a Python syntax error. For example:: + + class Example(models.Model): + pass = models.IntegerField() # 'pass' is a reserved word! + + 2. A field name cannot contain more than one underscore in a row, due to + the way Django's query lookup syntax works. For example:: + + class Example(models.Model): + foo__bar = models.IntegerField() # 'foo__bar' has two underscores! + +These limitations can be worked around, though, because your field name doesn't +necessarily have to match your database column name. See the +:attr:`~Field.db_column` option. + +SQL reserved words, such as ``join``, ``where`` or ``select``, *are* allowed as +model field names, because Django escapes all database table names and column +names in every underlying SQL query. It uses the quoting syntax of your +particular database engine. + +Custom field types +------------------ + +**New in Django development version** + +If one of the existing model fields cannot be used to fit your purposes, or if +you wish to take advantage of some less common database column types, you can +create your own field class. Full coverage of creating your own fields is +provided in :ref:`howto-custom-model-fields`. + +.. _meta-options: + +Meta options +============ + +Give your model metadata by using an inner ``class Meta``, like so:: + + class Ox(models.Model): + horn_length = models.IntegerField() + + class Meta: + ordering = ["horn_length"] + verbose_name_plural = "oxen" + +Model metadata is "anything that's not a field", such as ordering options +(:attr:`~Options.ordering`), database table name (:attr:`~Options.db_table`), or +human-readable singular and plural names (:attr:`~Options.verbose_name` and +:attr:`~Options.verbose_name_plural`). None are required, and adding ``class +Meta`` to a model is completely optional. + +A complete list of all possible ``Meta`` options can be found in the :ref:`model +option reference <ref-models-options>`. + +.. _model-methods: + +Model methods +============= + +Define custom methods on a model to add custom "row-level" functionality to your +objects. Whereas :class:`~django.db.models.Manager` methods are intended to do +"table-wide" things, model methods should act on a particular model instance. + +This is a valuable technique for keeping business logic in one place -- the +model. + +For example, this model has a few custom methods:: + + class Person(models.Model): + first_name = models.CharField(max_length=50) + last_name = models.CharField(max_length=50) + birth_date = models.DateField() + address = models.CharField(max_length=100) + city = models.CharField(max_length=50) + state = models.USStateField() # Yes, this is America-centric... + + def baby_boomer_status(self): + "Returns the person's baby-boomer status." + import datetime + if datetime.date(1945, 8, 1) <= self.birth_date <= datetime.date(1964, 12, 31): + return "Baby boomer" + if self.birth_date < datetime.date(1945, 8, 1): + return "Pre-boomer" + return "Post-boomer" + + def is_midwestern(self): + "Returns True if this person is from the Midwest." + return self.state in ('IL', 'WI', 'MI', 'IN', 'OH', 'IA', 'MO') + + def _get_full_name(self): + "Returns the person's full name." + return '%s %s' % (self.first_name, self.last_name) + full_name = property(_get_full_name) + +The last method in this example is a :term:`property`. `Read more about +properties`_. + +.. _Read more about properties: http://www.python.org/download/releases/2.2/descrintro/#property + +The :ref:`model instance reference <ref-models-instances>` has a complete list +of `methods automatically given to each model <model-instance-methods>`. You can +override most of these -- see `overriding predefined model methods`_, below -- +but there are a couple that you'll almost always want to define: + + :meth:`~Model.__unicode__` + A Python "magic method" that returns a unicode "representation" of any + object. This is what Python and Django will use whenever a model + instance needs to be coerced and displayed as a plain string. Most + notably, this happens when you display an object in an interactive + console or in the admin. + + You'll always want to define this method; the default isn't very helpful + at all. + + :meth:`~Model.get_absolute_url` + This tells Django how to calculate the URL for an object. Django uses + this in its admin interface, and any time it needs to figure out a URL + for an object. + + Any object that has a URL that uniquely identifies it should define this + method. + +Overriding predefined model methods +----------------------------------- + +There's another set of :ref:`model methods <model-instance-methods>` that +encapsulate a bunch of database behavior that you'll want to customize. In +particular you'll often want to change the way :meth:`~Model.save` and +:meth:`~Model.delete` work. + +You're free to override these methods (and any other model method) to alter +behavior. + +A classic use-case for overriding the built-in methods is if you want something +to happen whenever you save an object. For example:: + + class Blog(models.Model): + name = models.CharField(max_length=100) + tagline = models.TextField() + + def save(self): + do_something() + super(Blog, self).save() # Call the "real" save() method. + do_something_else() + +You can also prevent saving:: + + class Blog(models.Model): + name = models.CharField(max_length=100) + tagline = models.TextField() + + def save(self): + if self.name == "Yoko Ono's blog": + return # Yoko shall never have her own blog! + else: + super(Blog, self).save() # Call the "real" save() method. + +It's important to remember to call the superclass method -- that's that +``super(Blog, self).save()`` business -- to ensure that the object still gets +saved into the database. If you forget to call the superclass method, the +default behavior won't happen and the database won't get touched. + +Executing custom SQL +-------------------- + +Another common pattern is writing custom SQL statements in model methods and +module-level methods. The object :class:`django.db.connection +<django.db.backends.DatabaseWrapper>` represents the current database +connection. To use it, call :meth:`connection.cursor() +<django.db.backends.DatabaseWrapper.cursor>` to get a cursor object. Then, call +``cursor.execute(sql, [params])`` to execute the SQL and +:meth:`cursor.fetchone() <django.db.backends.CursorWrapper.fetchone>` or +:meth:`cursor.fetchall() <django.db.backends.CursorWrapper.fetchall>` to return +the resulting rows. For example:: + + def my_custom_sql(self): + from django.db import connection + cursor = connection.cursor() + cursor.execute("SELECT foo FROM bar WHERE baz = %s", [self.baz]) + row = cursor.fetchone() + return row + +:class:`connection <django.db.backends.DatabaseWrapper>` and +:class:`<django.db.backends.CursorWrapper>` mostly implement the standard Python +DB-API -- see :pep:249 -- with the addition of Django's :ref:`transaction +handling <topics-db-transactions>`. If you're not familiar with the Python +DB-API, note that the SQL statement in :meth:`cursor.execute() +<django.db.backends.CursorWrapper.execute>` uses placeholders, ``"%s"``, rather +than adding parameters directly within the SQL. If you use this technique, the +underlying database library will automatically add quotes and escaping to your +parameter(s) as necessary. (Also note that Django expects the ``"%s"`` +placeholder, *not* the ``"?"`` placeholder, which is used by the SQLite Python +bindings. This is for the sake of consistency and sanity.) + +A final note: If all you want to do is a custom ``WHERE`` clause, you can use +the :meth:`~QuerySet.extra` lookup method, which lets you add custom SQL to a +query. \ No newline at end of file diff --git a/docs/topics/db/queries.txt b/docs/topics/db/queries.txt new file mode 100644 index 0000000000..4fb12624ed --- /dev/null +++ b/docs/topics/db/queries.txt @@ -0,0 +1,968 @@ +.. _topics-db-queries: + +============== +Making queries +============== + +.. currentmodule:: django.db.models + +Once you've created your :ref:`data models <topics-db-models>`, Django +automatically gives you a database-abstraction API that lets you create, +retrieve, update and delete objects. This document explains how to use this +API. Refer to the `data model reference <ref-models-index>` for full +details of all the various model lookup options. + +Throughout this guide (and in the reference), we'll refer to the following +models, which comprise a weblog application: + +.. _queryset-model-example: + +.. code-block:: python + + class Blog(models.Model): + name = models.CharField(max_length=100) + tagline = models.TextField() + + def __unicode__(self): + return self.name + + class Author(models.Model): + name = models.CharField(max_length=50) + email = models.EmailField() + + def __unicode__(self): + return self.name + + class Entry(models.Model): + blog = models.ForeignKey(Blog) + headline = models.CharField(max_length=255) + body_text = models.TextField() + pub_date = models.DateTimeField() + authors = models.ManyToManyField(Author) + + def __unicode__(self): + return self.headline + +Creating objects +================ + +To represent database-table data in Python objects, Django uses an intuitive +system: A model class represents a database table, and an instance of that +class represents a particular record in the database table. + +To create an object, instantiate it using keyword arguments to the model class, +then call ``save()`` to save it to the database. + +You import the model class from wherever it lives on the Python path, as you +may expect. (We point this out here because previous Django versions required +funky model importing.) + +Assuming models live in a file ``mysite/blog/models.py``, here's an example:: + + >>> from mysite.blog.models import Blog + >>> b = Blog(name='Beatles Blog', tagline='All the latest Beatles news.') + >>> b.save() + +This performs an ``INSERT`` SQL statement behind the scenes. Django doesn't hit +the database until you explicitly call ``save()``. + +The ``save()`` method has no return value. + +.. seealso:: + + ``save()`` takes a number of advanced options not described here. + See the documentation for ``save()`` for complete details. + + To create an object and save it all in one step see the ```create()``` + method. + +Saving changes to objects +========================= + +To save changes to an object that's already in the database, use ``save()``. + +Given a ``Blog`` instance ``b5`` that has already been saved to the database, +this example changes its name and updates its record in the database:: + + >> b5.name = 'New name' + >> b5.save() + +This performs an ``UPDATE`` SQL statement behind the scenes. Django doesn't hit +the database until you explicitly call ``save()``. + +Saving ``ForeignKey`` and ``ManyToManyField`` fields +---------------------------------------------------- + +Updating ``ForeignKey`` fields works exactly the same way as saving a normal +field; simply assign an object of the right type to the field in question:: + + >>> cheese_blog = Blog.objects.get(name="Cheddar Talk") + >>> entry.blog = cheese_blog + >>> entry.save() + +Updating a ``ManyToManyField`` works a little differently; use the ``add()`` +method on the field to add a record to the relation:: + + >> joe = Author.objects.create(name="Joe") + >> entry.authors.add(joe) + +Django will complain if you try to assign or add an object of the wrong type. + +Retrieving objects +================== + +To retrieve objects from your database, you construct a ``QuerySet`` via a +``Manager`` on your model class. + +A ``QuerySet`` represents a collection of objects from your database. It can +have zero, one or many *filters* -- criteria that narrow down the collection +based on given parameters. In SQL terms, a ``QuerySet`` equates to a ``SELECT`` +statement, and a filter is a limiting clause such as ``WHERE`` or ``LIMIT``. + +You get a ``QuerySet`` by using your model's ``Manager``. Each model has at +least one ``Manager``, and it's called ``objects`` by default. Access it +directly via the model class, like so:: + + >>> Blog.objects + <django.db.models.manager.Manager object at ...> + >>> b = Blog(name='Foo', tagline='Bar') + >>> b.objects + Traceback: + ... + AttributeError: "Manager isn't accessible via Blog instances." + +.. note:: + + ``Managers`` are accessible only via model classes, rather than from model + instances, to enforce a separation between "table-level" operations and + "record-level" operations. + +The ``Manager`` is the main source of ``QuerySets`` for a model. It acts as a +"root" ``QuerySet`` that describes all objects in the model's database table. +For example, ``Blog.objects`` is the initial ``QuerySet`` that contains all +``Blog`` objects in the database. + +Retrieving all objects +---------------------- + +The simplest way to retrieve objects from a table is to get all of them. +To do this, use the ``all()`` method on a ``Manager``:: + + >>> all_entries = Entry.objects.all() + +The ``all()`` method returns a ``QuerySet`` of all the objects in the database. + +(If ``Entry.objects`` is a ``QuerySet``, why can't we just do ``Entry.objects``? +That's because ``Entry.objects``, the root ``QuerySet``, is a special case +that cannot be evaluated. The ``all()`` method returns a ``QuerySet`` that +*can* be evaluated.) + +Retrieving specific objects with filters +---------------------------------------- + +The root ``QuerySet`` provided by the ``Manager`` describes all objects in the +database table. Usually, though, you'll need to select only a subset of the +complete set of objects. + +To create such a subset, you refine the initial ``QuerySet``, adding filter +conditions. The two most common ways to refine a ``QuerySet`` are: + + ``filter(**kwargs)`` + Returns a new ``QuerySet`` containing objects that match the given + lookup parameters. + + ``exclude(**kwargs)`` + Returns a new ``QuerySet`` containing objects that do *not* match the + given lookup parameters. + +The lookup parameters (``**kwargs`` in the above function definitions) should +be in the format described in `Field lookups`_ below. + +For example, to get a ``QuerySet`` of blog entries from the year 2006, use +``filter()`` like so:: + + Entry.objects.filter(pub_date__year=2006) + +We don't have to add an ``all()`` -- ``Entry.objects.all().filter(...)``. That +would still work, but you only need ``all()`` when you want all objects from the +root ``QuerySet``. + +.. _chaining-filters: + +Chaining filters +~~~~~~~~~~~~~~~~ + +The result of refining a ``QuerySet`` is itself a ``QuerySet``, so it's +possible to chain refinements together. For example:: + + >>> Entry.objects.filter( + ... headline__startswith='What' + ... ).exclude( + ... pub_date__gte=datetime.now() + ... ).filter( + ... pub_date__gte=datetime(2005, 1, 1) + ... ) + +This takes the initial ``QuerySet`` of all entries in the database, adds a +filter, then an exclusion, then another filter. The final result is a +``QuerySet`` containing all entries with a headline that starts with "What", +that were published between January 1, 2005, and the current day. + +.. _filtered-querysets-are-unique: + +Filtered QuerySets are unique +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Each time you refine a ``QuerySet``, you get a brand-new ``QuerySet`` that is +in no way bound to the previous ``QuerySet``. Each refinement creates a +separate and distinct ``QuerySet`` that can be stored, used and reused. + +Example:: + + >> q1 = Entry.objects.filter(headline__startswith="What") + >> q2 = q1.exclude(pub_date__gte=datetime.now()) + >> q3 = q1.filter(pub_date__gte=datetime.now()) + +These three ``QuerySets`` are separate. The first is a base ``QuerySet`` +containing all entries that contain a headline starting with "What". The second +is a subset of the first, with an additional criteria that excludes records +whose ``pub_date`` is greater than now. The third is a subset of the first, +with an additional criteria that selects only the records whose ``pub_date`` is +greater than now. The initial ``QuerySet`` (``q1``) is unaffected by the +refinement process. + +.. _querysets-are-lazy: + +QuerySets are lazy +~~~~~~~~~~~~~~~~~~ + +``QuerySets`` are lazy -- the act of creating a ``QuerySet`` doesn't involve any +database activity. You can stack filters together all day long, and Django won't +actually run the query until the ``QuerySet`` is *evaluated*. Take a look at +this example:: + + >>> q = Entry.objects.filter(headline__startswith="What") + >>> q = q.filter(pub_date__lte=datetime.now()) + >>> q = q.exclude(body_text__icontains="food") + >>> print q + +Though this looks like three database hits, in fact it hits the database only +once, at the last line (``print q``). In general, the results of a ``QuerySet`` +aren't fetched from the database until you "ask" for them. When you do, the +``QuerySet`` is *evaluated* by accessing the database. For more details on +exactly when evaluation takes place, see :ref:`when-querysets-are-evaluated`. + +Other QuerySet methods +~~~~~~~~~~~~~~~~~~~~~~ + +Most of the time you'll use ``all()``, ``filter()`` and ``exclude()`` when you +need to look up objects from the database. However, that's far from all there is; see the :ref:`QuerySet API Reference <queryset-api>` for a complete list +of all the various ``QuerySet`` methods. + +.. _limiting-querysets: + +Limiting QuerySets +------------------ + +Use Python's array-slicing syntax to limit your ``QuerySet`` to a certain +number of results. This is the equivalent of SQL's ``LIMIT`` and ``OFFSET`` +clauses. + +For example, this returns the first 5 objects (``LIMIT 5``):: + + >>> Entry.objects.all()[:5] + +This returns the sixth through tenth objects (``OFFSET 5 LIMIT 5``):: + + >>> Entry.objects.all()[5:10] + +Generally, slicing a ``QuerySet`` returns a new ``QuerySet`` -- it doesn't +evaluate the query. An exception is if you use the "step" parameter of Python +slice syntax. For example, this would actually execute the query in order to +return a list of every *second* object of the first 10:: + + >>> Entry.objects.all()[:10:2] + +To retrieve a *single* object rather than a list +(e.g. ``SELECT foo FROM bar LIMIT 1``), use a simple index instead of a +slice. For example, this returns the first ``Entry`` in the database, after +ordering entries alphabetically by headline:: + + >>> Entry.objects.order_by('headline')[0] + +This is roughly equivalent to:: + + >>> Entry.objects.order_by('headline')[0:1].get() + +Note, however, that the first of these will raise ``IndexError`` while the +second will raise ``DoesNotExist`` if no objects match the given criteria. See +``get()`` for more details. + +.. _field-lookups-intro: + +Field lookups +------------- + +Field lookups are how you specify the meat of an SQL ``WHERE`` clause. They're +specified as keyword arguments to the ``QuerySet`` methods ``filter()``, +``exclude()`` and ``get()``. + +Basic lookups keyword arguments take the form ``field__lookuptype=value``. +(That's a double-underscore). For example:: + + >>> Entry.objects.filter(pub_date__lte='2006-01-01') + +translates (roughly) into the following SQL:: + + SELECT * FROM blog_entry WHERE pub_date <= '2006-01-01'; + +.. admonition:: How this is possible + + Python has the ability to define functions that accept arbitrary name-value + arguments whose names and values are evaluated at runtime. For more + information, see `Keyword Arguments`_ in the official Python tutorial. + + .. _`Keyword Arguments`: http://docs.python.org/tut/node6.html#SECTION006720000000000000000 + +If you pass an invalid keyword argument, a lookup function will raise +``TypeError``. + +The database API supports about two dozen lookup types; a complete reference +can be found in the :ref:`field lookup reference <field-lookups>`. To give you a taste of what's available, here's some of the more common lookups +you'll probably use: + + :lookup:`exact` + An "exact" match. For example:: + + >>> Entry.objects.get(headline__exact="Man bites dog") + + World generate SQL along these lines: + + .. code-block:: sql + + SELECT ... WHERE headline = 'Man bits dog'; + + If you don't provide a lookup type -- that is, if your keyword argument + doesn't contain a double underscore -- the lookup type is assumed to be + ``exact``. + + For example, the following two statements are equivalent:: + + >>> Blog.objects.get(id__exact=14) # Explicit form + >>> Blog.objects.get(id=14) # __exact is implied + + This is for convenience, because ``exact`` lookups are the common case. + + :lookup:`iexact` + A case-insensitive match. So, the query:: + + >>> Blog.objects.get(name__iexact="beatles blog") + + Would match a ``Blog`` titled "Beatles Blog", "beatles blog", or even + "BeAtlES blOG". + + :lookup:`contains` + Case-sensitive containment test. For example:: + + Entry.objects.get(headline__contains='Lennon') + + Roughly translates to this SQL: + + .. code-block:: sql + + SELECT ... WHERE headline LIKE '%Lennon%'; + + Note this will match the headline ``'Today Lennon honored'`` but not + ``'today lennon honored'``. + + There's also a case-insensitive version, :lookup:`icontains`. + + :lookup:`startswith`, :lookup:`endswith` + Starts-with and ends-with search, respectively. There are also + case-insensitive versions called :lookup:`istartswith` and + :lookup:`iendswith`. + +Again, this only scratches the surface. A complete reference can be found in the +:ref:`field lookup reference <field-lookups>`. + +Lookups that span relationships +------------------------------- + +Django offers a powerful and intuitive way to "follow" relationships in +lookups, taking care of the SQL ``JOIN``\s for you automatically, behind the +scenes. To span a relationship, just use the field name of related fields +across models, separated by double underscores, until you get to the field you +want. + +This example retrieves all ``Entry`` objects with a ``Blog`` whose ``name`` +is ``'Beatles Blog'``:: + + >>> Entry.objects.filter(blog__name__exact='Beatles Blog') + +This spanning can be as deep as you'd like. + +It works backwards, too. To refer to a "reverse" relationship, just use the +lowercase name of the model. + +This example retrieves all ``Blog`` objects which have at least one ``Entry`` +whose ``headline`` contains ``'Lennon'``:: + + >>> Blog.objects.filter(entry__headline__contains='Lennon') + +If you are filtering across multiple relationships and one of the intermediate +models doesn't have a value that meets the filter condition, Django will treat +it as if there is an empty (all values are ``NULL``), but valid, object there. +All this means is that no error will be raised. For example, in this filter:: + + Blog.objects.filter(entry__author__name='Lennon') + +(if there was a related ``Author`` model), if there was no ``author`` +associated with an entry, it would be treated as if there was also no ``name`` +attached, rather than raising an error because of the missing ``author``. +Usually this is exactly what you want to have happen. The only case where it +might be confusing is if you are using ``isnull``. Thus:: + + Blog.objects.filter(entry__author__name__isnull=True) + +will return ``Blog`` objects that have an empty ``name`` on the ``author`` and +also those which have an empty ``author`` on the ``entry``. If you don't want +those latter objects, you could write:: + + Blog.objetcs.filter(entry__author__isnull=False, + entry__author__name__isnull=True) + +Spanning multi-valued relationships +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**New in Django development version** + +When you are filtering an object based on a ``ManyToManyField`` or a reverse +``ForeignKeyField``, there are two different sorts of filter you may be +interested in. Consider the ``Blog``/``Entry`` relationship (``Blog`` to +``Entry`` is a one-to-many relation). We might be interested in finding blogs +that have an entry which has both *"Lennon"* in the headline and was published +in 2008. Or we might want to find blogs that have an entry with *"Lennon"* in +the headline as well as an entry that was published in 2008. Since there are +multiple entries associated with a single ``Blog``, both of these queries are +possible and make sense in some situations. + +The same type of situation arises with a ``ManyToManyField``. For example, if +an ``Entry`` has a ``ManyToManyField`` called ``tags``, we might want to find +entries linked to tags called *"music"* and *"bands"* or we might want an +entry that contains a tag with a name of *"music"* and a status of *"public"*. + +To handle both of these situations, Django has a consistent way of processing +``filter()`` and ``exclude()`` calls. Everything inside a single ``filter()`` +call is applied simultaneously to filter out items matching all those +requirements. Successive ``filter()`` calls further restrict the set of +objects, but for multi-valued relations, they apply to any object linked to +the primary model, not necessarily those objects that were selected by an +earlier ``filter()`` call. + +That may sound a bit confusing, so hopefully an example will clarify. To +select all blogs that contains entries with *"Lennon"* in the headline and +were published in 2008, we would write:: + + Blog.objects.filter(entry__headline__contains='Lennon', + entry__pub_date__year=2008) + +To select all blogs that contain an entry with *"Lennon"* in the headline +**as well as** an entry that was published in 2008, we would write:: + + Blog.objects.filter(entry__headline__contains='Lennon').filter( + entry__pub_date__year=2008) + +In this second example, the first filter restricted the queryset to all those +blogs linked to that particular type of entry. The second filter restricted +the set of blogs *further* to those that are also linked to the second type of +entry. The entries select by the second filter may or may not be the same as +the entries in the first filter. We are filtering the ``Blog`` items with each +filter statement, not the ``Entry`` items. + +All of this behavior also applies to ``exclude()``: all the conditions in a +single ``exclude()`` statement apply to a single instance (if those conditions +are talking about the same multi-valued relation). Conditions in subsequent +``filter()`` or ``exclude()`` calls that refer to the same relation may end up +filtering on different linked objects. + +The pk lookup shortcut +---------------------- + +For convenience, Django provides a ``pk`` lookup shortcut, which stands for +"primary key". + +In the example ``Blog`` model, the primary key is the ``id`` field, so these +three statements are equivalent:: + + >>> Blog.objects.get(id__exact=14) # Explicit form + >>> Blog.objects.get(id=14) # __exact is implied + >>> Blog.objects.get(pk=14) # pk implies id__exact + +The use of ``pk`` isn't limited to ``__exact`` queries -- any query term +can be combined with ``pk`` to perform a query on the primary key of a model:: + + # Get blogs entries with id 1, 4 and 7 + >>> Blog.objects.filter(pk__in=[1,4,7]) + + # Get all blog entries with id > 14 + >>> Blog.objects.filter(pk__gt=14) + +``pk`` lookups also work across joins. For example, these three statements are +equivalent:: + + >>> Entry.objects.filter(blog__id__exact=3) # Explicit form + >>> Entry.objects.filter(blog__id=3) # __exact is implied + >>> Entry.objects.filter(blog__pk=3) # __pk implies __id__exact + +Escaping percent signs and underscores in LIKE statements +--------------------------------------------------------- + +The field lookups that equate to ``LIKE`` SQL statements (``iexact``, +``contains``, ``icontains``, ``startswith``, ``istartswith``, ``endswith`` +and ``iendswith``) will automatically escape the two special characters used in +``LIKE`` statements -- the percent sign and the underscore. (In a ``LIKE`` +statement, the percent sign signifies a multiple-character wildcard and the +underscore signifies a single-character wildcard.) + +This means things should work intuitively, so the abstraction doesn't leak. +For example, to retrieve all the entries that contain a percent sign, just use +the percent sign as any other character:: + + >>> Entry.objects.filter(headline__contains='%') + +Django takes care of the quoting for you; the resulting SQL will look something +like this: + +.. code-block:: sql + + SELECT ... WHERE headline LIKE '%\%%'; + +Same goes for underscores. Both percentage signs and underscores are handled +for you transparently. + +.. _caching-and-querysets: + +Caching and QuerySets +--------------------- + +Each ``QuerySet`` contains a cache, to minimize database access. It's important +to understand how it works, in order to write the most efficient code. + +In a newly created ``QuerySet``, the cache is empty. The first time a +``QuerySet`` is evaluated -- and, hence, a database query happens -- Django +saves the query results in the ``QuerySet``'s cache and returns the results +that have been explicitly requested (e.g., the next element, if the +``QuerySet`` is being iterated over). Subsequent evaluations of the +``QuerySet`` reuse the cached results. + +Keep this caching behavior in mind, because it may bite you if you don't use +your ``QuerySet``\s correctly. For example, the following will create two +``QuerySet``\s, evaluate them, and throw them away:: + + >>> print [e.headline for e in Entry.objects.all()] + >>> print [e.pub_date for e in Entry.objects.all()] + +That means the same database query will be executed twice, effectively doubling +your database load. Also, there's a possibility the two lists may not include +the same database records, because an ``Entry`` may have been added or deleted +in the split second between the two requests. + +To avoid this problem, simply save the ``QuerySet`` and reuse it:: + + >>> queryset = Poll.objects.all() + >>> print [p.headline for p in queryset] # Evaluate the query set. + >>> print [p.pub_date for p in queryset] # Re-use the cache from the evaluation. + +Complex lookups with Q objects +============================== + +Keyword argument queries -- in ``filter()``, etc. -- are "AND"ed together. If +you need to execute more complex queries (for example, queries with ``OR`` +statements), you can use ``Q`` objects. + +A ``Q`` object (``django.db.models.Q``) is an object used to encapsulate a +collection of keyword arguments. These keyword arguments are specified as in +"Field lookups" above. + +For example, this ``Q`` object encapsulates a single ``LIKE`` query:: + + Q(question__startswith='What') + +``Q`` objects can be combined using the ``&`` and ``|`` operators. When an +operator is used on two ``Q`` objects, it yields a new ``Q`` object. + +For example, this statement yields a single ``Q`` object that represents the +"OR" of two ``"question__startswith"`` queries:: + + Q(question__startswith='Who') | Q(question__startswith='What') + +This is equivalent to the following SQL ``WHERE`` clause:: + + WHERE question LIKE 'Who%' OR question LIKE 'What%' + +You can compose statements of arbitrary complexity by combining ``Q`` objects +with the ``&`` and ``|`` operators. You can also use parenthetical grouping. + +Each lookup function that takes keyword-arguments (e.g. ``filter()``, +``exclude()``, ``get()``) can also be passed one or more ``Q`` objects as +positional (not-named) arguments. If you provide multiple ``Q`` object +arguments to a lookup function, the arguments will be "AND"ed together. For +example:: + + Poll.objects.get( + Q(question__startswith='Who'), + Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)) + ) + +... roughly translates into the SQL:: + + SELECT * from polls WHERE question LIKE 'Who%' + AND (pub_date = '2005-05-02' OR pub_date = '2005-05-06') + +Lookup functions can mix the use of ``Q`` objects and keyword arguments. All +arguments provided to a lookup function (be they keyword arguments or ``Q`` +objects) are "AND"ed together. However, if a ``Q`` object is provided, it must +precede the definition of any keyword arguments. For example:: + + Poll.objects.get( + Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)), + question__startswith='Who') + +... would be a valid query, equivalent to the previous example; but:: + + # INVALID QUERY + Poll.objects.get( + question__startswith='Who', + Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6))) + +... would not be valid. + +.. seealso:: + + The `OR lookups examples`_ show some possible uses of ``Q``. + + .. _OR lookups examples: http://www.djangoproject.com/models/or_lookups/ + +Comparing objects +================= + +To compare two model instances, just use the standard Python comparison operator, +the double equals sign: ``==``. Behind the scenes, that compares the primary +key values of two models. + +Using the ``Entry`` example above, the following two statements are equivalent:: + + >>> some_entry == other_entry + >>> some_entry.id == other_entry.id + +If a model's primary key isn't called ``id``, no problem. Comparisons will +always use the primary key, whatever it's called. For example, if a model's +primary key field is called ``name``, these two statements are equivalent:: + + >>> some_obj == other_obj + >>> some_obj.name == other_obj.name + +Deleting objects +================ + +The delete method, conveniently, is named ``delete()``. This method immediately +deletes the object and has no return value. Example:: + + e.delete() + +You can also delete objects in bulk. Every ``QuerySet`` has a ``delete()`` +method, which deletes all members of that ``QuerySet``. + +For example, this deletes all ``Entry`` objects with a ``pub_date`` year of +2005:: + + Entry.objects.filter(pub_date__year=2005).delete() + +Keep in mind that this will, whenever possible, be executed purely in +SQL, and so the ``delete()`` methods of individual object instances +will not necessarily be called during the process. If you've provided +a custom ``delete()`` method on a model class and want to ensure that +it is called, you will need to "manually" delete instances of that +model (e.g., by iterating over a ``QuerySet`` and calling ``delete()`` +on each object individually) rather than using the bulk ``delete()`` +method of a ``QuerySet``. + +When Django deletes an object, it emulates the behavior of the SQL +constraint ``ON DELETE CASCADE`` -- in other words, any objects which +had foreign keys pointing at the object to be deleted will be deleted +along with it. For example:: + + b = Blog.objects.get(pk=1) + # This will delete the Blog and all of its Entry objects. + b.delete() + +Note that ``delete()`` is the only ``QuerySet`` method that is not exposed on a +``Manager`` itself. This is a safety mechanism to prevent you from accidentally +requesting ``Entry.objects.delete()``, and deleting *all* the entries. If you +*do* want to delete all the objects, then you have to explicitly request a +complete query set:: + + Entry.objects.all().delete() + +Updating multiple objects at once +================================= + +**New in Django development version** + +Sometimes you want to set a field to a particular value for all the objects in +a ``QuerySet``. You can do this with the ``update()`` method. For example:: + + # Update all the headlines with pub_date in 2007. + Entry.objects.filter(pub_date__year=2007).update(headline='Everything is the same') + +You can only set non-relation fields and ``ForeignKey`` fields using this +method, and the value you set the field to must be a hard-coded Python value +(i.e., you can't set a field to be equal to some other field at the moment). + +To update ``ForeignKey`` fields, set the new value to be the new model +instance you want to point to. Example:: + + >>> b = Blog.objects.get(pk=1) + + # Change every Entry so that it belongs to this Blog. + >>> Entry.objects.all().update(blog=b) + +The ``update()`` method is applied instantly and doesn't return anything +(similar to ``delete()``). The only restriction on the ``QuerySet`` that is +updated is that it can only access one database table, the model's main +table. So don't try to filter based on related fields or anything like that; +it won't work. + +Be aware that the ``update()`` method is converted directly to an SQL +statement. It is a bulk operation for direct updates. It doesn't run any +``save()`` methods on your models, or emit the ``pre_save`` or ``post_save`` +signals (which are a consequence of calling ``save()``). If you want to save +every item in a ``QuerySet`` and make sure that the ``save()`` method is +called on each instance, you don't need any special function to handle that. +Just loop over them and call ``save()``:: + + for item in my_queryset: + item.save() + +Related objects +=============== + +When you define a relationship in a model (i.e., a ``ForeignKey``, +``OneToOneField``, or ``ManyToManyField``), instances of that model will have +a convenient API to access the related object(s). + +Using the models at the top of this page, for example, an ``Entry`` object ``e`` +can get its associated ``Blog`` object by accessing the ``blog`` attribute: +``e.blog``. + +(Behind the scenes, this functionality is implemented by Python descriptors_. +This shouldn't really matter to you, but we point it out here for the curious.) + +Django also creates API accessors for the "other" side of the relationship -- +the link from the related model to the model that defines the relationship. +For example, a ``Blog`` object ``b`` has access to a list of all related +``Entry`` objects via the ``entry_set`` attribute: ``b.entry_set.all()``. + +All examples in this section use the sample ``Blog``, ``Author`` and ``Entry`` +models defined at the top of this page. + +.. _descriptors: http://users.rcn.com/python/download/Descriptor.htm + +One-to-many relationships +------------------------- + +Forward +~~~~~~~ + +If a model has a ``ForeignKey``, instances of that model will have access to +the related (foreign) object via a simple attribute of the model. + +Example:: + + >>> e = Entry.objects.get(id=2) + >>> e.blog # Returns the related Blog object. + +You can get and set via a foreign-key attribute. As you may expect, changes to +the foreign key aren't saved to the database until you call ``save()``. +Example:: + + >>> e = Entry.objects.get(id=2) + >>> e.blog = some_blog + >>> e.save() + +If a ``ForeignKey`` field has ``null=True`` set (i.e., it allows ``NULL`` +values), you can assign ``None`` to it. Example:: + + >>> e = Entry.objects.get(id=2) + >>> e.blog = None + >>> e.save() # "UPDATE blog_entry SET blog_id = NULL ...;" + +Forward access to one-to-many relationships is cached the first time the +related object is accessed. Subsequent accesses to the foreign key on the same +object instance are cached. Example:: + + >>> e = Entry.objects.get(id=2) + >>> print e.blog # Hits the database to retrieve the associated Blog. + >>> print e.blog # Doesn't hit the database; uses cached version. + +Note that the ``select_related()`` ``QuerySet`` method recursively prepopulates +the cache of all one-to-many relationships ahead of time. Example:: + + >>> e = Entry.objects.select_related().get(id=2) + >>> print e.blog # Doesn't hit the database; uses cached version. + >>> print e.blog # Doesn't hit the database; uses cached version. + +.. _backwards-related-objects: + +Following relationships "backward" +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +If a model has a ``ForeignKey``, instances of the foreign-key model will have +access to a ``Manager`` that returns all instances of the first model. By +default, this ``Manager`` is named ``FOO_set``, where ``FOO`` is the source +model name, lowercased. This ``Manager`` returns ``QuerySets``, which can be +filtered and manipulated as described in the "Retrieving objects" section +above. + +Example:: + + >>> b = Blog.objects.get(id=1) + >>> b.entry_set.all() # Returns all Entry objects related to Blog. + + # b.entry_set is a Manager that returns QuerySets. + >>> b.entry_set.filter(headline__contains='Lennon') + >>> b.entry_set.count() + +You can override the ``FOO_set`` name by setting the ``related_name`` +parameter in the ``ForeignKey()`` definition. For example, if the ``Entry`` +model was altered to ``blog = ForeignKey(Blog, related_name='entries')``, the +above example code would look like this:: + + >>> b = Blog.objects.get(id=1) + >>> b.entries.all() # Returns all Entry objects related to Blog. + + # b.entries is a Manager that returns QuerySets. + >>> b.entries.filter(headline__contains='Lennon') + >>> b.entries.count() + +You cannot access a reverse ``ForeignKey`` ``Manager`` from the class; it must +be accessed from an instance:: + + >>> Blog.entry_set + Traceback: + ... + AttributeError: "Manager must be accessed via instance". + +In addition to the ``QuerySet`` methods defined in "Retrieving objects" above, +the ``ForeignKey`` ``Manager`` has additional methods used to handle the set of +related objects. A synopsis of each is below, and complete details can be found +in the :ref:`related objects reference <ref-models-relations>`. + +``add(obj1, obj2, ...)`` + Adds the specified model objects to the related object set. + +``create(**kwargs)`` + Creates a new object, saves it and puts it in the related object set. + Returns the newly created object. + +``remove(obj1, obj2, ...)`` + Removes the specified model objects from the related object set. + +``clear()`` + Removes all objects from the related object set. + +To assign the members of a related set in one fell swoop, just assign to it +from any iterable object. Example:: + + b = Blog.objects.get(id=1) + b.entry_set = [e1, e2] + +If the ``clear()`` method is available, any pre-existing objects will be +removed from the ``entry_set`` before all objects in the iterable (in this +case, a list) are added to the set. If the ``clear()`` method is *not* +available, all objects in the iterable will be added without removing any +existing elements. + +Each "reverse" operation described in this section has an immediate effect on +the database. Every addition, creation and deletion is immediately and +automatically saved to the database. + +Many-to-many relationships +-------------------------- + +Both ends of a many-to-many relationship get automatic API access to the other +end. The API works just as a "backward" one-to-many relationship, above. + +The only difference is in the attribute naming: The model that defines the +``ManyToManyField`` uses the attribute name of that field itself, whereas the +"reverse" model uses the lowercased model name of the original model, plus +``'_set'`` (just like reverse one-to-many relationships). + +An example makes this easier to understand:: + + e = Entry.objects.get(id=3) + e.authors.all() # Returns all Author objects for this Entry. + e.authors.count() + e.authors.filter(name__contains='John') + + a = Author.objects.get(id=5) + a.entry_set.all() # Returns all Entry objects for this Author. + +Like ``ForeignKey``, ``ManyToManyField`` can specify ``related_name``. In the +above example, if the ``ManyToManyField`` in ``Entry`` had specified +``related_name='entries'``, then each ``Author`` instance would have an +``entries`` attribute instead of ``entry_set``. + +One-to-one relationships +------------------------ + +The semantics of one-to-one relationships will be changing soon, so we don't +recommend you use them. + +How are the backward relationships possible? +-------------------------------------------- + +Other object-relational mappers require you to define relationships on both +sides. The Django developers believe this is a violation of the DRY (Don't +Repeat Yourself) principle, so Django only requires you to define the +relationship on one end. + +But how is this possible, given that a model class doesn't know which other +model classes are related to it until those other model classes are loaded? + +The answer lies in the :setting:`INSTALLED_APPS` setting. The first time any model is +loaded, Django iterates over every model in :setting:`INSTALLED_APPS` and creates the +backward relationships in memory as needed. Essentially, one of the functions +of :setting:`INSTALLED_APPS` is to tell Django the entire model domain. + +Queries over related objects +---------------------------- + +Queries involving related objects follow the same rules as queries involving +normal value fields. When specifying the value for a query to match, you may +use either an object instance itself, or the primary key value for the object. + +For example, if you have a Blog object ``b`` with ``id=5``, the following +three queries would be identical:: + + Entry.objects.filter(blog=b) # Query using object instance + Entry.objects.filter(blog=b.id) # Query using id from instance + Entry.objects.filter(blog=5) # Query using id directly + +Falling back to raw SQL +======================= + +If you find yourself needing to write an SQL query that is too complex for +Django's database-mapper to handle, you can fall back into raw-SQL statement +mode. + +The preferred way to do this is by giving your model custom methods or custom +manager methods that execute queries. Although there's nothing in Django that +*requires* database queries to live in the model layer, this approach keeps all +your data-access logic in one place, which is smart from an code-organization +standpoint. For instructions, see :ref:`topics-db-sql`. + +Finally, it's important to note that the Django database layer is merely an +interface to your database. You can access your database via other tools, +programming languages or database frameworks; there's nothing Django-specific +about your database. \ No newline at end of file diff --git a/docs/topics/db/sql.txt b/docs/topics/db/sql.txt new file mode 100644 index 0000000000..21cceba58b --- /dev/null +++ b/docs/topics/db/sql.txt @@ -0,0 +1,35 @@ +.. _topics-db-sql: + +Performing raw SQL queries +========================== + +Feel free to write custom SQL statements in custom model methods and +module-level methods. The object ``django.db.connection`` represents the +current database connection. To use it, call ``connection.cursor()`` to get a +cursor object. Then, call ``cursor.execute(sql, [params])`` to execute the SQL +and ``cursor.fetchone()`` or ``cursor.fetchall()`` to return the resulting +rows. Example:: + + def my_custom_sql(self): + from django.db import connection + cursor = connection.cursor() + cursor.execute("SELECT foo FROM bar WHERE baz = %s", [self.baz]) + row = cursor.fetchone() + return row + +``connection`` and ``cursor`` mostly implement the standard `Python DB-API`_ +(except when it comes to :ref:`transaction handling <topics-db-transactions>`). +If you're not familiar with the Python DB-API, note that the SQL statement in +``cursor.execute()`` uses placeholders, ``"%s"``, rather than adding parameters +directly within the SQL. If you use this technique, the underlying database +library will automatically add quotes and escaping to your parameter(s) as +necessary. (Also note that Django expects the ``"%s"`` placeholder, *not* the +``"?"`` placeholder, which is used by the SQLite Python bindings. This is for +the sake of consistency and sanity.) + +A final note: If all you want to do is a custom ``WHERE`` clause, you can just +use the ``where``, ``tables`` and ``params`` arguments to the standard lookup +API. + +.. _Python DB-API: http://www.python.org/peps/pep-0249.html + diff --git a/docs/transactions.txt b/docs/topics/db/transactions.txt similarity index 99% rename from docs/transactions.txt rename to docs/topics/db/transactions.txt index da7039cbab..c355b4c8e1 100644 --- a/docs/transactions.txt +++ b/docs/topics/db/transactions.txt @@ -1,3 +1,5 @@ +.. _topics-db-transactions: + ============================== Managing database transactions ============================== diff --git a/docs/email.txt b/docs/topics/email.txt similarity index 88% rename from docs/email.txt rename to docs/topics/email.txt index e54620c818..66fdfd6a66 100644 --- a/docs/email.txt +++ b/docs/topics/email.txt @@ -1,7 +1,12 @@ +.. _topics-email: + ============== Sending e-mail ============== +.. module:: django.core.mail + :synopsis: Helpers to easily send e-mail. + Although Python makes sending e-mail relatively easy via the `smtplib library`_, Django provides a couple of light wrappers over it, to make sending e-mail extra quick. @@ -20,32 +25,24 @@ In two lines:: send_mail('Subject here', 'Here is the message.', 'from@example.com', ['to@example.com'], fail_silently=False) -Mail is sent using the SMTP host and port specified in the `EMAIL_HOST`_ and -`EMAIL_PORT`_ settings. The `EMAIL_HOST_USER`_ and `EMAIL_HOST_PASSWORD`_ -settings, if set, are used to authenticate to the SMTP server, and the -`EMAIL_USE_TLS`_ setting controls whether a secure connection is used. +Mail is sent using the SMTP host and port specified in the :setting:`EMAIL_HOST` +and :setting:`EMAIL_PORT` settings. The :setting:`EMAIL_HOST_USER` and +:setting:`EMAIL_HOST_PASSWORD` settings, if set, are used to authenticate to the +SMTP server, and the :setting:`EMAIL_USE_TLS` setting controls whether a secure +connection is used. .. note:: The character set of e-mail sent with ``django.core.mail`` will be set to - the value of your `DEFAULT_CHARSET`_ setting. - -.. _DEFAULT_CHARSET: ../settings/#default-charset -.. _EMAIL_HOST: ../settings/#email-host -.. _EMAIL_PORT: ../settings/#email-port -.. _EMAIL_HOST_USER: ../settings/#email-host-user -.. _EMAIL_HOST_PASSWORD: ../settings/#email-host-password -.. _EMAIL_USE_TLS: ../settings/#email-use-tls + the value of your :setting:`DEFAULT_CHARSET` setting. send_mail() =========== The simplest way to send e-mail is using the function -``django.core.mail.send_mail()``. Here's its definition:: +``django.core.mail.send_mail()``. Here's its definition: - send_mail(subject, message, from_email, recipient_list, - fail_silently=False, auth_user=None, - auth_password=None) + .. function:: send_mail(subject, message, from_email, recipient_list, fail_silently=False, auth_user=None, auth_password=None) The ``subject``, ``message``, ``from_email`` and ``recipient_list`` parameters are required. @@ -72,10 +69,9 @@ send_mass_mail() ================ ``django.core.mail.send_mass_mail()`` is intended to handle mass e-mailing. -Here's the definition:: +Here's the definition: - send_mass_mail(datatuple, fail_silently=False, - auth_user=None, auth_password=None): + .. function:: send_mass_mail(datatuple, fail_silently=False, auth_user=None, auth_password=None) ``datatuple`` is a tuple in which each element is in this format:: @@ -86,7 +82,7 @@ as in ``send_mail()``. Each separate element of ``datatuple`` results in a separate e-mail message. As in ``send_mail()``, recipients in the same ``recipient_list`` will all see -the other addresses in the e-mail messages's "To:" field. +the other addresses in the e-mail messages' "To:" field. send_mass_mail() vs. send_mail() -------------------------------- @@ -100,31 +96,26 @@ mail_admins() ============= ``django.core.mail.mail_admins()`` is a shortcut for sending an e-mail to the -site admins, as defined in the `ADMINS`_ setting. Here's the definition:: +site admins, as defined in the :setting:`ADMINS` setting. Here's the definition: - mail_admins(subject, message, fail_silently=False) + .. function:: mail_admins(subject, message, fail_silently=False) ``mail_admins()`` prefixes the subject with the value of the -`EMAIL_SUBJECT_PREFIX`_ setting, which is ``"[Django] "`` by default. +:setting:`EMAIL_SUBJECT_PREFIX` setting, which is ``"[Django] "`` by default. -The "From:" header of the e-mail will be the value of the `SERVER_EMAIL`_ setting. +The "From:" header of the e-mail will be the value of the +:setting:`SERVER_EMAIL` setting. This method exists for convenience and readability. -.. _ADMINS: ../settings/#admins -.. _EMAIL_SUBJECT_PREFIX: ../settings/#email-subject-prefix -.. _SERVER_EMAIL: ../settings/#server-email - mail_managers() function ======================== ``django.core.mail.mail_managers()`` is just like ``mail_admins()``, except it -sends an e-mail to the site managers, as defined in the `MANAGERS`_ setting. -Here's the definition:: +sends an e-mail to the site managers, as defined in the :setting:`MANAGERS` +setting. Here's the definition: - mail_managers(subject, message, fail_silently=False) - -.. _MANAGERS: ../settings/#managers + .. function:: mail_managers(subject, message, fail_silently=False) Examples ======== @@ -185,6 +176,8 @@ from the request's POST data, sends that to admin@example.com and redirects to .. _Header injection: http://securephp.damonkohler.com/index.php/Email_Injection +.. _emailmessage-and-smtpconnection: + The EmailMessage and SMTPConnection classes =========================================== @@ -212,8 +205,10 @@ itself. ``SMTPConnection`` is responsible for the network connection side of the operation. This means you can reuse the same connection (an ``SMTPConnection`` instance) for multiple messages. -E-mail messages ---------------- +EmailMessage Objects +-------------------- + +.. class:: EmailMessage The ``EmailMessage`` class is initialized with the following parameters (in the given order, if positional arguments are used). All parameters are @@ -225,7 +220,7 @@ optional and can be set at any time prior to calling the ``send()`` method. * ``from_email``: The sender's address. Both ``fred@example.com`` and ``Fred <fred@example.com>`` forms are legal. If omitted, the - `DEFAULT_FROM_EMAIL`_ setting is used. + :setting:`DEFAULT_FROM_EMAIL` setting is used. * ``to``: A list or tuple of recipient addresses. @@ -233,7 +228,7 @@ optional and can be set at any time prior to calling the ``send()`` method. sending the e-mail. * ``connection``: An ``SMTPConnection`` instance. Use this parameter if - you want to use the same conneciton for multiple messages. If omitted, a + you want to use the same connection for multiple messages. If omitted, a new connection is created when ``send()`` is called. * ``attachments``: A list of attachments to put on the message. These can @@ -336,8 +331,10 @@ example:: msg.content_subtype = "html" # Main content is now text/html msg.send() -SMTP network connections ------------------------- +SMTPConnection Objects +---------------------- + +.. class:: SMTPConnection The ``SMTPConnection`` class is initialized with the host, port, username and password for the SMTP server. If you don't specify one or more of those diff --git a/docs/topics/files.txt b/docs/topics/files.txt new file mode 100644 index 0000000000..662110111a --- /dev/null +++ b/docs/topics/files.txt @@ -0,0 +1,146 @@ +.. _topics-files: + +============== +Managing files +============== + +**New in Django development version** + +This document describes Django's file access APIs. + +By default, Django stores files locally, using the :setting:`MEDIA_ROOT` and +:setting:`MEDIA_URL` settings. The examples below assume that you're using these +defaults. + +However, Django provides ways to write custom `file storage systems`_ that +allow you to completely customize where and how Django stores files. The +second half of this document describes how these storage systems work. + +.. _file storage systems: `File storage`_ + +Using files in models +===================== + +When you use a :class:`~django.db.models.FileField` or +:class:`~django.db.models.ImageField`, Django provides a set of APIs you can use +to deal with that file. + +Consider the following model, using a ``FileField`` to store a photo:: + + class Car(models.Model): + name = models.CharField(max_length=255) + price = models.DecimalField(max_digits=5, decimal_places=2) + photo = models.ImageField(upload_to='cars') + +Any ``Car`` instance will have a ``photo`` attribute that you can use to get at +the details of the attached photo:: + + >>> car = Car.object.get(name="57 Chevy") + >>> car.photo + <ImageFieldFile: chevy.jpg> + >>> car.photo.name + u'chevy.jpg' + >>> car.photo.path + u'/media/cars/chevy.jpg' + >>> car.photo.url + u'http://media.example.com/cars/chevy.jpg' + +This object -- ``car.photo`` in the example -- is a ``File`` object, which means +it has all the methods and attributes described below. + +The ``File`` object +=================== + +Internally, Django uses a ``django.core.files.File`` any time it needs to +represent a file. This object is a thin wrapper around Python's `built-in file +object`_ with some Django-specific additions. + +.. _built-in file object: http://docs.python.org/lib/bltin-file-objects.html + +Most of the time you'll simply use a ``File`` that Django's given you (i.e. a +file attached to a model as above, or perhaps an uploaded file). + +If you need to construct a ``File`` yourself, the easiest way is to create one +using a Python built-in ``file`` object:: + + >>> from django.core.files import File + + # Create a Python file object using open() + >>> f = open('/tmp/hello.world', 'w') + >>> myfile = File(f) + +Now you can use any of the ``File`` attributes and methods documented in +:ref:`ref-files-file`. + +File storage +============ + +Behind the scenes, Django delegates decisions about how and where to store files +to a file storage system. This is the object that actually understands things +like file systems, opening and reading files, etc. + +Django's default file storage is given by the :setting:`DEFAULT_FILE_STORAGE` +setting; if you don't explicitly provide a storage system, this is the one that +will be used. + +See below for details of the built-in default file storage system, and see +:ref:`howto-custom-file-storage` for information on writing your own file +storage system. + +Storage objects +--------------- + +Though most of the time you'll want to use a ``File`` object (which delegates to +the proper storage for that file), you can use file storage systems directly. +You can create an instance of some custom file storage class, or -- often more +useful -- you can use the global default storage system:: + + >>> from django.core.files.storage import default_storage + + >>> path = default_storage.save('/path/to/file', 'new content') + >>> path + u'/path/to/file' + + >>> default_storage.filesize(path) + 11 + >>> default_storage.open(path).read() + 'new content' + + >>> default_storage.delete(path) + >>> default_storage.exists(path) + False + +See :ref:`ref-files-storage` for the file storage API. + +The built-in filesystem storage class +------------------------------------- + +Django ships with a built-in ``FileSystemStorage`` class (defined in +``django.core.files.storage``) which implements basic local filesystem file +storage. Its initializer takes two arguments: + +====================== =================================================== +Argument Description +====================== =================================================== +``location`` Optional. Absolute path to the directory that will + hold the files. If omitted, it will be set to the + value of your ``MEDIA_ROOT`` setting. +``base_url`` Optional. URL that serves the files stored at this + location. If omitted, it will default to the value + of your ``MEDIA_URL`` setting. +====================== =================================================== + +For example, the following code will store uploaded files under +``/media/photos`` regardless of what your ``MEDIA_ROOT`` setting is:: + + from django.db import models + from django.core.files.storage import FileSystemStorage + + fs = FileSystemStorage(location='/media/photos') + + class Car(models.Model): + ... + photo = models.ImageField(storage=fs) + +:ref:`Custom storage systems <howto-custom-file-storage>` work the same way: you +can pass them in as the ``storage`` argument to a ``FileField``. \ No newline at end of file diff --git a/docs/topics/forms/formsets.txt b/docs/topics/forms/formsets.txt new file mode 100644 index 0000000000..5d1e3ed729 --- /dev/null +++ b/docs/topics/forms/formsets.txt @@ -0,0 +1,329 @@ +.. _topics-forms-formsets: +.. _formsets: + +Formsets +======== + +A formset is a layer of abstraction to working with multiple forms on the same +page. It can be best compared to a data grid. Let's say you have the following +form:: + + >>> from django import forms + >>> class ArticleForm(forms.Form): + ... title = forms.CharField() + ... pub_date = forms.DateField() + +You might want to allow the user to create several articles at once. To create +a formset out of an ``ArticleForm`` you would do:: + + >>> from django.forms.formsets import formset_factory + >>> ArticleFormSet = formset_factory(ArticleForm) + +You now have created a formset named ``ArticleFormSet``. The formset gives you +the ability to iterate over the forms in the formset and display them as you +would with a regular form:: + + >>> formset = ArticleFormSet() + >>> for form in formset.forms: + ... print form.as_table() + <tr><th><label for="id_form-0-title">Title:</label></th><td><input type="text" name="form-0-title" id="id_form-0-title" /></td></tr> + <tr><th><label for="id_form-0-pub_date">Pub date:</label></th><td><input type="text" name="form-0-pub_date" id="id_form-0-pub_date" /></td></tr> + +As you can see it only displayed one form. This is because by default the +``formset_factory`` defines one extra form. This can be controlled with the +``extra`` parameter:: + + >>> ArticleFormSet = formset_factory(ArticleForm, extra=2) + +Using initial data with a formset +--------------------------------- + +Initial data is what drives the main usability of a formset. As shown above +you can define the number of extra forms. What this means is that you are +telling the formset how many additional forms to show in addition to the +number of forms it generates from the initial data. Lets take a look at an +example:: + + >>> ArticleFormSet = formset_factory(ArticleForm, extra=2) + >>> formset = ArticleFormSet(initial=[ + ... {'title': u'Django is now open source', + ... 'pub_date': datetime.date.today()}, + ... ]) + + >>> for form in formset.forms: + ... print form.as_table() + <tr><th><label for="id_form-0-title">Title:</label></th><td><input type="text" name="form-0-title" value="Django is now open source" id="id_form-0-title" /></td></tr> + <tr><th><label for="id_form-0-pub_date">Pub date:</label></th><td><input type="text" name="form-0-pub_date" value="2008-05-12" id="id_form-0-pub_date" /></td></tr> + <tr><th><label for="id_form-1-title">Title:</label></th><td><input type="text" name="form-1-title" id="id_form-1-title" /></td></tr> + <tr><th><label for="id_form-1-pub_date">Pub date:</label></th><td><input type="text" name="form-1-pub_date" id="id_form-1-pub_date" /></td></tr> + <tr><th><label for="id_form-2-title">Title:</label></th><td><input type="text" name="form-2-title" id="id_form-2-title" /></td></tr> + <tr><th><label for="id_form-2-pub_date">Pub date:</label></th><td><input type="text" name="form-2-pub_date" id="id_form-2-pub_date" /></td></tr> + +There are now a total of three forms showing above. One for the initial data +that was passed in and two extra forms. Also note that we are passing in a +list of dictionaries as the initial data. + +Limiting the maximum number of forms +------------------------------------ + +The ``max_num`` parameter to ``formset_factory`` gives you the ability to +force the maximum number of forms the formset will display:: + + >>> ArticleFormSet = formset_factory(ArticleForm, extra=2, max_num=1) + >>> formset = ArticleFormset() + >>> for form in formset.forms: + ... print form.as_table() + <tr><th><label for="id_form-0-title">Title:</label></th><td><input type="text" name="form-0-title" id="id_form-0-title" /></td></tr> + <tr><th><label for="id_form-0-pub_date">Pub date:</label></th><td><input type="text" name="form-0-pub_date" id="id_form-0-pub_date" /></td></tr> + +The default value of ``max_num`` is ``0`` which is the same as saying put no +limit on the number forms displayed. + +Formset validation +------------------ + +Validation with a formset is about identical to a regular ``Form``. There is +an ``is_valid`` method on the formset to provide a convenient way to validate +each form in the formset:: + + >>> ArticleFormSet = formset_factory(ArticleForm) + >>> formset = ArticleFormSet({}) + >>> formset.is_valid() + True + +We passed in no data to the formset which is resulting in a valid form. The +formset is smart enough to ignore extra forms that were not changed. If we +attempt to provide an article, but fail to do so:: + + >>> data = { + ... 'form-TOTAL_FORMS': u'1', + ... 'form-INITIAL_FORMS': u'1', + ... 'form-0-title': u'Test', + ... 'form-0-pub_date': u'', + ... } + >>> formset = ArticleFormSet(data) + >>> formset.is_valid() + False + >>> formset.errors + [{'pub_date': [u'This field is required.']}] + +As we can see the formset properly performed validation and gave us the +expected errors. + +Understanding the ManagementForm +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +You may have noticed the additional data that was required in the formset's +data above. This data is coming from the ``ManagementForm``. This form is +dealt with internally to the formset. If you don't use it, it will result in +an exception:: + + >>> data = { + ... 'form-0-title': u'Test', + ... 'form-0-pub_date': u'', + ... } + >>> formset = ArticleFormSet(data) + Traceback (most recent call last): + ... + django.forms.util.ValidationError: [u'ManagementForm data is missing or has been tampered with'] + +It is used to keep track of how many form instances are being displayed. If +you are adding new forms via JavaScript, you should increment the count fields +in this form as well. + +Custom formset validation +~~~~~~~~~~~~~~~~~~~~~~~~~ + +A formset has a ``clean`` method similar to the one on a ``Form`` class. This +is where you define your own validation that deals at the formset level:: + + >>> from django.forms.formsets import BaseFormSet + + >>> class BaseArticleFormSet(BaseFormSet): + ... def clean(self): + ... raise forms.ValidationError, u'An error occured.' + + >>> ArticleFormSet = formset_factory(ArticleForm, formset=BaseArticleFormSet) + >>> formset = ArticleFormSet({}) + >>> formset.is_valid() + False + >>> formset.non_form_errors() + [u'An error occured.'] + +The formset ``clean`` method is called after all the ``Form.clean`` methods +have been called. The errors will be found using the ``non_form_errors()`` +method on the formset. + +Dealing with ordering and deletion of forms +------------------------------------------- + +Common use cases with a formset is dealing with ordering and deletion of the +form instances. This has been dealt with for you. The ``formset_factory`` +provides two optional parameters ``can_order`` and ``can_delete`` that will do +the extra work of adding the extra fields and providing simpler ways of +getting to that data. + +``can_order`` +~~~~~~~~~~~~~ + +Default: ``False`` + +Lets create a formset with the ability to order:: + + >>> ArticleFormSet = formset_factory(ArticleForm, can_order=True) + >>> formset = ArticleFormSet(initial=[ + ... {'title': u'Article #1', 'pub_date': datetime.date(2008, 5, 10)}, + ... {'title': u'Article #2', 'pub_date': datetime.date(2008, 5, 11)}, + ... ]) + >>> for form in formset.forms: + ... print form.as_table() + <tr><th><label for="id_form-0-title">Title:</label></th><td><input type="text" name="form-0-title" value="Article #1" id="id_form-0-title" /></td></tr> + <tr><th><label for="id_form-0-pub_date">Pub date:</label></th><td><input type="text" name="form-0-pub_date" value="2008-05-10" id="id_form-0-pub_date" /></td></tr> + <tr><th><label for="id_form-0-ORDER">Order:</label></th><td><input type="text" name="form-0-ORDER" value="1" id="id_form-0-ORDER" /></td></tr> + <tr><th><label for="id_form-1-title">Title:</label></th><td><input type="text" name="form-1-title" value="Article #2" id="id_form-1-title" /></td></tr> + <tr><th><label for="id_form-1-pub_date">Pub date:</label></th><td><input type="text" name="form-1-pub_date" value="2008-05-11" id="id_form-1-pub_date" /></td></tr> + <tr><th><label for="id_form-1-ORDER">Order:</label></th><td><input type="text" name="form-1-ORDER" value="2" id="id_form-1-ORDER" /></td></tr> + <tr><th><label for="id_form-2-title">Title:</label></th><td><input type="text" name="form-2-title" id="id_form-2-title" /></td></tr> + <tr><th><label for="id_form-2-pub_date">Pub date:</label></th><td><input type="text" name="form-2-pub_date" id="id_form-2-pub_date" /></td></tr> + <tr><th><label for="id_form-2-ORDER">Order:</label></th><td><input type="text" name="form-2-ORDER" id="id_form-2-ORDER" /></td></tr> + +This adds an additional field to each form. This new field is named ``ORDER`` +and is an ``forms.IntegerField``. For the forms that came from the initial +data it automatically assigned them a numeric value. Lets look at what will +happen when the user changes these values:: + + >>> data = { + ... 'form-TOTAL_FORMS': u'3', + ... 'form-INITIAL_FORMS': u'2', + ... 'form-0-title': u'Article #1', + ... 'form-0-pub_date': u'2008-05-10', + ... 'form-0-ORDER': u'2', + ... 'form-1-title': u'Article #2', + ... 'form-1-pub_date': u'2008-05-11', + ... 'form-1-ORDER': u'1', + ... 'form-2-title': u'Article #3', + ... 'form-2-pub_date': u'2008-05-01', + ... 'form-2-ORDER': u'0', + ... } + + >>> formset = ArticleFormSet(data, initial=[ + ... {'title': u'Article #1', 'pub_date': datetime.date(2008, 5, 10)}, + ... {'title': u'Article #2', 'pub_date': datetime.date(2008, 5, 11)}, + ... ]) + >>> formset.is_valid() + True + >>> for form in formset.ordered_forms: + ... print form.cleaned_data + {'pub_date': datetime.date(2008, 5, 1), 'ORDER': 0, 'title': u'Article #3'} + {'pub_date': datetime.date(2008, 5, 11), 'ORDER': 1, 'title': u'Article #2'} + {'pub_date': datetime.date(2008, 5, 10), 'ORDER': 2, 'title': u'Article #1'} + +``can_delete`` +~~~~~~~~~~~~~~ + +Default: ``False`` + +Lets create a formset with the ability to delete:: + + >>> ArticleFormSet = formset_factory(ArticleForm, can_delete=True) + >>> formset = ArticleFormSet(initial=[ + ... {'title': u'Article #1', 'pub_date': datetime.date(2008, 5, 10)}, + ... {'title': u'Article #2', 'pub_date': datetime.date(2008, 5, 11)}, + ... ]) + >>> for form in formset.forms: + .... print form.as_table() + <input type="hidden" name="form-TOTAL_FORMS" value="3" id="id_form-TOTAL_FORMS" /><input type="hidden" name="form-INITIAL_FORMS" value="2" id="id_form-INITIAL_FORMS" /> + <tr><th><label for="id_form-0-title">Title:</label></th><td><input type="text" name="form-0-title" value="Article #1" id="id_form-0-title" /></td></tr> + <tr><th><label for="id_form-0-pub_date">Pub date:</label></th><td><input type="text" name="form-0-pub_date" value="2008-05-10" id="id_form-0-pub_date" /></td></tr> + <tr><th><label for="id_form-0-DELETE">Delete:</label></th><td><input type="checkbox" name="form-0-DELETE" id="id_form-0-DELETE" /></td></tr> + <tr><th><label for="id_form-1-title">Title:</label></th><td><input type="text" name="form-1-title" value="Article #2" id="id_form-1-title" /></td></tr> + <tr><th><label for="id_form-1-pub_date">Pub date:</label></th><td><input type="text" name="form-1-pub_date" value="2008-05-11" id="id_form-1-pub_date" /></td></tr> + <tr><th><label for="id_form-1-DELETE">Delete:</label></th><td><input type="checkbox" name="form-1-DELETE" id="id_form-1-DELETE" /></td></tr> + <tr><th><label for="id_form-2-title">Title:</label></th><td><input type="text" name="form-2-title" id="id_form-2-title" /></td></tr> + <tr><th><label for="id_form-2-pub_date">Pub date:</label></th><td><input type="text" name="form-2-pub_date" id="id_form-2-pub_date" /></td></tr> + <tr><th><label for="id_form-2-DELETE">Delete:</label></th><td><input type="checkbox" name="form-2-DELETE" id="id_form-2-DELETE" /></td></tr> + +Similar to ``can_order`` this adds a new field to each form named ``DELETE`` +and is a ``forms.BooleanField``. When data comes through marking any of the +delete fields you can access them with ``deleted_forms``:: + + >>> data = { + ... 'form-TOTAL_FORMS': u'3', + ... 'form-INITIAL_FORMS': u'2', + ... 'form-0-title': u'Article #1', + ... 'form-0-pub_date': u'2008-05-10', + ... 'form-0-DELETE': u'on', + ... 'form-1-title': u'Article #2', + ... 'form-1-pub_date': u'2008-05-11', + ... 'form-1-DELETE': u'', + ... 'form-2-title': u'', + ... 'form-2-pub_date': u'', + ... 'form-2-DELETE': u'', + ... } + + >>> formset = ArticleFormSet(data, initial=[ + ... {'title': u'Article #1', 'pub_date': datetime.date(2008, 5, 10)}, + ... {'title': u'Article #2', 'pub_date': datetime.date(2008, 5, 11)}, + ... ]) + >>> [form.cleaned_data for form in formset.deleted_forms] + [{'DELETE': True, 'pub_date': datetime.date(2008, 5, 10), 'title': u'Article #1'}] + +Adding additional fields to a formset +------------------------------------- + +If you need to add additional fields to the formset this can be easily +accomplished. The formset base class provides an ``add_fields`` method. You +can simply override this method to add your own fields or even redefine the +default fields/attributes of the order and deletion fields:: + + >>> class BaseArticleFormSet(BaseFormSet): + ... def add_fields(self, form, index): + ... super(BaseArticleFormSet, self).add_fields(form, index) + ... form.fields["my_field"] = forms.CharField() + + >>> ArticleFormSet = formset_factory(ArticleForm, formset=BaseArticleFormSet) + >>> formset = ArticleFormSet() + >>> for form in formset.forms: + ... print form.as_table() + <tr><th><label for="id_form-0-title">Title:</label></th><td><input type="text" name="form-0-title" id="id_form-0-title" /></td></tr> + <tr><th><label for="id_form-0-pub_date">Pub date:</label></th><td><input type="text" name="form-0-pub_date" id="id_form-0-pub_date" /></td></tr> + <tr><th><label for="id_form-0-my_field">My field:</label></th><td><input type="text" name="form-0-my_field" id="id_form-0-my_field" /></td></tr> + +Using a formset in views and templates +-------------------------------------- + +Using a formset inside a view is as easy as using a regular ``Form`` class. +The only thing you will want to be aware of is making sure to use the +management form inside the template. Lets look at a sample view:: + + def manage_articles(request): + ArticleFormSet = formset_factory(ArticleForm) + if request.method == 'POST': + formset = ArticleFormSet(request.POST, request.FILES) + if formset.is_valid(): + # do something with the formset.cleaned_data + else: + formset = ArticleFormSet() + return render_to_response('manage_articles.html', {'formset': formset}) + +The ``manage_articles.html`` template might look like this:: + + <form method="POST" action=""> + {{ formset.management_form }} + <table> + {% for form in formset.forms %} + {{ form }} + {% endfor %} + </table> + </form> + +However the above can be slightly shortcutted and let the formset itself deal +with the management form:: + + <form method="POST" action=""> + <table> + {{ formset }} + </table> + </form> + +The above ends up calling the ``as_table`` method on the formset class. diff --git a/docs/topics/forms/index.txt b/docs/topics/forms/index.txt new file mode 100644 index 0000000000..094c57ae5e --- /dev/null +++ b/docs/topics/forms/index.txt @@ -0,0 +1,260 @@ +.. _topics-forms-index: + +================== +Working with forms +================== + +.. admonition:: About this document + + This document provides an introduction to Django's form handling features. + For a more detailed look at the forms API, see :ref:`ref-forms-api`. For + documentation of the available field types, see :ref:`ref-forms-fields`. + +``django.forms`` is Django's form-handling library. + +While it is possible to process form submissions just using Django's +:class:`~django.http.HttpRequest` class, using the form library takes care of a +number of common form-related tasks. Using it, you can: + + 1. Display an HTML form with automatically generated form widgets. + 2. Checking submitted data against a set of validation rules. + 3. Redisplaying a form in the case of validation errors. + 4. Converting submitted form data to the relevant Python data types. + +Overview +======== + +The library deals with these concepts: + +.. glossary:: + + Widget + A class that corresponds to an HTML form widget, e.g. + ``<input type="text">`` or ``<textarea>``. This handles rendering of the + widget as HTML. + + Field + A class that is responsible for doing validation, e.g. + an ``EmailField`` that makes sure its data is a valid e-mail address. + + Form + A collection of fields that knows how to validate itself and + display itself as HTML. + + Form Media + The CSS and JavaScript resources that are required to render a form. + +The library is decoupled from the other Django components, such as the database +layer, views and templates. It relies only on Django settings, a couple of +``django.utils`` helper functions and Django's internationalization hooks (but +you're not required to be using internationalization features to use this +library). + +Form objects +============ + +A Form object encapsulates a sequence of form fields and a collection of +validation rules that must be fulfilled in order for the form to be accepted. +Form classes are created as subclasses of ``django.forms.Form`` and are +make use of a declarative style that you'll be familiar with if you've used +Django's database models. + +For example, consider a form used to implement "contact me" functionality on a +personal Web site:: + + from django import forms + + class ContactForm(forms.Form): + subject = forms.CharField(max_length=100) + message = forms.CharField() + sender = forms.EmailField() + cc_myself = forms.BooleanField(required=False) + +A form is composed of ``Field`` objects. In this case, our form has four +fields: ``subject``, ``message``, ``sender`` and ``cc_myself``. ``CharField``, +``EmailField`` and ``BooleanField`` are just three of the available field types; +a full list can be found in :ref:`ref-forms-fields`. + +If your form is going to be used to directly add or edit a Django model, you can +use a :ref:`ModelForm <topics-forms-modelforms>` to avoid duplicating your model +description. + +Using a form in a view +---------------------- + +The standard pattern for processing a form in a view looks like this:: + + def contact(request): + if request.method == 'POST': # If the form has been submitted... + form = ContactForm(request.POST) # A form bound to the POST data + if form.is_valid(): # All validation rules pass + # Process the data in form.cleaned_data + # ... + return HttpResponseRedirect('/thanks/') # Redirect after POST + else: + form = ContactForm() # An unbound form + + return render_to_response('contact.html', { + 'form': form, + }) + + +There are three code paths here: + + 1. If the form has not been submitted, an unbound instance of ContactForm is + created and passed to the template. + 2. If the form has been submitted, a bound instance of the form is created + using ``request.POST``. If the submitted data is valid, it is processed + and the user is re-directed to a "thanks" page. + 3. If the form has been submitted but is invalid, the bound form instance is + passed on to the template. + +.. note:: + **New in Django development version** The ``cleaned_data`` attribute was + called ``clean_data`` in earlier releases. + +The distinction between **bound** and **unbound** forms is important. An unbound +form does not have any data associated with it; when rendered to the user, it +will be empty or will contain default values. A bound form does have submitted +data, and hence can be used to tell if that data is valid. If an invalid bound +form is rendered it can include inline error messages telling the user where +they went wrong. + +See :ref:`ref-forms-api-bound-unbound` for further information on the +differences between bound and unbound forms. + +Processing the data from a form +------------------------------- + +Once ``is_valid()`` returns ``True``, you can process the form submission safe +in the knowledge that it conforms to the validation rules defined by your form. +While you could access ``request.POST`` directly at this point, it is better to +access ``form.cleaned_data``. This data has not only been validated but will +also be converted in to the relevant Python types for you. In the above example, +``cc_myself`` will be a boolean value. Likewise, fields such as ``IntegerField`` +and ``FloatField`` convert values to a Python int and float respectively. + +Extending the above example, here's how the form data could be processed:: + + if form.is_valid(): + subject = form.cleaned_data['subject'] + message = form.cleaned_data['message'] + sender = form.cleaned_data['sender'] + cc_myself = form.cleaned_data['cc_myself'] + + recipients = ['info@example.com'] + if cc_myself: + recipients.append(sender) + + from django.core.mail import send_mail + send_mail(subject, message, sender, recipients) + return HttpResponseRedirect('/thanks/') # Redirect after POST + +For more on sending e-mail from Django, see :ref:`topics-email`. + +Displaying a form using a template +---------------------------------- + +Forms are designed to work with the Django template language. In the above +example, we passed our ``ContactForm`` instance to the template using the +context variable ``form``. Here's a simple example template:: + + <form action="/contact/" method="POST"> + {{ form.as_p }} + <input type="submit" value="Submit"> + </form> + +The form only outputs its own fields; it is up to you to provide the surrounding +``<form>`` tags and the submit button. + +``form.as_p`` will output the form with each form field and accompanying label +wrapped in a paragraph. Here's the output for our example template:: + + <form action="/contact/" method="POST"> + <p><label for="id_subject">Subject:</label> + <input id="id_subject" type="text" name="subject" maxlength="100" /></p> + <p><label for="id_message">Message:</label> + <input type="text" name="message" id="id_message" /></p> + <p><label for="id_sender">Sender:</label> + <input type="text" name="sender" id="id_sender" /></p> + <p><label for="id_cc_myself">Cc myself:</label> + <input type="checkbox" name="cc_myself" id="id_cc_myself" /></p> + <input type="submit" value="Submit"> + </form> + +Note that each form field has an ID attribute set to ``id_<field-name>``, which +is referenced by the accompanying label tag. This is important for ensuring +forms are accessible to assistive technology such as screen reader software. You +can also :ref:`customize the way in which labels and ids are generated +<ref-forms-api-configuring-label>`. + +You can also use ``form.as_table`` to output table rows (you'll need to provide +your own ``<table>`` tags) and ``form.as_li`` to output list items. + +Customizing the form template +----------------------------- + +If the default generated HTML is not to your taste, you can completely customize +the way a form is presented using the Django template language. Extending the +above example:: + + <form action="/contact/" method="POST"> + <div class="fieldWrapper"> + {{ form.subject.errors }} + <label for="id_subject">E-mail subject:</label> + {{ form.subject }} + </div> + <div class="fieldWrapper"> + {{ form.message.errors }} + <label for="id_message">Your message:</label> + {{ form.message }} + </div> + <div class="fieldWrapper"> + {{ form.sender.errors }} + <label for="id_sender">Your email address:</label> + {{ form.sender }} + </div> + <div class="fieldWrapper"> + {{ form.cc_myself.errors }} + <label for="id_cc_myself">CC yourself?</label> + {{ form.cc_myself }} + </div> + <p><input type="submit" value="Send message"></p> + </form> + +Each named form-field can be output to the template using +``{{ form.name_of_field }}``, which will produce the HTML needed to display the +form widget. Using ``{{ form.name_of_field.errors }}`` displays a list of form +errors, rendered as an unordered list. This might look like:: + + <ul class="errorlist"> + <li>Sender is required.</li> + </ul> + +The list has a CSS class of ``errorlist`` to allow you to style its appearance. +If you wish to further customize the display of errors you can do so by looping +over them:: + + {% if form.subject.errors %} + <ol> + {% for error in form.message.errors %} + <li><strong>{{ error|escape }}</strong></li> + {% endfor %} + </ol> + {% endif %} + +Further topics +============== + +This covers the basics, but forms can do a whole lot more: + +.. toctree:: + :maxdepth: 1 + + modelforms + formsets + media + +.. seealso:: + + The :ref:`form API reference <ref-forms-index>`. \ No newline at end of file diff --git a/docs/topics/forms/media.txt b/docs/topics/forms/media.txt new file mode 100644 index 0000000000..12181fcf06 --- /dev/null +++ b/docs/topics/forms/media.txt @@ -0,0 +1,311 @@ +.. _topics-forms-media: + +Form Media +========== + +Rendering an attractive and easy-to-use web form requires more than just +HTML - it also requires CSS stylesheets, and if you want to use fancy +"Web2.0" widgets, you may also need to include some JavaScript on each +page. The exact combination of CSS and JavaScript that is required for +any given page will depend upon the widgets that are in use on that page. + +This is where Django media definitions come in. Django allows you to +associate different media files with the forms and widgets that require +that media. For example, if you want to use a calendar to render DateFields, +you can define a custom Calendar widget. This widget can then be associated +with the CSS and JavaScript that is required to render the calendar. When +the Calendar widget is used on a form, Django is able to identify the CSS and +JavaScript files that are required, and provide the list of file names +in a form suitable for easy inclusion on your web page. + +.. admonition:: Media and Django Admin + + The Django Admin application defines a number of customized widgets + for calendars, filtered selections, and so on. These widgets define + media requirements, and the Django Admin uses the custom widgets + in place of the Django defaults. The Admin templates will only include + those media files that are required to render the widgets on any + given page. + + If you like the widgets that the Django Admin application uses, + feel free to use them in your own application! They're all stored + in ``django.contrib.admin.widgets``. + +.. admonition:: Which JavaScript toolkit? + + Many JavaScript toolkits exist, and many of them include widgets (such + as calendar widgets) that can be used to enhance your application. + Django has deliberately avoided blessing any one JavaScript toolkit. + Each toolkit has its own relative strengths and weaknesses - use + whichever toolkit suits your requirements. Django is able to integrate + with any JavaScript toolkit. + +Media as a static definition +---------------------------- + +The easiest way to define media is as a static definition. Using this method, +the media declaration is an inner class. The properties of the inner class +define the media requirements. + +Here's a simple example:: + + class CalendarWidget(forms.TextInput): + class Media: + css = { + 'all': ('pretty.css',) + } + js = ('animations.js', 'actions.js') + +This code defines a ``CalendarWidget``, which will be based on ``TextInput``. +Every time the CalendarWidget is used on a form, that form will be directed +to include the CSS file ``pretty.css``, and the JavaScript files +``animations.js`` and ``actions.js``. + +This static media definition is converted at runtime into a widget property +named ``media``. The media for a CalendarWidget instance can be retrieved +through this property:: + + >>> w = CalendarWidget() + >>> print w.media + <link href="http://media.example.com/pretty.css" type="text/css" media="all" rel="stylesheet" /> + <script type="text/javascript" src="http://media.example.com/animations.js"></script> + <script type="text/javascript" src="http://media.example.com/actions.js"></script> + +Here's a list of all possible ``Media`` options. There are no required options. + +``css`` +~~~~~~~ + +A dictionary describing the CSS files required for various forms of output +media. + +The values in the dictionary should be a tuple/list of file names. See +`the section on media paths`_ for details of how to specify paths to media +files. + +.. _the section on media paths: `Paths in media definitions`_ + +The keys in the dictionary are the output media types. These are the same +types accepted by CSS files in media declarations: 'all', 'aural', 'braille', +'embossed', 'handheld', 'print', 'projection', 'screen', 'tty' and 'tv'. If +you need to have different stylesheets for different media types, provide +a list of CSS files for each output medium. The following example would +provide two CSS options -- one for the screen, and one for print:: + + class Media: + css = { + 'screen': ('pretty.css',), + 'print': ('newspaper.css',) + } + +If a group of CSS files are appropriate for multiple output media types, +the dictionary key can be a comma separated list of output media types. +In the following example, TV's and projectors will have the same media +requirements:: + + class Media: + css = { + 'screen': ('pretty.css',), + 'tv,projector': ('lo_res.css',), + 'print': ('newspaper.css',) + } + +If this last CSS definition were to be rendered, it would become the following HTML:: + + <link href="http://media.example.com/pretty.css" type="text/css" media="screen" rel="stylesheet" /> + <link href="http://media.example.com/lo_res.css" type="text/css" media="tv,projector" rel="stylesheet" /> + <link href="http://media.example.com/newspaper.css" type="text/css" media="print" rel="stylesheet" /> + +``js`` +~~~~~~ + +A tuple describing the required JavaScript files. See +`the section on media paths`_ for details of how to specify paths to media +files. + +``extend`` +~~~~~~~~~~ + +A boolean defining inheritance behavior for media declarations. + +By default, any object using a static media definition will inherit all the +media associated with the parent widget. This occurs regardless of how the +parent defines its media requirements. For example, if we were to extend our +basic Calendar widget from the example above:: + + class FancyCalendarWidget(CalendarWidget): + class Media: + css = { + 'all': ('fancy.css',) + } + js = ('whizbang.js',) + + >>> w = FancyCalendarWidget() + >>> print w.media + <link href="http://media.example.com/pretty.css" type="text/css" media="all" rel="stylesheet" /> + <link href="http://media.example.com/fancy.css" type="text/css" media="all" rel="stylesheet" /> + <script type="text/javascript" src="http://media.example.com/animations.js"></script> + <script type="text/javascript" src="http://media.example.com/actions.js"></script> + <script type="text/javascript" src="http://media.example.com/whizbang.js"></script> + +The FancyCalendar widget inherits all the media from it's parent widget. If +you don't want media to be inherited in this way, add an ``extend=False`` +declaration to the media declaration:: + + class FancyCalendar(Calendar): + class Media: + extend = False + css = { + 'all': ('fancy.css',) + } + js = ('whizbang.js',) + + >>> w = FancyCalendarWidget() + >>> print w.media + <link href="http://media.example.com/fancy.css" type="text/css" media="all" rel="stylesheet" /> + <script type="text/javascript" src="http://media.example.com/whizbang.js"></script> + +If you require even more control over media inheritance, define your media +using a `dynamic property`_. Dynamic properties give you complete control over +which media files are inherited, and which are not. + +.. _dynamic property: `Media as a dynamic property`_ + +Media as a dynamic property +--------------------------- + +If you need to perform some more sophisticated manipulation of media +requirements, you can define the media property directly. This is done +by defining a model property that returns an instance of ``forms.Media``. +The constructor for ``forms.Media`` accepts ``css`` and ``js`` keyword +arguments in the same format as that used in a static media definition. + +For example, the static media definition for our Calendar Widget could +also be defined in a dynamic fashion:: + + class CalendarWidget(forms.TextInput): + def _media(self): + return forms.Media(css={'all': ('pretty.css',)}, + js=('animations.js', 'actions.js')) + media = property(_media) + +See the section on `Media objects`_ for more details on how to construct +return values for dynamic media properties. + +Paths in media definitions +-------------------------- + +Paths used to specify media can be either relative or absolute. If a path +starts with '/', 'http://' or 'https://', it will be interpreted as an absolute +path, and left as-is. All other paths will be prepended with the value of +``settings.MEDIA_URL``. For example, if the MEDIA_URL for your site was +``http://media.example.com/``:: + + class CalendarWidget(forms.TextInput): + class Media: + css = { + 'all': ('/css/pretty.css',), + } + js = ('animations.js', 'http://othersite.com/actions.js') + + >>> w = CalendarWidget() + >>> print w.media + <link href="/css/pretty.css" type="text/css" media="all" rel="stylesheet" /> + <script type="text/javascript" src="http://media.example.com/animations.js"></script> + <script type="text/javascript" src="http://othersite.com/actions.js"></script> + +Media objects +------------- + +When you interrogate the media attribute of a widget or form, the value that +is returned is a ``forms.Media`` object. As we have already seen, the string +representation of a Media object is the HTML required to include media +in the ``<head>`` block of your HTML page. + +However, Media objects have some other interesting properties. + +Media subsets +~~~~~~~~~~~~~ + +If you only want media of a particular type, you can use the subscript operator +to filter out a medium of interest. For example:: + + >>> w = CalendarWidget() + >>> print w.media + <link href="http://media.example.com/pretty.css" type="text/css" media="all" rel="stylesheet" /> + <script type="text/javascript" src="http://media.example.com/animations.js"></script> + <script type="text/javascript" src="http://media.example.com/actions.js"></script> + + >>> print w.media['css'] + <link href="http://media.example.com/pretty.css" type="text/css" media="all" rel="stylesheet" /> + +When you use the subscript operator, the value that is returned is a new +Media object -- but one that only contains the media of interest. + +Combining media objects +~~~~~~~~~~~~~~~~~~~~~~~ + +Media objects can also be added together. When two media objects are added, +the resulting Media object contains the union of the media from both files:: + + class CalendarWidget(forms.TextInput): + class Media: + css = { + 'all': ('pretty.css',) + } + js = ('animations.js', 'actions.js') + + class OtherWidget(forms.TextInput): + class Media: + js = ('whizbang.js',) + + >>> w1 = CalendarWidget() + >>> w2 = OtherWidget() + >>> print w1.media + w2.media + <link href="http://media.example.com/pretty.css" type="text/css" media="all" rel="stylesheet" /> + <script type="text/javascript" src="http://media.example.com/animations.js"></script> + <script type="text/javascript" src="http://media.example.com/actions.js"></script> + <script type="text/javascript" src="http://media.example.com/whizbang.js"></script> + +Media on Forms +-------------- + +Widgets aren't the only objects that can have media definitions -- forms +can also define media. The rules for media definitions on forms are the +same as the rules for widgets: declarations can be static or dynamic; +path and inheritance rules for those declarations are exactly the same. + +Regardless of whether you define a media declaration, *all* Form objects +have a media property. The default value for this property is the result +of adding the media definitions for all widgets that are part of the form:: + + class ContactForm(forms.Form): + date = DateField(widget=CalendarWidget) + name = CharField(max_length=40, widget=OtherWidget) + + >>> f = ContactForm() + >>> f.media + <link href="http://media.example.com/pretty.css" type="text/css" media="all" rel="stylesheet" /> + <script type="text/javascript" src="http://media.example.com/animations.js"></script> + <script type="text/javascript" src="http://media.example.com/actions.js"></script> + <script type="text/javascript" src="http://media.example.com/whizbang.js"></script> + +If you want to associate additional media with a form -- for example, CSS for form +layout -- simply add a media declaration to the form:: + + class ContactForm(forms.Form): + date = DateField(widget=CalendarWidget) + name = CharField(max_length=40, widget=OtherWidget) + + class Media: + css = { + 'all': ('layout.css',) + } + + >>> f = ContactForm() + >>> f.media + <link href="http://media.example.com/pretty.css" type="text/css" media="all" rel="stylesheet" /> + <link href="http://media.example.com/layout.css" type="text/css" media="all" rel="stylesheet" /> + <script type="text/javascript" src="http://media.example.com/animations.js"></script> + <script type="text/javascript" src="http://media.example.com/actions.js"></script> + <script type="text/javascript" src="http://media.example.com/whizbang.js"></script> diff --git a/docs/modelforms.txt b/docs/topics/forms/modelforms.txt similarity index 97% rename from docs/modelforms.txt rename to docs/topics/forms/modelforms.txt index b9495e0acd..f93bd0fbf5 100644 --- a/docs/modelforms.txt +++ b/docs/topics/forms/modelforms.txt @@ -1,6 +1,8 @@ -======================= -Using forms with models -======================= +.. _topics-forms-modelforms: + +========================== +Creating forms from models +========================== ``ModelForm`` ============= @@ -240,15 +242,12 @@ For example:: # Create and save the new author instance. There's no need to do anything else. >>> new_author = f.save() -Other than the ``save()`` and ``save_m2m()`` methods, a ``ModelForm`` -works exactly the same way as any other ``forms`` form. For -example, the ``is_valid()`` method is used to check for validity, the -``is_multipart()`` method is used to determine whether a form requires -multipart file upload (and hence whether ``request.FILES`` must be -passed to the form), etc. See `the standard forms documentation`_ -for more information. - -.. _the standard forms documentation: ../forms/ +Other than the ``save()`` and ``save_m2m()`` methods, a ``ModelForm`` works +exactly the same way as any other ``forms`` form. For example, the +``is_valid()`` method is used to check for validity, the ``is_multipart()`` +method is used to determine whether a form requires multipart file upload (and +hence whether ``request.FILES`` must be passed to the form), etc. See +:ref:`topics-forms-index` for more information. Using a subset of fields on the form ------------------------------------ @@ -378,6 +377,8 @@ There are a couple of things to note, however. Chances are these notes won't affect you unless you're trying to do something tricky with subclassing. +.. _model-formsets: + Model Formsets ============== @@ -459,6 +460,8 @@ to the database. If your formset contains a ``ManyToManyField`` you will also need to make a call to ``formset.save_m2m()`` to ensure the many-to-many relationships are saved properly. +.. _model-formsets-max-num: + Limiting the number of objects editable --------------------------------------- @@ -498,4 +501,4 @@ books of a specific author. Here is how you could accomplish this:: >>> from django.forms.models import inlineformset_factory >>> BookFormSet = inlineformset_factory(Author, Book) >>> author = Author.objects.get(name=u'Orson Scott Card') - >>> formset = BookFormSet(instance=author) + >>> formset = BookFormSet(instance=author) \ No newline at end of file diff --git a/docs/topics/http/_images/middleware.png b/docs/topics/http/_images/middleware.png new file mode 100644 index 0000000000000000000000000000000000000000..505c70ac36f85c9481406a721a778eb4fef8df5c GIT binary patch literal 56301 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 LXMSYNto8p7hPfu2 literal 0 HcmV?d00001 diff --git a/docs/upload_handling.txt b/docs/topics/http/file-uploads.txt similarity index 94% rename from docs/upload_handling.txt rename to docs/topics/http/file-uploads.txt index 488778a4e4..54edd9e72d 100644 --- a/docs/upload_handling.txt +++ b/docs/topics/http/file-uploads.txt @@ -1,16 +1,18 @@ +.. _topics-file-uploads: + ============ File Uploads ============ +.. currentmodule:: django.core.files + **New in Django development version** Most Web sites wouldn't be complete without a way to upload files. When Django handles a file upload, the file data ends up placed in ``request.FILES`` (for -more on the ``request`` object see the documentation for `request and response -objects`_). This document explains how files are stored on disk and in memory, -and how to customize the default behavior. - -.. _request and response objects: ../request_response/#attributes +more on the ``request`` object see the documentation for :ref:`request and +response objects <ref-request-response>`). This document explains how files are +stored on disk and in memory, and how to customize the default behavior. Basic file uploads ================== @@ -29,7 +31,7 @@ other ``FileField`` subclass) in the form. So the data from the above form would be accessible as ``request.FILES['file']``. Most of the time, you'll simply pass the file data from ``request`` into the -form as described in `binding uploaded files to a form`_. This would look +form as described in :ref:`binding-uploaded-files`. This would look something like:: from django.http import HttpResponseRedirect @@ -48,8 +50,6 @@ something like:: form = UploadFileForm() return render_to_response('upload.html', {'form': form}) -.. _binding uploaded files to a form: ../forms/#binding-uploaded-files-to-a- form - Notice that we have to pass ``request.FILES`` into the form's constructor; this is how file data gets bound into a form. @@ -120,7 +120,7 @@ upload behavior. Changing upload handler behavior -------------------------------- -Three `settings`_ control Django's file upload behavior: +Three settings control Django's file upload behavior: ``FILE_UPLOAD_MAX_MEMORY_SIZE`` The maximum size, in bytes, for files that will be uploaded @@ -150,13 +150,13 @@ Three `settings`_ control Django's file upload behavior: Which means "try to upload to memory first, then fall back to temporary files." -.. _settings: ../settings/ - ``UploadedFile`` objects ======================== -In addition to those inherited from `File`_, all ``UploadedFile`` objects define -the following methods/attributes: +.. class:: UploadedFile + +In addition to those inherited from :class:`File`, all ``UploadedFile`` objects +define the following methods/attributes: ``UploadedFile.content_type`` The content-type header uploaded with the file (e.g. ``text/plain`` or @@ -173,8 +173,6 @@ the following methods/attributes: Only files uploaded onto disk will have this method; it returns the full path to the temporary uploaded file. -.. _File: ../files/ - Upload Handlers =============== @@ -206,7 +204,7 @@ would any other list. For instance, suppose you've written a ``ProgressBarUploadHandler`` that provides feedback on upload progress to some sort of AJAX widget. You'd add this -handler to your upload handers like this:: +handler to your upload handlers like this:: request.upload_handlers.insert(0, ProgressBarUploadHandler()) @@ -328,4 +326,3 @@ attributes: Return ``None`` if you want upload handling to continue, or a tuple of ``(POST, FILES)`` if you want to return the new data structures suitable for the request directly. - diff --git a/docs/topics/http/generic-views.txt b/docs/topics/http/generic-views.txt new file mode 100644 index 0000000000..5aa2c48ea5 --- /dev/null +++ b/docs/topics/http/generic-views.txt @@ -0,0 +1,7 @@ +.. _topics-http-generic-views: + +============= +Generic views +============= + +See :ref:`ref-generic-views`. \ No newline at end of file diff --git a/docs/topics/http/index.txt b/docs/topics/http/index.txt new file mode 100644 index 0000000000..ae73c2c29b --- /dev/null +++ b/docs/topics/http/index.txt @@ -0,0 +1,17 @@ +.. _topics-http-index: + +Handling HTTP requests +====================== + +Information on handling HTTP requests in Django: + +.. toctree:: + :maxdepth: 1 + + urls + views + file-uploads + shortcuts + generic-views + middleware + sessions diff --git a/docs/topics/http/middleware.txt b/docs/topics/http/middleware.txt new file mode 100644 index 0000000000..d5b36ea7e3 --- /dev/null +++ b/docs/topics/http/middleware.txt @@ -0,0 +1,169 @@ +.. _topics-http-middleware: + +========== +Middleware +========== + +Middleware is a framework of hooks into Django's request/response processing. +It's a light, low-level "plugin" system for globally altering Django's input +and/or output. + +Each middleware component is responsible for doing some specific function. For +example, Django includes a middleware component, ``XViewMiddleware``, that adds +an ``"X-View"`` HTTP header to every response to a ``HEAD`` request. + +This document explains how middleware works, how you activate middleware, and +how to write your own middleware. Django ships with some built-in middleware you +can use right out of the box; they're documented in the :ref:`built-in +middleware guide <ref-middleware>`. + +Activating middleware +===================== + +To activate a middleware component, add it to the :setting:`MIDDLEWARE_CLASSES` +list in your Django settings. In :setting:`MIDDLEWARE_CLASSES`, each middleware +component is represented by a string: the full Python path to the middleware's +class name. For example, here's the default :setting:`MIDDLEWARE_CLASSES` +created by :djadmin:`django-admin.py startproject <startproject>`:: + + MIDDLEWARE_CLASSES = ( + 'django.middleware.common.CommonMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.middleware.doc.XViewMiddleware', + ) + +During the request phases (:meth:`process_request` and :meth:`process_view` +middleware), Django applies middleware in the order it's defined in +:setting:`MIDDLEWARE_CLASSES`, top-down. During the response phases +(:meth:`process_response` and :meth:`process_exception` middleware), the classes +are applied in reverse order, from the bottom up. You can think of it like an +onion: each middleware class is a "layer" that wraps the view: + +.. image:: _images/middleware.png + :width: 502 + :height: 417 + :alt: Middleware application order. + +A Django installation doesn't require any middleware -- e.g., +:setting:`MIDDLEWARE_CLASSES` can be empty, if you'd like -- but it's strongly +suggested that you at least use +:class:`~django.middleware.common.CommonMiddleware`. + +Writing your own middleware +=========================== + +Writing your own middleware is easy. Each middleware component is a single +Python class that defines one or more of the following methods: + +.. _request-middleware: + +``process_request`` +------------------- + +.. method:: process_request(self, request) + +``request`` is an :class:`~django.http.HttpRequest` object. This method is +called on each request, before Django decides which view to execute. + +``process_request()`` should return either ``None`` or an +:class:`~django.http.HttpResponse` object. If it returns ``None``, Django will +continue processing this request, executing any other middleware and, then, the +appropriate view. If it returns an :class:`~django.http.HttpResponse` object, +Django won't bother calling ANY other request, view or exception middleware, or +the appropriate view; it'll return that :class:`~django.http.HttpResponse`. +Response middleware is always called on every response. + +.. _view-middleware: + +``process_view`` +---------------- + +.. method:: process_view(self, request, view_func, view_args, view_kwargs) + +``request`` is an :class:`~django.http.HttpRequest` object. ``view_func`` is the +Python function that Django is about to use. (It's the actual function object, +not the name of the function as a string.) ``view_args`` is a list of positional +arguments that will be passed to the view, and ``view_kwargs`` is a dictionary +of keyword arguments that will be passed to the view. Neither ``view_args`` nor +``view_kwargs`` include the first view argument (``request``). + +``process_view()`` is called just before Django calls the view. It should return +either ``None`` or an :class:`~django.http. HttpResponse` object. If it returns +``None``, Django will continue processing this request, executing any other +``process_view()`` middleware and, then, the appropriate view. If it returns an +:class:`~django.http. HttpResponse` object, Django won't bother calling ANY +other request, view or exception middleware, or the appropriate view; it'll +return that :class:`~django.http. HttpResponse`. Response middleware is always +called on every response. + +.. _response-middleware: + +``process_response`` +-------------------- + +.. method:: process_response(self, request, response) + +``request`` is an :class:`~django.http.HttpRequest` object. ``response`` is the +:class:`~django.http. HttpResponse` object returned by a Django view. + +``process_response()`` should return an :class:`~django.http. HttpResponse` +object. It could alter the given ``response``, or it could create and return a +brand-new :class:`~django.http. HttpResponse`. + +.. _exception-middleware: + +``process_exception`` +--------------------- + +.. method:: process_exception(self, request, exception) + +``request`` is an :class:`~django.http.HttpRequest` object. ``exception`` is an +``Exception`` object raised by the view function. + +Django calls ``process_exception()`` when a view raises an exception. +``process_exception()`` should return either ``None`` or an +:class:`~django.http. HttpResponse` object. If it returns an +:class:`~django.http. HttpResponse` object, the response will be returned to the +browser. Otherwise, default exception handling kicks in. + +``__init__`` +------------ + +Most middleware classes won't need an initializer since middleware classes are +essentially placeholders for the ``process_*`` methods. If you do need some +global state you may use ``__init__`` to set up. However, keep in mind a couple +of caveats: + + * Django initializes your middleware without any arguments, so you can't + define ``__init__`` as requiring any arguments. + + * Unlike the ``process_*`` methods which get called once per request, + ``__init__`` gets called only *once*, when the web server starts up. + +Marking middleware as unused +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +It's sometimes useful to determine at run-time whether a piece of middleware +should be used. In these cases, your middleware's ``__init__`` method may raise +``django.core.exceptions.MiddlewareNotUsed``. Django will then remove that piece +of middleware from the middleware process. + +Guidelines +---------- + + * Middleware classes don't have to subclass anything. + + * The middleware class can live anywhere on your Python path. All Django + cares about is that the :setting:`MIDDLEWARE_CLASSES` setting includes the + path + to it. + + * Feel free to look at :mod:`Django's available middleware for examples + <django.middleware>`. The core Django middleware classes are in + ``django/middleware/`` in the Django distribution. The session middleware + is in ``django/contrib/sessions``. + + * If you write a middleware component that you think would be useful to + other people, contribute to the community! :ref:`Let us know + <internals-contributing>`, and we'll consider adding it to Django. diff --git a/docs/sessions.txt b/docs/topics/http/sessions.txt similarity index 97% rename from docs/sessions.txt rename to docs/topics/http/sessions.txt index f828c76bde..35dc67658d 100644 --- a/docs/sessions.txt +++ b/docs/topics/http/sessions.txt @@ -1,3 +1,5 @@ +.. _topics-http-sessions: + =================== How to use sessions =================== @@ -10,7 +12,7 @@ Cookies contain a session ID -- not the data itself. Enabling sessions ================= -Sessions are implemented via a piece of middleware_. +Sessions are implemented via a piece of :ref:`middleware <ref-middleware>`. To enable session functionality, do the following: @@ -30,8 +32,6 @@ If you don't want to use sessions, you might as well remove the ``SessionMiddleware`` line from ``MIDDLEWARE_CLASSES`` and ``'django.contrib.sessions'`` from your ``INSTALLED_APPS``. It'll save you a small bit of overhead. -.. _middleware: ../middleware/ - Configuring the session engine ============================== @@ -49,7 +49,7 @@ To use file-based sessions, set the ``SESSION_ENGINE`` setting to ``"django.contrib.sessions.backends.file"``. You might also want to set the ``SESSION_FILE_PATH`` setting (which defaults -to output from ``tempfile.gettempdir()``, most likely ``/tmp``) to control +to output from ``tempfile.gettempdir()``, most likely ``/tmp``) to control where Django stores session files. Be sure to check that your Web server has permissions to read and write to this location. @@ -58,7 +58,7 @@ Using cache-based sessions To store session data using Django's cache system, set ``SESSION_ENGINE`` to ``"django.contrib.sessions.backends.cache"``. You'll want to make sure -you've configured your cache; see the `cache documentation`_ for details. +you've configured your cache; see the :ref:`cache documentation <topics-cache>` for details. .. _cache documentation: ../cache/ @@ -373,7 +373,7 @@ in the past -- but your application may have different requirements. Settings ======== -A few `Django settings`_ give you control over session behavior: +A few :ref:`Django settings <ref-settings>` give you control over session behavior: SESSION_ENGINE -------------- diff --git a/docs/shortcuts.txt b/docs/topics/http/shortcuts.txt similarity index 82% rename from docs/shortcuts.txt rename to docs/topics/http/shortcuts.txt index 005fdc3029..48d294ff4f 100644 --- a/docs/shortcuts.txt +++ b/docs/topics/http/shortcuts.txt @@ -1,3 +1,5 @@ +.. _topics-http-shortcuts: + ========================= Django shortcut functions ========================= @@ -25,14 +27,15 @@ Optional arguments ``dictionary`` A dictionary of values to add to the template context. By default, this is an empty dictionary. If a value in the dictionary is callable, the - view will call it just before rendering the template. + view will call it just before rendering the template. ``context_instance`` The context instance to render the template with. By default, the template will be rendered with a ``Context`` instance (filled with values from - ``dictionary``). If you need to use `context processors`_, render the - template with a ``RequestContext`` instance instead. Your code might look - something like this:: + ``dictionary``). If you need to use :ref:`context processors + <subclassing-context-requestcontext>`, render the template with a + ``RequestContext`` instance instead. Your code might look something like + this:: return render_to_response('my_template.html', my_data_dictionary, @@ -43,8 +46,6 @@ Optional arguments resulting document. Defaults to the value of the ``DEFAULT_CONTENT_TYPE`` setting. -.. _`context processors`: ../templates_python/#subclassing-context-requestcontext - Example ------- @@ -73,9 +74,9 @@ This example is equivalent to:: ``get_object_or_404`` ===================== -``django.shortcuts.get_object_or_404`` calls `get()`_ on a given model -manager, but it raises ``django.http.Http404`` instead of the model's -``DoesNotExist`` exception. +``django.shortcuts.get_object_or_404`` calls +:meth:`~django.db.models.QuerySet.get()` on a given model manager, but it raises +``django.http.Http404`` instead of the model's ``DoesNotExist`` exception. Required arguments ------------------ @@ -112,14 +113,12 @@ This example is equivalent to:: Note: As with ``get()``, an ``MultipleObjectsReturned`` exception will be raised if more than one object is found. -.. _get(): ../db-api/#get-kwargs - ``get_list_or_404`` =================== -``django.shortcuts.get_list_or_404`` returns the result of `filter()`_ on a -given model manager, raising ``django.http.Http404`` if the resulting list is -empty. +``django.shortcuts.get_list_or_404`` returns the result of +:meth:`~django.db.models.QuerySet.filter()` on a given model manager, raising +``django.http.Http404`` if the resulting list is empty. Required arguments ------------------ @@ -149,6 +148,4 @@ This example is equivalent to:: def my_view(request): my_objects = MyModel.objects.filter(published=True) if not my_objects: - raise Http404 - -.. _filter(): ../db-api/#filter-kwargs + raise Http404 \ No newline at end of file diff --git a/docs/url_dispatch.txt b/docs/topics/http/urls.txt similarity index 92% rename from docs/url_dispatch.txt rename to docs/topics/http/urls.txt index 266e4a5799..8c575cfcb5 100644 --- a/docs/url_dispatch.txt +++ b/docs/topics/http/urls.txt @@ -1,3 +1,5 @@ +.. _topics-http-urls: + ============== URL dispatcher ============== @@ -26,6 +28,8 @@ This mapping can be as short or as long as needed. It can reference other mappings. And, because it's pure Python code, it can be constructed dynamically. +.. _how-django-processes-a-request: + How Django processes a request ============================== @@ -33,22 +37,21 @@ When a user requests a page from your Django-powered site, this is the algorithm the system follows to determine which Python code to execute: 1. Django determines the root URLconf module to use. Ordinarily, - this is the value of the ``ROOT_URLCONF`` setting in your - `settings file`_, but if the incoming ``HttpRequest`` object - has an attribute called ``urlconf``, its value will be used in - place of the ``ROOT_URLCONF`` setting. + this is the value of the ``ROOT_URLCONF`` setting, but if the incoming + ``HttpRequest`` object has an attribute called ``urlconf``, its value + will be used in place of the ``ROOT_URLCONF`` setting. + 2. Django loads that Python module and looks for the variable ``urlpatterns``. This should be a Python list, in the format returned by the function ``django.conf.urls.defaults.patterns()``. + 3. Django runs through each URL pattern, in order, and stops at the first one that matches the requested URL. + 4. Once one of the regexes matches, Django imports and calls the given - view, which is a simple Python function. The view gets passed a - `request object`_ as its first argument and any values captured in the - regex as remaining arguments. - -.. _settings file: ../settings/ -.. _request object: ../request_response/#httprequest-objects + view, which is a simple Python function. The view gets passed an + :class:`~django.http.HttpRequest`` as its first argument and any values + captured in the regex as remaining arguments. Example ======= @@ -306,7 +309,7 @@ The view prefix You can specify a common prefix in your ``patterns()`` call, to cut down on code duplication. -Here's the example URLconf from the `Django overview`_:: +Here's the example URLconf from the :ref:`Django overview <intro-overview>`:: from django.conf.urls.defaults import * @@ -334,8 +337,6 @@ With this in mind, the above example can be written more concisely as:: Note that you don't put a trailing dot (``"."``) in the prefix. Django puts that in automatically. -.. _Django overview: ../overview/ - Multiple view prefixes ---------------------- @@ -432,11 +433,9 @@ In this example, for a request to ``/blog/2005/``, Django will call the year='2005', foo='bar' -This technique is used in `generic views`_ and in the `syndication framework`_ -to pass metadata and options to views. - -.. _generic views: ../generic_views/ -.. _syndication framework: ../syndication_feeds/ +This technique is used in :ref:`generic views <ref-generic-views>` and in the +:ref:`syndication framework <ref-contrib-syndication>` to pass metadata and +options to views. .. admonition:: Dealing with conflicts @@ -483,7 +482,7 @@ Set two:: Note that extra options will *always* be passed to *every* line in the included URLconf, regardless of whether the line's view actually accepts those options as valid. For this reason, this technique is only useful if you're certain that -every view in the the included URLconf accepts the extra options you're passing. +every view in the included URLconf accepts the extra options you're passing. Passing callable objects instead of strings =========================================== @@ -528,6 +527,8 @@ The style you use is up to you. Note that if you use this technique -- passing objects rather than strings -- the view prefix (as explained in "The view prefix" above) will have no effect. +.. _naming-url-patterns: + Naming URL patterns =================== @@ -543,10 +544,10 @@ view:: ) This is completely valid, but it leads to problems when you try to do reverse -URL matching (through the ``permalink()`` decorator or the ``{% url %}`` -`template tag`_). Continuing this example, if you wanted to retrieve the URL for -the ``archive`` view, Django's reverse URL matcher would get confused, because -*two* URLpatterns point at that view. +URL matching (through the ``permalink()`` decorator or the :ttag:`url` template +tag. Continuing this example, if you wanted to retrieve the URL for the +``archive`` view, Django's reverse URL matcher would get confused, because *two* +URLpatterns point at that view. To solve this problem, Django supports **named URL patterns**. That is, you can give a name to a URL pattern in order to distinguish it from other patterns @@ -561,7 +562,9 @@ Here's the above example, rewritten to used named URL patterns:: ) With these names in place (``full-archive`` and ``arch-summary``), you can -target each pattern individually by using its name:: +target each pattern individually by using its name: + +.. code-block:: html+django {% url arch-summary 1945 %} {% url full-archive 2007 %} @@ -584,15 +587,13 @@ not restricted to valid Python names. name, will decrease the chances of collision. We recommend something like ``myapp-comment`` instead of ``comment``. -.. _template tag: ../templates/#url - Utility methods =============== reverse() --------- -If you need to use something similar to the ``{% url %}`` `template tag`_ in +If you need to use something similar to the :ttag:`url` template tag in your code, Django provides the ``django.core.urlresolvers.reverse()``. The ``reverse()`` function has the following signature:: @@ -614,9 +615,6 @@ arguments to use in the URL matching. For example:: permalink() ----------- -The ``permalink()`` decorator is useful for writing short methods that return -a full URL path. For example, a model's ``get_absolute_url()`` method. Refer -to the `model API documentation`_ for more information about ``permalink()``. - -.. _model API documentation: ../model-api/#the-permalink-decorator - +The :func:`django.db.models.permalink` decorator is useful for writing short +methods that return a full URL path. For example, a model's +``get_absolute_url()`` method. See :func:`django.db.models.permalink` for more. diff --git a/docs/topics/http/views.txt b/docs/topics/http/views.txt new file mode 100644 index 0000000000..3b981c0442 --- /dev/null +++ b/docs/topics/http/views.txt @@ -0,0 +1,186 @@ +.. _topics-http-views: + +============= +Writing Views +============= + +A view function, or *view* for short, is simply a Python function that takes a +Web request and returns a Web response. This response can be the HTML contents +of a Web page, or a redirect, or a 404 error, or an XML document, or an image . +. . or anything, really. The view itself contains whatever arbitrary logic is +necessary to return that response. This code can live anywhere you want, as long +as it's on your Python path. There's no other requirement--no "magic," so to +speak. For the sake of putting the code *somewhere*, let's create a file called +``views.py`` in the ``mysite`` directory, which you created in the previous +chapter. + +A simple view +============= + +Here's a view that returns the current date and time, as an HTML document: + +.. code-block:: python + + from django.http import HttpResponse + import datetime + + def current_datetime(request): + now = datetime.datetime.now() + html = "<html><body>It is now %s.</body></html>" % now + return HttpResponse(html) + +Let's step through this code one line at a time: + + * First, we import the class ``HttpResponse``, which lives in the + ``django.http`` module, along with Python's ``datetime`` library. + + * Next, we define a function called ``current_datetime``. This is the view + function. Each view function takes an ``HttpRequest`` object as its first + parameter, which is typically named ``request``. + + Note that the name of the view function doesn't matter; it doesn't have to + be named in a certain way in order for Django to recognize it. We're + calling it ``current_datetime`` here, because that name clearly indicates + what it does. + + * The view returns an ``HttpResponse`` object that contains the + generated response. Each view function is responsible for returning an + ``HttpResponse`` object. (There are exceptions, but we'll get to those + later.) + +.. admonition:: Django's Time Zone + + Django includes a ``TIME_ZONE`` setting that defaults to + ``America/Chicago``. This probably isn't where you live, so you might want + to change it in your settings file. + +Mapping URLs to Views +===================== + +So, to recap, this view function returns an HTML page that includes the current +date and time. To display this view at a particular URL, you'll need to create a +*URLconf*; see :ref:`topics-http-urls` for instructions. + +Returning errors +================ + +Returning HTTP error codes in Django is easy. We've already mentioned the +:class:`HttpResponseNotFound`, :class:`HttpResponseForbidden`, +:class:`HttpResponseServerError`, etc., subclasses; just return an instance of one +of those subclasses instead of a normal :class:`HttpResponse` in order to signify +an error. For example:: + + def my_view(request): + # ... + if foo: + return HttpResponseNotFound('<h1>Page not found</h1>') + else: + return HttpResponse('<h1>Page was found</h1>') + +Because 404 errors are by far the most common HTTP error, there's an easier way +to handle those errors. + +The Http404 exception +--------------------- + +When you return an error such as ``HttpResponseNotFound``, you're responsible +for defining the HTML of the resulting error page:: + + return HttpResponseNotFound('<h1>Page not found</h1>') + +For convenience, and because it's a good idea to have a consistent 404 error page +across your site, Django provides an ``Http404`` exception. If you raise +``Http404`` at any point in a view function, Django will catch it and return the +standard error page for your application, along with an HTTP error code 404. + +Example usage:: + + from django.http import Http404 + + def detail(request, poll_id): + try: + p = Poll.objects.get(pk=poll_id) + except Poll.DoesNotExist: + raise Http404 + return render_to_response('polls/detail.html', {'poll': p}) + +In order to use the ``Http404`` exception to its fullest, you should create a +template that is displayed when a 404 error is raised. This template should be +called ``404.html`` and located in the top level of your template tree. + +Customizing error views +======================= + +The 404 (page not found) view +----------------------------- + +When you raise an ``Http404`` exception, Django loads a special view devoted +to handling 404 errors. By default, it's the view +``django.views.defaults.page_not_found``, which loads and renders the template +``404.html``. + +This means you need to define a ``404.html`` template in your root template +directory. This template will be used for all 404 errors. + +This ``page_not_found`` view should suffice for 99% of Web applications, but if +you want to override the 404 view, you can specify ``handler404`` in your +URLconf, like so:: + + handler404 = 'mysite.views.my_custom_404_view' + +Behind the scenes, Django determines the 404 view by looking for ``handler404``. +By default, URLconfs contain the following line:: + + from django.conf.urls.defaults import * + +That takes care of setting ``handler404`` in the current module. As you can see +in ``django/conf/urls/defaults.py``, ``handler404`` is set to +``'django.views.defaults.page_not_found'`` by default. + +Three things to note about 404 views: + + * The 404 view is also called if Django doesn't find a match after checking + every regular expression in the URLconf. + + * If you don't define your own 404 view -- and simply use the + default, which is recommended -- you still have one obligation: + you must create a ``404.html`` template in the root of your + template directory. The default 404 view will use that template + for all 404 errors. The default 404 view will pass one variable + to the template: ``request_path``, which is the URL that resulted + in the 404. + + * The 404 view is passed a ``RequestContext`` and will have access to + variables supplied by your ``TEMPLATE_CONTEXT_PROCESSORS`` setting (e.g., + ``MEDIA_URL``). + + * If ``DEBUG`` is set to ``True`` (in your settings module), then your 404 + view will never be used, and the traceback will be displayed instead. + +The 500 (server error) view +---------------------------- + +Similarly, Django executes special-case behavior in the case of runtime errors +in view code. If a view results in an exception, Django will, by default, call +the view ``django.views.defaults.server_error``, which loads and renders the +template ``500.html``. + +This means you need to define a ``500.html`` template in your root template +directory. This template will be used for all server errors. The default 500 +view passes no variables to this template and is rendered with an empty +``Context`` to lessen the chance of additional errors. + +This ``server_error`` view should suffice for 99% of Web applications, but if +you want to override the view, you can specify ``handler500`` in your +URLconf, like so:: + + handler500 = 'mysite.views.my_custom_error_view' + +Behind the scenes, Django determines the error view by looking for ``handler500``. +By default, URLconfs contain the following line:: + + from django.conf.urls.defaults import * + +That takes care of setting ``handler500`` in the current module. As you can see +in ``django/conf/urls/defaults.py``, ``handler500`` is set to +``'django.views.defaults.server_error'`` by default. diff --git a/docs/i18n.txt b/docs/topics/i18n.txt similarity index 94% rename from docs/i18n.txt rename to docs/topics/i18n.txt index 62d78fb224..5103cb873c 100644 --- a/docs/i18n.txt +++ b/docs/topics/i18n.txt @@ -1,3 +1,5 @@ +.. _topics-i18n: + ==================== Internationalization ==================== @@ -33,15 +35,13 @@ If you don't need internationalization in your app Django's internationalization hooks are on by default, and that means there's a bit of i18n-related overhead in certain places of the framework. If you don't use internationalization, you should take the two seconds to set -``USE_I18N = False`` in your settings file. If ``USE_I18N`` is set to -``False``, then Django will make some optimizations so as not to load the -internationalization machinery. See the `documentation for USE_I18N`_. +:setting:`USE_I18N = False <USE_I18N>` in your settings file. If +:setting:`USE_I18N` is set to ``False``, then Django will make some +optimizations so as not to load the internationalization machinery. You'll probably also want to remove ``'django.core.context_processors.i18n'`` from your ``TEMPLATE_CONTEXT_PROCESSORS`` setting. -.. _documentation for USE_I18N: ../settings/#use-i18n - If you do need internationalization: three steps ================================================ @@ -154,6 +154,8 @@ language because they are exchanged over systems or users -- such as strings in a database -- but should be translated at the last possible point in time, such as when the string is presented to the user. +.. _lazy-translations: + Lazy translation ~~~~~~~~~~~~~~~~ @@ -180,10 +182,10 @@ If you don't like the verbose name ``ugettext_lazy``, you can just alias it as class MyThing(models.Model): name = models.CharField(help_text=_('This is the help text')) -Always use lazy translations in `Django models`_. It's a good idea to add -translations for the field names and table names, too. This means writing -explicit ``verbose_name`` and ``verbose_name_plural`` options in the ``Meta`` -class, though:: +Always use lazy translations in :ref:`Django models <topics-db-models>`. It's a +good idea to add translations for the field names and table names, too. This +means writing explicit ``verbose_name`` and ``verbose_name_plural`` options in +the ``Meta`` class, though:: from django.utils.translation import ugettext_lazy as _ @@ -193,8 +195,6 @@ class, though:: verbose_name = _('my thing') verbose_name_plural = _('mythings') -.. _Django models: ../model-api/ - Pluralization ~~~~~~~~~~~~~ @@ -215,9 +215,9 @@ translation languages as the ``count`` variable). In template code ---------------- -Translations in `Django templates`_ uses two template tags and a slightly -different syntax than in Python code. To give your template access to these -tags, put ``{% load i18n %}`` toward the top of your template. +Translations in :ref:`Django templates <topics-templates>` uses two template +tags and a slightly different syntax than in Python code. To give your template +access to these tags, put ``{% load i18n %}`` toward the top of your template. The ``{% trans %}`` template tag translates a constant string or a variable content:: @@ -268,11 +268,12 @@ Each ``RequestContext`` has access to three translation-specific variables: * ``LANGUAGES`` is a list of tuples in which the first element is the language code and the second is the language name (translated into the currently active locale). + * ``LANGUAGE_CODE`` is the current user's preferred language, as a string. Example: ``en-us``. (See "How language preference is discovered", below.) * ``LANGUAGE_BIDI`` is the current locale's direction. If True, it's a - right-to-left language, e.g: Hebrew, Arabic. If False it's a - left-to-right language, e.g: English, French, German etc. + right-to-left language, e.g.: Hebrew, Arabic. If False it's a + left-to-right language, e.g.: English, French, German etc. If you don't use the ``RequestContext`` extension, you can get those values with @@ -345,7 +346,7 @@ object. You don't want to convert it to a string immediately, because you might be using this function outside of a view (and hence the current thread's locale setting will not be correct). -For cases like this, use the ``django.utils.functional.allow_lazy()`` +For cases like this, use the ``django.utils.functional.allow_lazy()`` decorator. It modifies the function so that *if* it's called with a lazy translation as the first argument, the function evaluation is delayed until it needs to be converted to a string. @@ -368,6 +369,8 @@ Using this decorator means you can write your function and assume that the input is a proper string, then add support for lazy translation objects at the end. +.. _how-to-create-language-files: + 2. How to create language files =============================== @@ -394,7 +397,7 @@ available translation strings and how they should be represented in the given language. Message files have a ``.po`` file extension. Django comes with a tool, ``django-admin.py makemessages``, that automates the -creation and upkeep of these files. +creation and upkeep of these files. .. admonition:: A note to Django veterans @@ -451,7 +454,7 @@ When `creating JavaScript translation catalogs`_ you need to use the special .. admonition:: Working on Windows? - If you're using Windows and need to install the GNU gettext utilites so + If you're using Windows and need to install the GNU gettext utilities so ``django-admin makemessages`` works see `gettext on Windows`_ for more information. @@ -513,6 +516,7 @@ Do this with the ``django-admin.py compilemessages`` utility. This tool runs over all available ``.po`` files and creates ``.mo`` files, which are binary files optimized for use by ``gettext``. In the same directory + from which you ran ``django-admin.py makemessages``, run ``django-admin.py compilemessages`` like this:: @@ -529,14 +533,12 @@ That's it. Your translations are ready for use. .. admonition:: A note to translators If you've created a translation in a language Django doesn't yet support, - please let us know! See `Submitting and maintaining translations`_ for - the steps to take. - - .. _Submitting and maintaining translations: ../contributing/ + please let us know! See :ref:`contributing-translations` for the steps to + take. .. admonition:: Working on Windows? - If you're using Windows and need to install the GNU gettext utilites so + If you're using Windows and need to install the GNU gettext utilities so ``django-admin compilemessages`` works see `gettext on Windows`_ for more information. @@ -550,9 +552,9 @@ for your app. Behind the scenes, Django has a very flexible model of deciding which language should be used -- installation-wide, for a particular user, or both. -To set an installation-wide language preference, set ``LANGUAGE_CODE`` in your -`settings file`_. Django uses this language as the default translation -- the -final attempt if no other translator finds a translation. +To set an installation-wide language preference, set :setting:`LANGUAGE_CODE`. +Django uses this language as the default translation -- the final attempt if no +other translator finds a translation. If all you want to do is run Django with your native language, and a language file is available for your language, all you need to do is set @@ -579,13 +581,14 @@ For example, your ``MIDDLEWARE_CLASSES`` might look like this:: 'django.middleware.common.CommonMiddleware', ) -(For more on middleware, see the `middleware documentation`_.) +(For more on middleware, see the :ref:`middleware documentation +<topics-http-middleware>`.) ``LocaleMiddleware`` tries to determine the user's language preference by following this algorithm: - * First, it looks for a ``django_language`` key in the the current user's - `session`_. + * First, it looks for a ``django_language`` key in the current user's + session. * Failing that, it looks for a cookie that is named according to your ``LANGUAGE_COOKIE_NAME`` setting. (The default name is ``django_language``, and this setting is new in the Django development version. In Django version 0.96 and before, the cookie's name is hard-coded to ``django_language``.) * Failing that, it looks at the ``Accept-Language`` HTTP header. This header is sent by your browser and tells the server which language(s) you @@ -602,7 +605,7 @@ Notes: Django uses the base language. For example, if a user specifies ``de-at`` (Austrian German) but Django only has ``de`` available, Django uses ``de``. - * Only languages listed in the `LANGUAGES setting`_ can be selected. If + * Only languages listed in the :setting:`LANGUAGES` setting can be selected. If you want to restrict the language selection to a subset of provided languages (because your application doesn't provide all those languages), set ``LANGUAGES`` to a list of languages. For example:: @@ -661,8 +664,9 @@ Notes: is identical to the format strings used by the ``now`` template tag. Once ``LocaleMiddleware`` determines the user's preference, it makes this -preference available as ``request.LANGUAGE_CODE`` for each `request object`_. -Feel free to read this value in your view code. Here's a simple example:: +preference available as ``request.LANGUAGE_CODE`` for each +:class:`~django.http.HttpRequest`. Feel free to read this value in your view +code. Here's a simple example:: def hello_world(request, count): if request.LANGUAGE_CODE == 'de-at': @@ -679,6 +683,8 @@ in ``request.LANGUAGE_CODE``. .. _session: ../sessions/ .. _request object: ../request_response/#httprequest-objects +.. _translations-in-your-own-projects: + Using translations in your own projects ======================================= @@ -698,14 +704,12 @@ message file. The choice is yours. .. note:: - If you're using manually configured settings, as described in the - `settings documentation`_, the ``locale`` directory in the project - directory will not be examined, since Django loses the ability to work out - the location of the project directory. (Django normally uses the location - of the settings file to determine this, and a settings file doesn't exist - if you're manually configuring your settings.) - -.. _settings documentation: ../settings/#using-settings-without-setting-django-settings-module + If you're using manually configured settings, as described + :ref:`settings-without-django-settings-module`, the ``locale`` directory in + the project directory will not be examined, since Django loses the ability + to work out the location of the project directory. (Django normally uses the + location of the settings file to determine this, and a settings file doesn't + exist if you're manually configuring your settings.) All message file repositories are structured the same way. They are: @@ -740,6 +744,7 @@ project message file that are already in application message files. The easiest way out is to store applications that are not part of the project (and so carry their own translations) outside the project tree. That way, + ``django-admin.py makemessages`` on the project level will only translate strings that are connected to your explicit project and not strings that are distributed independently. @@ -897,6 +902,7 @@ Creating JavaScript translation catalogs ---------------------------------------- You create and update the translation catalogs the same way as the other + Django translation catalogs -- with the django-admin.py makemessages tool. The only difference is you need to provide a ``-d djangojs`` parameter, like this:: @@ -915,7 +921,7 @@ does translation: * The string domain is ``django`` or ``djangojs``. This string domain is used to differentiate between different programs that store their data in a common message-file library (usually ``/usr/share/locale/``). The - ``django`` domain is used for Python and template translation strings + ``django`` domain is used for python and template translation strings and is loaded into the global translation catalogs. The ``djangojs`` domain is only used for JavaScript translation catalogs to make sure that those are as small as possible. diff --git a/docs/topics/index.txt b/docs/topics/index.txt new file mode 100644 index 0000000000..702c02f676 --- /dev/null +++ b/docs/topics/index.txt @@ -0,0 +1,25 @@ +.. _topics-index: + +Using Django +============ + +Introductions to all the key parts of Django you'll need to know: + +.. toctree:: + :maxdepth: 1 + + install + db/index + http/index + forms/index + forms/modelforms + templates + files + testing + auth + cache + email + i18n + pagination + serialization + settings \ No newline at end of file diff --git a/docs/install.txt b/docs/topics/install.txt similarity index 88% rename from docs/install.txt rename to docs/topics/install.txt index cd21bd7ec1..07cb256573 100644 --- a/docs/install.txt +++ b/docs/topics/install.txt @@ -1,3 +1,5 @@ +.. _topics-install: + ===================== How to install Django ===================== @@ -18,7 +20,7 @@ Install Apache and mod_python ============================= If you just want to experiment with Django, skip ahead to the next -section; Django includes a lightweight Web server you can use for +section; Django includes a lightweight web server you can use for testing, so you won't need to set up Apache until you're ready to deploy Django in production. @@ -29,8 +31,8 @@ the life of an Apache process, which leads to significant performance gains over other server arrangements. Make sure you have Apache installed, with the mod_python module activated. Django requires Apache 2.x and mod_python 3.x. -See `How to use Django with mod_python`_ for information on how to configure -mod_python once you have it installed. +See :ref:`How to use Django with mod_python <howto-deployment-modpython>` for +information on how to configure mod_python once you have it installed. If you can't use mod_python for some reason, fear not: Django follows the WSGI_ spec, which allows it to run on a variety of server platforms. See the @@ -40,9 +42,10 @@ each platform. .. _Apache: http://httpd.apache.org/ .. _mod_python: http://www.modpython.org/ .. _WSGI: http://www.python.org/peps/pep-0333.html -.. _How to use Django with mod_python: ../modpython/ .. _server-arrangements wiki page: http://code.djangoproject.com/wiki/ServerArrangements +.. _database-installation: + Get your database running ========================= @@ -60,16 +63,18 @@ installed. If you're on Windows, check out the unofficial `compiled Windows version`_. -* If you're using MySQL, you'll need MySQLdb_, version 1.2.1p2 or higher. - You will also want to read the database-specific notes for the `MySQL backend`_. +* If you're using MySQL, you'll need MySQLdb_, version 1.2.1p2 or higher. You + will also want to read the database-specific notes for the :ref:`MySQL + backend <ref-databases>`. * If you're using SQLite and either Python 2.3 or Python 2.4, you'll need pysqlite_. Use version 2.0.3 or higher. Python 2.5 ships with an SQLite wrapper in the standard library, so you don't need to install anything extra in that case. -* If you're using Oracle, you'll need cx_Oracle_, version 4.3.1 or higher. - You will also want to read the database-specific notes for the `Oracle backend`_. +* If you're using Oracle, you'll need cx_Oracle_, version 4.3.1 or higher. You + will also want to read the database-specific notes for the :ref:`Oracle + backend <oracle-notes>`. If you plan to use Django's ``manage.py syncdb`` command to automatically create database tables for your models, you'll need to @@ -80,7 +85,7 @@ can simply grant Django ``SELECT``, ``INSERT``, ``UPDATE`` and ``ALTER TABLE`` privileges during ``syncdb`` but won't issue ``ALTER TABLE`` statements on a table once ``syncdb`` has created it. -If you're using Django's `testing framework`_ to test database queries, +If you're using Django's :ref:`testing framework<topics-testing>` to test database queries, Django will need permission to create a test database. .. _PostgreSQL: http://www.postgresql.org/ @@ -91,11 +96,10 @@ Django will need permission to create a test database. .. _MySQLdb: http://sourceforge.net/projects/mysql-python .. _SQLite: http://www.sqlite.org/ .. _pysqlite: http://initd.org/tracker/pysqlite -.. _MySQL backend: ../databases/ .. _cx_Oracle: http://cx-oracle.sourceforge.net/ .. _Oracle: http://www.oracle.com/ -.. _Oracle backend: ../databases/#oracle-notes -.. _testing framework: ../testing/ + +.. _removing-old-versions-of-django: Remove any old versions of Django ================================= @@ -116,7 +120,9 @@ This file should also be located in your ``site-packages`` directory. The location of the ``site-packages`` directory depends on the operating system, and the location in which Python was installed. To find out your - system's ``site-packages`` location, execute the following:: + system's ``site-packages`` location, execute the following: + + .. code-block:: bash python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()" @@ -127,7 +133,7 @@ Install the Django code ======================= Installation instructions are slightly different depending on whether you're -installing a distribution-specific package, downloading the the latest official +installing a distribution-specific package, downloading the latest official release, or fetching the latest development version. It's easy, no matter which way you choose. @@ -135,10 +141,12 @@ It's easy, no matter which way you choose. Installing a distribution-specific package ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Check the `distribution specific notes`_ to see if your +Check the :ref:`distribution specific notes <misc-distributions>` to see if your platform/distribution provides official Django packages/installers. -Distribution-provided packages will typically allow for automatic -installation of dependencies and easy upgrade paths. +Distribution-provided packages will typically allow for automatic installation +of dependencies and easy upgrade paths. + +.. _installing-official-release: Installing an official release ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -160,10 +168,11 @@ Installing an official release These commands will install Django in your Python installation's ``site-packages`` directory. -.. _distribution specific notes: ../distributions/ .. _bsdtar: http://gnuwin32.sourceforge.net/packages/bsdtar.htm .. _7-zip: http://www.7-zip.org/ +.. _installing-development-version: + Installing the development version ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -188,13 +197,17 @@ latest bug fixes and improvements, follow these instructions: commands from a shell. (Enter ``svn help`` at a shell prompt to test this.) -2. Check out Django's main development branch (the 'trunk') like so:: +2. Check out Django's main development branch (the 'trunk') like so: + + .. code-block:: bash svn co http://code.djangoproject.com/svn/django/trunk/ django-trunk 3. Next, make sure that the Python interpreter can load Django's code. There are various ways of accomplishing this. One of the most convenient, on - Linux, Mac OSX or other Unix-like systems, is to use a symbolic link:: + Linux, Mac OSX or other Unix-like systems, is to use a symbolic link: + + .. code-block:: bash ln -s `pwd`/django-trunk/django SITE-PACKAGES-DIR/django @@ -216,13 +229,14 @@ latest bug fixes and improvements, follow these instructions: Apache configuration file. More information about deployment is available, of course, in our - `How to use Django with mod_python`_ documentation. - - .. _How to use Django with mod_python: ../modpython/ + :ref:`How to use Django with mod_python <howto-deployment-modpython>` + documentation. 4. On Unix-like systems, create a symbolic link to the file ``django-trunk/django/bin/django-admin.py`` in a directory on your system - path, such as ``/usr/local/bin``. For example:: + path, such as ``/usr/local/bin``. For example: + + .. code-block:: bash ln -s `pwd`/django-trunk/django/bin/django-admin.py /usr/local/bin diff --git a/docs/pagination.txt b/docs/topics/pagination.txt similarity index 62% rename from docs/pagination.txt rename to docs/topics/pagination.txt index c36f56244f..8911e67bbb 100644 --- a/docs/pagination.txt +++ b/docs/topics/pagination.txt @@ -1,17 +1,22 @@ +.. _topics-pagination: + ========== Pagination ========== +.. module:: django.core.paginator + :synopsis: Classes to help you easily manage paginated data. + **New in Django development version** Django provides a few classes that help you manage paginated data -- that is, data that's split across several pages, with "Previous/Next" links. These -classes live in the module ``django/core/paginator.py``. +classes live in the module :file:`django/core/paginator.py`. Example ======= -Give ``Paginator`` a list of objects, plus the number of items you'd like to +Give :class:`Paginator` a list of objects, plus the number of items you'd like to have on each page, and it gives you methods for accessing the items for each page:: @@ -59,9 +64,21 @@ page:: ... InvalidPage + Note that you can give ``Paginator`` a list/tuple, a Django ``QuerySet``, or + any other object with a ``count()`` or ``__len__()`` method. When + determining the number of objects contained in the passed object, + ``Paginator`` will first try calling ``count()``, then fallback to using + ``len()`` if the passed object has no ``count()`` method. This allows + objects such as Django's ``QuerySet`` to use a more efficient ``count()`` + method when available. + ``Paginator`` objects ===================== +The :class:`Paginator` class has this constructor: + +.. class:: Paginator(object_list, per_page, orphans=0, allow_empty_first_page=True) + Required arguments ------------------ @@ -93,30 +110,33 @@ Optional arguments Methods ------- -``page(number)`` - Returns a ``Page`` object with the given 1-based index. Raises - ``InvalidPage`` if the given page number doesn't exist. +.. method:: Paginator.page(number) + + Returns a :class:`Page` object with the given 1-based index. Raises + :exc:`InvalidPage` if the given page number doesn't exist. Attributes ---------- -In addition to the arguments above, which get stored as attributes, a -``Paginator`` object also has the following attributes: - -``count`` +.. attribute:: Paginator.count + The total number of objects, across all pages. + + .. note:: - **Note**: When determining the number of objects contained in - ``object_list``, ``Paginator`` will first try calling - ``object_list.count()``. If ``object_list`` has no ``count()`` method, then - ``Paginator`` will fallback to using ``object_list.__len__()``. This allows - objects, such as Django's ``QuerySet``, to use a more efficient ``count()`` - method when available. - -``num_pages`` + When determining the number of objects contained in ``object_list``, + ``Paginator`` will first try calling ``object_list.count()``. If + ``object_list`` has no ``count()`` method, then ``Paginator`` will + fallback to using ``object_list.__len__()``. This allows objects, such + as Django's ``QuerySet``, to use a more efficient ``count()`` method + when available. + +.. attribute:: Paginator.num_pages + The total number of pages. - -``page_range`` + +.. attribute:: Paginator.page_range + A 1-based range of page numbers, e.g., ``[1, 2, 3, 4]``. ``InvalidPage`` exceptions @@ -137,49 +157,67 @@ either of the following exceptions: Both of the exceptions are subclasses of ``InvalidPage``, so you can handle them both with a simple ``except InvalidPage``. + ``Page`` objects ================ +.. class:: Page(object_list, number, paginator): + +You usually won't construct :class:`Pages <Page>` by hand -- you'll get them +using :meth:`Paginator.page`. + + Methods ------- -``has_next()`` +.. method:: Page.has_next() + Returns ``True`` if there's a next page. - -``has_previous()`` + +.. method:: Page.has_previous() + Returns ``True`` if there's a previous page. - -``has_other_pages()`` + +.. method:: Page.has_other_pages() + Returns ``True`` if there's a next *or* previous page. - -``next_page_number()`` + +.. method:: Page.next_page_number() + Returns the next page number. Note that this is "dumb" and will return the next page number regardless of whether a subsequent page exists. - -``previous_page_number()`` + +.. method:: Page.previous_page_number() + Returns the previous page number. Note that this is "dumb" and will return the previous page number regardless of whether a previous page exists. - -``start_index()`` + +.. method:: Page.start_index() + Returns the 1-based index of the first object on the page, relative to all of the objects in the paginator's list. For example, when paginating a list - of 5 objects with 2 objects per page, the second page's ``start_index()`` + of 5 objects with 2 objects per page, the second page's :meth:`~Page.start_index` would return ``3``. - -``end_index()`` - Returns the 1-based index of the last object on the page, relative to all - of the objects in the paginator's list. For example, when paginating a list - of 5 objects with 2 objects per page, the second page's ``end_index()`` + +.. method:: Page.end_index() + + Returns the 1-based index of the last object on the page, relative to all of + the objects in the paginator's list. For example, when paginating a list of + 5 objects with 2 objects per page, the second page's :meth:`~Page.end_index` would return ``4``. Attributes ---------- -``object_list`` +.. attribute:: Page.object_list + The list of objects on this page. - -``number`` + +.. attribute:: Page.number + The 1-based page number for this page. + +.. attribute:: Page.paginator + + The associated :class:`Paginator` object. -``paginator`` - The associated ``Paginator`` object. diff --git a/docs/serialization.txt b/docs/topics/serialization.txt similarity index 91% rename from docs/serialization.txt rename to docs/topics/serialization.txt index 971103747c..db9515960e 100644 --- a/docs/serialization.txt +++ b/docs/topics/serialization.txt @@ -1,3 +1,5 @@ +.. _topics-serialization: + ========================== Serializing Django objects ========================== @@ -15,12 +17,10 @@ At the highest level, serializing data is a very simple operation:: from django.core import serializers data = serializers.serialize("xml", SomeModel.objects.all()) -The arguments to the ``serialize`` function are the format to serialize the -data to (see `Serialization formats`_) and a QuerySet_ to serialize. -(Actually, the second argument can be any iterator that yields Django objects, -but it'll almost always be a QuerySet). - -.. _QuerySet: ../db-api/#retrieving-objects +The arguments to the ``serialize`` function are the format to serialize the data +to (see `Serialization formats`_) and a :class:`~django.db.models.QuerySet` to +serialize. (Actually, the second argument can be any iterator that yields Django +objects, but it'll almost always be a QuerySet). You can also use a serializer object directly:: @@ -30,13 +30,11 @@ You can also use a serializer object directly:: data = xml_serializer.getvalue() This is useful if you want to serialize data directly to a file-like object -(which includes a HTTPResponse_):: +(which includes an :class:`~django.http.HttpResponse` :: out = open("file.xml", "w") xml_serializer.serialize(SomeModel.objects.all(), stream=out) -.. _HTTPResponse: ../request_response/#httpresponse-objects - Subset of fields ~~~~~~~~~~~~~~~~ @@ -124,6 +122,8 @@ trust your data source you could just save the object and move on. The Django object itself can be inspected as ``deserialized_object.object``. +.. _serialization-formats: + Serialization formats --------------------- @@ -164,10 +164,11 @@ For example:: json_serializer = serializers.get_serializer("json")() json_serializer.serialize(queryset, ensure_ascii=False, stream=response) -The Django source code includes the simplejson_ module. Be aware that if -you're serializing using that module directly, not all Django output can be -passed unmodified to simplejson. In particular, `lazy translation objects`_ -need a `special encoder`_ written for them. Something like this will work:: +The Django source code includes the simplejson_ module. Be aware that if you're +serializing using that module directly, not all Django output can be passed +unmodified to simplejson. In particular, :ref:`lazy translation objects +<lazy-translations>` need a `special encoder`_ written for them. Something like +this will work:: from django.utils.functional import Promise from django.utils.encoding import force_unicode @@ -178,5 +179,4 @@ need a `special encoder`_ written for them. Something like this will work:: return force_unicode(obj) return obj -.. _lazy translation objects: ../i18n/#lazy-translation .. _special encoder: http://svn.red-bean.com/bob/simplejson/tags/simplejson-1.7/docs/index.html diff --git a/docs/topics/settings.txt b/docs/topics/settings.txt new file mode 100644 index 0000000000..d9c8f0ab62 --- /dev/null +++ b/docs/topics/settings.txt @@ -0,0 +1,253 @@ +.. _topics-settings: + +=============== +Django settings +=============== + +A Django settings file contains all the configuration of your Django +installation. This document explains how settings work and which settings are +available. + +The basics +========== + +A settings file is just a Python module with module-level variables. + +Here are a couple of example settings:: + + DEBUG = False + DEFAULT_FROM_EMAIL = 'webmaster@example.com' + TEMPLATE_DIRS = ('/home/templates/mike', '/home/templates/john') + +Because a settings file is a Python module, the following apply: + + * It doesn't allow for Python syntax errors. + * It can assign settings dynamically using normal Python syntax. + For example:: + + MY_SETTING = [str(i) for i in range(30)] + + * It can import values from other settings files. + +.. _django-settings-module: + +Designating the settings +======================== + +When you use Django, you have to tell it which settings you're using. Do this +by using an environment variable, ``DJANGO_SETTINGS_MODULE``. + +The value of ``DJANGO_SETTINGS_MODULE`` should be in Python path syntax, e.g. +``mysite.settings``. Note that the settings module should be on the +Python `import search path`_. + +.. _import search path: http://diveintopython.org/getting_to_know_python/everything_is_an_object.html + +The django-admin.py utility +--------------------------- + +When using :ref:`django-admin.py <ref-django-admin>`, you can either set the +environment variable once, or explicitly pass in the settings module each time +you run the utility. + +Example (Unix Bash shell):: + + export DJANGO_SETTINGS_MODULE=mysite.settings + django-admin.py runserver + +Example (Windows shell):: + + set DJANGO_SETTINGS_MODULE=mysite.settings + django-admin.py runserver + +Use the ``--settings`` command-line argument to specify the settings manually:: + + django-admin.py runserver --settings=mysite.settings + +.. _django-admin.py: ../django-admin/ + +On the server (mod_python) +-------------------------- + +In your live server environment, you'll need to tell Apache/mod_python which +settings file to use. Do that with ``SetEnv``:: + + <Location "/mysite/"> + SetHandler python-program + PythonHandler django.core.handlers.modpython + SetEnv DJANGO_SETTINGS_MODULE mysite.settings + </Location> + +Read the :ref:`Django mod_python documentation <howto-deployment-modpython>` for +more information. + +Default settings +================ + +A Django settings file doesn't have to define any settings if it doesn't need +to. Each setting has a sensible default value. These defaults live in the file +``django/conf/global_settings.py``. + +Here's the algorithm Django uses in compiling settings: + + * Load settings from ``global_settings.py``. + * Load settings from the specified settings file, overriding the global + settings as necessary. + +Note that a settings file should *not* import from ``global_settings``, because +that's redundant. + +Seeing which settings you've changed +------------------------------------ + +There's an easy way to view which of your settings deviate from the default +settings. The command ``python manage.py diffsettings`` displays differences +between the current settings file and Django's default settings. + +For more, see the :djadmin:`diffsettings` documentation. + +Using settings in Python code +============================= + +In your Django apps, use settings by importing the object +``django.conf.settings``. Example:: + + from django.conf import settings + + if settings.DEBUG: + # Do something + +Note that ``django.conf.settings`` isn't a module -- it's an object. So +importing individual settings is not possible:: + + from django.conf.settings import DEBUG # This won't work. + +Also note that your code should *not* import from either ``global_settings`` or +your own settings file. ``django.conf.settings`` abstracts the concepts of +default settings and site-specific settings; it presents a single interface. +It also decouples the code that uses settings from the location of your +settings. + +Altering settings at runtime +============================ + +You shouldn't alter settings in your applications at runtime. For example, +don't do this in a view:: + + from django.conf import settings + + settings.DEBUG = True # Don't do this! + +The only place you should assign to settings is in a settings file. + +Security +======== + +Because a settings file contains sensitive information, such as the database +password, you should make every attempt to limit access to it. For example, +change its file permissions so that only you and your Web server's user can +read it. This is especially important in a shared-hosting environment. + +Available settings +================== + +For a full list of available settings, see the :ref:`settings reference <ref-settings>`. + +Creating your own settings +========================== + +There's nothing stopping you from creating your own settings, for your own +Django apps. Just follow these conventions: + + * Setting names are in all uppercase. + * For settings that are sequences, use tuples instead of lists. This is + purely for performance. + * Don't reinvent an already-existing setting. + +.. _settings-without-django-settings-module: + +Using settings without setting DJANGO_SETTINGS_MODULE +===================================================== + +In some cases, you might want to bypass the ``DJANGO_SETTINGS_MODULE`` +environment variable. For example, if you're using the template system by +itself, you likely don't want to have to set up an environment variable +pointing to a settings module. + +In these cases, you can configure Django's settings manually. Do this by +calling ``django.conf.settings.configure()``. + +Example:: + + from django.conf import settings + + settings.configure(DEBUG=True, TEMPLATE_DEBUG=True, + TEMPLATE_DIRS=('/home/web-apps/myapp', '/home/web-apps/base')) + +Pass ``configure()`` as many keyword arguments as you'd like, with each keyword +argument representing a setting and its value. Each argument name should be all +uppercase, with the same name as the settings described above. If a particular +setting is not passed to ``configure()`` and is needed at some later point, +Django will use the default setting value. + +Configuring Django in this fashion is mostly necessary -- and, indeed, +recommended -- when you're using a piece of the framework inside a larger +application. + +Consequently, when configured via ``settings.configure()``, Django will not +make any modifications to the process environment variables. (See the +explanation of ``TIME_ZONE``, above, for why this would normally occur.) It's +assumed that you're already in full control of your environment in these cases. + +Custom default settings +----------------------- + +If you'd like default values to come from somewhere other than +``django.conf.global_settings``, you can pass in a module or class that +provides the default settings as the ``default_settings`` argument (or as the +first positional argument) in the call to ``configure()``. + +In this example, default settings are taken from ``myapp_defaults``, and the +``DEBUG`` setting is set to ``True``, regardless of its value in +``myapp_defaults``:: + + from django.conf import settings + from myapp import myapp_defaults + + settings.configure(default_settings=myapp_defaults, DEBUG=True) + +The following example, which uses ``myapp_defaults`` as a positional argument, +is equivalent:: + + settings.configure(myapp_defaults, DEBUG = True) + +Normally, you will not need to override the defaults in this fashion. The +Django defaults are sufficiently tame that you can safely use them. Be aware +that if you do pass in a new default module, it entirely *replaces* the Django +defaults, so you must specify a value for every possible setting that might be +used in that code you are importing. Check in +``django.conf.settings.global_settings`` for the full list. + +Either configure() or DJANGO_SETTINGS_MODULE is required +-------------------------------------------------------- + +If you're not setting the ``DJANGO_SETTINGS_MODULE`` environment variable, you +*must* call ``configure()`` at some point before using any code that reads +settings. + +If you don't set ``DJANGO_SETTINGS_MODULE`` and don't call ``configure()``, +Django will raise an ``ImportError`` exception the first time a setting +is accessed. + +If you set ``DJANGO_SETTINGS_MODULE``, access settings values somehow, *then* +call ``configure()``, Django will raise a ``RuntimeError`` indicating +that settings have already been configured. + +Also, it's an error to call ``configure()`` more than once, or to call +``configure()`` after any setting has been accessed. + +It boils down to this: Use exactly one of either ``configure()`` or +``DJANGO_SETTINGS_MODULE``. Not both, and not neither. + +.. _@login_required: ../authentication/#the-login-required-decorator + diff --git a/docs/topics/templates.txt b/docs/topics/templates.txt new file mode 100644 index 0000000000..09ef0d711a --- /dev/null +++ b/docs/topics/templates.txt @@ -0,0 +1,644 @@ +.. _topics-templates: + +============================ +The Django template language +============================ + +.. admonition:: About this document + + This document explains the language syntax of the Django template system. If + you're looking for a more technical perspective on how it works and how to + extend it, see :ref:`ref-templates-api`. + +Django's template language is designed to strike a balance between power and +ease. It's designed to feel comfortable to those used to working with HTML. If +you have any exposure to other text-based template languages, such as Smarty_ +or CheetahTemplate_, you should feel right at home with Django's templates. + +.. admonition:: Philosophy + + If you have a background in programming, or if you're used to languages + like PHP which mix programming code directly into HTML, you'll want to + bear in mind that the Django template system is not simply Python embedded + into HTML. This is by design: the template system is meant to express + presentation, not program logic. + + The Django template system provides tags which function similarly to some + programming constructs -- an :ttag:`if` tag for boolean tests, a :ttag:`for` + tag for looping, etc. -- but these are not simply executed as the + corresponding Python code, and the template system will not execute + arbitrary Python expressions. Only the tags, filters and syntax listed below + are supported by default (although you can add :ref:`your own extensions + <howto-custom-template-tags>` to the template language as needed). + +.. _`The Django template language: For Python programmers`: ../templates_python/ +.. _Smarty: http://smarty.php.net/ +.. _CheetahTemplate: http://www.cheetahtemplate.org/ + +Templates +========= + +A template is simply a text file. It can generate any text-based format (HTML, +XML, CSV, etc.). + +A template contains **variables**, which get replaced with values when the +template is evaluated, and **tags**, which control the logic of the template. + +Below is a minimal template that illustrates a few basics. Each element will be +explained later in this document.:: + + {% extends "base_generic.html" %} + + {% block title %}{{ section.title }}{% endblock %} + + {% block content %} + <h1>{{ section.title }}</h1> + + {% for story in story_list %} + <h2> + <a href="{{ story.get_absolute_url }}"> + {{ story.headline|upper }} + </a> + </h2> + <p>{{ story.tease|truncatewords:"100" }}</p> + {% endfor %} + {% endblock %} + +.. admonition:: Philosophy + + Why use a text-based template instead of an XML-based one (like Zope's + TAL)? We wanted Django's template language to be usable for more than + just XML/HTML templates. At World Online, we use it for e-mails, + JavaScript and CSV. You can use the template language for any text-based + format. + + Oh, and one more thing: Making humans edit XML is sadistic! + +Variables +========= + +Variables look like this: ``{{ variable }}``. When the template engine +encounters a variable, it evaluates that variable and replaces it with the +result. + +Use a dot (``.``) to access attributes of a variable. + +.. admonition:: Behind the scenes + + Technically, when the template system encounters a dot, it tries the + following lookups, in this order: + + * Dictionary lookup + * Attribute lookup + * Method call + * List-index lookup + +In the above example, ``{{ section.title }}`` will be replaced with the +``title`` attribute of the ``section`` object. + +If you use a variable that doesn't exist, the template system will insert +the value of the ``TEMPLATE_STRING_IF_INVALID`` setting, which is set to ``''`` +(the empty string) by default. + +See `Using the built-in reference`_, below, for help on finding what variables +are available in a given template. + +Filters +======= + +You can modify variables for display by using **filters**. + +Filters look like this: ``{{ name|lower }}``. This displays the value of the +``{{ name }}`` variable after being filtered through the ``lower`` filter, +which converts text to lowercase. Use a pipe (``|``) to apply a filter. + +Filters can be "chained." The output of one filter is applied to the next. +``{{ text|escape|linebreaks }}`` is a common idiom for escaping text contents, +then converting line breaks to ``<p>`` tags. + +Some filters take arguments. A filter argument looks like this: ``{{ +bio|truncatewords:30 }}``. This will display the first 30 words of the ``bio`` +variable. + +Filter arguments that contain spaces must be quoted; for example, to join a list +with commas and spaced you'd use ``{{ list|join:", " }}``. + +Django provides about thirty built-in template filters. You can read all about +them in the :ref:`built-in filter reference <ref-templates-builtins-filters>`. +To give you a taste of what's available, here are some of the more commonly used +template filters: + + :tfilter:`default` + If a variable is false or empty, use given default. Otherwise, use the + value of the variable + + For example:: + + {{ value|default:"nothing" }} + + If ``value`` isn't provided or is empty, the above will display + "``nothing``". + + :tfilter:`length` + Returns the length of the value. This works for both strings and lists; + for example:: + + {{ value|length }} + + If ``value`` is ``['a', 'b', 'c', 'd']``, the output will be ``4``. + + :tfilter:`striptags` + Strips all [X]HTML tags. For example:: + + {{ value|striptags }} + + If ``value`` is ``"<b>Joel</b> <button>is</button> a + <span>slug</span>"``, the output will be ``"Joel is a slug"``. + +Again, these are just a few examples; see the :ref:`built-in filter reference +<ref-templates-builtins-filters>` for the complete list. + +You can also create your own custom template filters; see +:ref:`howto-custom-template-tags`. + +Tags +==== + +Tags look like this: ``{% tag %}``. Tags are more complex than variables: Some +create text in the output, some control flow by performing loops or logic, and +some load external information into the template to be used by later variables. + +Some tags require beginning and ending tags (i.e. ``{% tag %} ... tag contents +... {% endtag %}``). + +Django ships with about two dozen built-in template tags. You can read all about +them in the :ref:`built-in tag reference <ref-templates-builtins-tags>`. To give +you a taste of what's available, here are some of the more commonly used +tags: + + :ttag:`for` + Loop over each item in an array. For example, to display a list of athletes + provided in ``athlete_list``:: + + <ul> + {% for athlete in athlete_list %} + <li>{{ athlete.name }}</li> + {% endfor %} + </ul> + + :ttag:`if` and :ttag:`else` + Evaluates a variable, and if that variable is "true" the contents of the + block are displayed:: + + {% if athlete_list %} + Number of athletes: {{ athlete_list|length }} + {% else %} + No athletes. + {% endif %} + + In the above, if ``athlete_list`` is not empty, the number of athletes + will be displayed by the ``{{ athlete_list|length }}`` variable. + + :ttag:`ifequal` and :ttag:`ifnotequal` + Display some contents if two arguments are or are not equal. For example:: + + {% ifequal athlete.name coach.name %} + ... + {% endifequal %} + + Or:: + + {% ifnotequal athlete.name "Joe" %} + ... + {% endifequal %} + + :ttag:`block` and :ttag:`extends` + Set up `template inheritance`_ (see below), a powerful way + of cutting down on "boilerplate" in templates. + +Again, the above is only a selection of the whole list; see the :ref:`built-in +tag reference <ref-templates-builtins-tags>` for the complete list. + +You can also create your own custom template tags; see +:ref:`howto-custom-template-tags`. + +Comments +======== + +To comment-out part of a line in a template, use the comment syntax: ``{# #}``. + +For example, this template would render as ``'hello'``:: + + {# greeting #}hello + +A comment can contain any template code, invalid or not. For example:: + + {# {% if foo %}bar{% else %} #} + +This syntax can only be used for single-line comments (no newlines are permitted +between the ``{#`` and ``#}`` delimiters). If you need to comment out a +multiline portion of the template, see the :ttag:`comment` tag. + +.. _template-inheritance: + +Template inheritance +==================== + +The most powerful -- and thus the most complex -- part of Django's template +engine is template inheritance. Template inheritance allows you to build a base +"skeleton" template that contains all the common elements of your site and +defines **blocks** that child templates can override. + +It's easiest to understand template inheritance by starting with an example:: + + <!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" xml:lang="en" lang="en"> + <head> + <link rel="stylesheet" href="style.css" /> + <title>{% block title %}My amazing site{% endblock %}</title> + </head> + + <body> + <div id="sidebar"> + {% block sidebar %} + <ul> + <li><a href="/">Home</a></li> + <li><a href="/blog/">Blog</a></li> + </ul> + {% endblock %} + </div> + + <div id="content"> + {% block content %}{% endblock %} + </div> + </body> + </html> + +This template, which we'll call ``base.html``, defines a simple HTML skeleton +document that you might use for a simple two-column page. It's the job of +"child" templates to fill the empty blocks with content. + +In this example, the ``{% block %}`` tag defines three blocks that child +templates can fill in. All the ``block`` tag does is to tell the template +engine that a child template may override those portions of the template. + +A child template might look like this:: + + {% extends "base.html" %} + + {% block title %}My amazing blog{% endblock %} + + {% block content %} + {% for entry in blog_entries %} + <h2>{{ entry.title }}</h2> + <p>{{ entry.body }}</p> + {% endfor %} + {% endblock %} + +The ``{% extends %}`` tag is the key here. It tells the template engine that +this template "extends" another template. When the template system evaluates +this template, first it locates the parent -- in this case, "base.html". + +At that point, the template engine will notice the three ``{% block %}`` tags +in ``base.html`` and replace those blocks with the contents of the child +template. Depending on the value of ``blog_entries``, the output might look +like:: + + <!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" xml:lang="en" lang="en"> + <head> + <link rel="stylesheet" href="style.css" /> + <title>My amazing blog</title> + </head> + + <body> + <div id="sidebar"> + <ul> + <li><a href="/">Home</a></li> + <li><a href="/blog/">Blog</a></li> + </ul> + </div> + + <div id="content"> + <h2>Entry one</h2> + <p>This is my first entry.</p> + + <h2>Entry two</h2> + <p>This is my second entry.</p> + </div> + </body> + </html> + +Note that since the child template didn't define the ``sidebar`` block, the +value from the parent template is used instead. Content within a ``{% block %}`` +tag in a parent template is always used as a fallback. + +You can use as many levels of inheritance as needed. One common way of using +inheritance is the following three-level approach: + + * Create a ``base.html`` template that holds the main look-and-feel of your + site. + * Create a ``base_SECTIONNAME.html`` template for each "section" of your + site. For example, ``base_news.html``, ``base_sports.html``. These + templates all extend ``base.html`` and include section-specific + styles/design. + * Create individual templates for each type of page, such as a news + article or blog entry. These templates extend the appropriate section + template. + +This approach maximizes code reuse and makes it easy to add items to shared +content areas, such as section-wide navigation. + +Here are some tips for working with inheritance: + + * If you use ``{% extends %}`` in a template, it must be the first template + tag in that template. Template inheritance won't work, otherwise. + + * More ``{% block %}`` tags in your base templates are better. Remember, + child templates don't have to define all parent blocks, so you can fill + in reasonable defaults in a number of blocks, then only define the ones + you need later. It's better to have more hooks than fewer hooks. + + * If you find yourself duplicating content in a number of templates, it + probably means you should move that content to a ``{% block %}`` in a + parent template. + + * If you need to get the content of the block from the parent template, + the ``{{ block.super }}`` variable will do the trick. This is useful + if you want to add to the contents of a parent block instead of + completely overriding it. Data inserted using ``{{ block.super }}`` will + not be automatically escaped (see the `next section`_), since it was + already escaped, if necessary, in the parent template. + + * For extra readability, you can optionally give a *name* to your + ``{% endblock %}`` tag. For example:: + + {% block content %} + ... + {% endblock content %} + + In larger templates, this technique helps you see which ``{% block %}`` + tags are being closed. + +Finally, note that you can't define multiple ``{% block %}`` tags with the same +name in the same template. This limitation exists because a block tag works in +"both" directions. That is, a block tag doesn't just provide a hole to fill -- +it also defines the content that fills the hole in the *parent*. If there were +two similarly-named ``{% block %}`` tags in a template, that template's parent +wouldn't know which one of the blocks' content to use. + +.. _next section: #automatic-html-escaping +.. _automatic-html-escaping: + +Automatic HTML escaping +======================= + +**New in Django development version** + +When generating HTML from templates, there's always a risk that a variable will +include characters that affect the resulting HTML. For example, consider this +template fragment:: + + Hello, {{ name }}. + +At first, this seems like a harmless way to display a user's name, but consider +what would happen if the user entered his name as this:: + + <script>alert('hello')</script> + +With this name value, the template would be rendered as:: + + Hello, <script>alert('hello')</script> + +...which means the browser would pop-up a JavaScript alert box! + +Similarly, what if the name contained a ``'<'`` symbol, like this? + + <b>username + +That would result in a rendered template like this:: + + Hello, <b>username + +...which, in turn, would result in the remainder of the Web page being bolded! + +Clearly, user-submitted data shouldn't be trusted blindly and inserted directly +into your Web pages, because a malicious user could use this kind of hole to +do potentially bad things. This type of security exploit is called a +`Cross Site Scripting`_ (XSS) attack. + +To avoid this problem, you have two options: + + * One, you can make sure to run each untrusted variable through the + ``escape`` filter (documented below), which converts potentially harmful + HTML characters to unharmful ones. This was the default solution + in Django for its first few years, but the problem is that it puts the + onus on *you*, the developer / template author, to ensure you're escaping + everything. It's easy to forget to escape data. + + * Two, you can take advantage of Django's automatic HTML escaping. The + remainder of this section describes how auto-escaping works. + +By default in the Django development version, every template automatically +escapes the output of every variable tag. Specifically, these five characters +are escaped: + + * ``<`` is converted to ``<`` + * ``>`` is converted to ``>`` + * ``'`` (single quote) is converted to ``'`` + * ``"`` (double quote) is converted to ``"`` + * ``&`` is converted to ``&`` + +Again, we stress that this behavior is on by default. If you're using Django's +template system, you're protected. + +.. _Cross Site Scripting: http://en.wikipedia.org/wiki/Cross-site_scripting + +How to turn it off +------------------ + +If you don't want data to be auto-escaped, on a per-site, per-template level or +per-variable level, you can turn it off in several ways. + +Why would you want to turn it off? Because sometimes, template variables +contain data that you *intend* to be rendered as raw HTML, in which case you +don't want their contents to be escaped. For example, you might store a blob of +HTML in your database and want to embed that directly into your template. Or, +you might be using Django's template system to produce text that is *not* HTML +-- like an e-mail message, for instance. + +For individual variables +~~~~~~~~~~~~~~~~~~~~~~~~ + +To disable auto-escaping for an individual variable, use the ``safe`` filter:: + + This will be escaped: {{ data }} + This will not be escaped: {{ data|safe }} + +Think of *safe* as shorthand for *safe from further escaping* or *can be +safely interpreted as HTML*. In this example, if ``data`` contains ``'<b>'``, +the output will be:: + + This will be escaped: <b> + This will not be escaped: <b> + +For template blocks +~~~~~~~~~~~~~~~~~~~ + +To control auto-escaping for a template, wrap the template (or just a +particular section of the template) in the ``autoescape`` tag, like so:: + + {% autoescape off %} + Hello {{ name }} + {% endautoescape %} + +The ``autoescape`` tag takes either ``on`` or ``off`` as its argument. At +times, you might want to force auto-escaping when it would otherwise be +disabled. Here is an example template:: + + Auto-escaping is on by default. Hello {{ name }} + + {% autoescape off %} + This will not be auto-escaped: {{ data }}. + + Nor this: {{ other_data }} + {% autoescape on %} + Auto-escaping applies again: {{ name }} + {% endautoescape %} + {% endautoescape %} + +The auto-escaping tag passes its effect onto templates that extend the +current one as well as templates included via the ``include`` tag, just like +all block tags. For example:: + + # base.html + + {% autoescape off %} + <h1>{% block title %}{% endblock %}</h1> + {% block content %} + {% endblock %} + {% endautoescape %} + + + # child.html + + {% extends "base.html" %} + {% block title %}This & that{% endblock %} + {% block content %}{{ greeting }}{% endblock %} + +Because auto-escaping is turned off in the base template, it will also be +turned off in the child template, resulting in the following rendered +HTML when the ``greeting`` variable contains the string ``<b>Hello!</b>``:: + + <h1>This & that</h1> + <b>Hello!</b> + +Notes +----- + +Generally, template authors don't need to worry about auto-escaping very much. +Developers on the Python side (people writing views and custom filters) need to +think about the cases in which data shouldn't be escaped, and mark data +appropriately, so things Just Work in the template. + +If you're creating a template that might be used in situations where you're +not sure whether auto-escaping is enabled, then add an ``escape`` filter to any +variable that needs escaping. When auto-escaping is on, there's no danger of +the ``escape`` filter *double-escaping* data -- the ``escape`` filter does not +affect auto-escaped variables. + +String literals and automatic escaping +-------------------------------------- + +As we mentioned earlier, filter arguments can be strings:: + + {{ data|default:"This is a string literal." }} + +All string literals are inserted **without** any automatic escaping into the +template -- they act as if they were all passed through the ``safe`` filter. +The reasoning behind this is that the template author is in control of what +goes into the string literal, so they can make sure the text is correctly +escaped when the template is written. + +This means you would write :: + + {{ data|default:"3 < 2" }} + +...rather than :: + + {{ data|default:"3 < 2" }} <-- Bad! Don't do this. + +This doesn't affect what happens to data coming from the variable itself. +The variable's contents are still automatically escaped, if necessary, because +they're beyond the control of the template author. + +.. _template-built-in-reference: + +Using the built-in reference +============================ + +Django's admin interface includes a complete reference of all template tags and +filters available for a given site. To see it, go to your admin interface and +click the "Documentation" link in the upper right of the page. + +The reference is divided into 4 sections: tags, filters, models, and views. + +The **tags** and **filters** sections describe all the built-in tags (in fact, +the tag and filter references below come directly from those pages) as well as +any custom tag or filter libraries available. + +The **views** page is the most valuable. Each URL in your site has a separate +entry here, and clicking on a URL will show you: + + * The name of the view function that generates that view. + * A short description of what the view does. + * The **context**, or a list of variables available in the view's template. + * The name of the template or templates that are used for that view. + +Each view documentation page also has a bookmarklet that you can use to jump +from any page to the documentation page for that view. + +Because Django-powered sites usually use database objects, the **models** +section of the documentation page describes each type of object in the system +along with all the fields available on that object. + +Taken together, the documentation pages should tell you every tag, filter, +variable and object available to you in a given template. + +Custom tag and filter libraries +=============================== + +Certain applications provide custom tag and filter libraries. To access them in +a template, use the ``{% load %}`` tag:: + + {% load comments %} + + {% comment_form for blogs.entries entry.id with is_public yes %} + +In the above, the ``load`` tag loads the ``comments`` tag library, which then +makes the ``comment_form`` tag available for use. Consult the documentation +area in your admin to find the list of custom libraries in your installation. + +The ``{% load %}`` tag can take multiple library names, separated by spaces. +Example:: + + {% load comments i18n %} + +See :ref:`howto-custom-template-tags` for information on writing your own custom +template libraries. + +Custom libraries and template inheritance +----------------------------------------- + +When you load a custom tag or filter library, the tags/filters are only made +available to the current template -- not any parent or child templates along +the template-inheritance path. + +For example, if a template ``foo.html`` has ``{% load comments %}``, a child +template (e.g., one that has ``{% extends "foo.html" %}``) will *not* have +access to the comments template tags and filters. The child template is +responsible for its own ``{% load comments %}``. + +This is a feature for the sake of maintainability and sanity. \ No newline at end of file diff --git a/docs/testing.txt b/docs/topics/testing.txt similarity index 82% rename from docs/testing.txt rename to docs/topics/testing.txt index 85f36518a3..ac5ea28064 100644 --- a/docs/testing.txt +++ b/docs/topics/testing.txt @@ -1,7 +1,12 @@ +.. _topics-testing: + =========================== Testing Django applications =========================== +.. module:: django.test + :synopsis: Testing tools for Django applications. + Automated testing is an extremely useful bug-killing tool for the modern Web developer. You can use a collection of tests -- a **test suite** -- to solve, or avoid, a number of problems: @@ -82,8 +87,8 @@ read Python's official documentation for the details. For example, this function has a docstring that describes what it does:: def add_two(num): - "Return the result of adding two to the provided number." - return num + 2 + "Return the result of adding two to the provided number." + return num + 2 Because tests often make great documentation, putting tests directly in your docstrings is an effective way to document *and* test your code. @@ -126,7 +131,7 @@ Here is an example model doctest:: def speak(self): return 'The %s says "%s"' % (self.name, self.sound) -When you `run your tests`_, the test runner will find this docstring, notice +When you :ref:`run your tests <running-tests>`, the test runner will find this docstring, notice that portions of it look like an interactive Python session, and execute those lines while checking that the results match. @@ -177,7 +182,7 @@ in the doctest section above:: self.assertEquals(self.lion.speak(), 'The lion says "roar"') self.assertEquals(self.cat.speak(), 'The cat says "meow"') -When you `run your tests`_, the default behavior of the test utility is +When you :ref:`run your tests <running-tests>`, the default behavior of the test utility is to find all the test cases (that is, subclasses of ``unittest.TestCase``) in ``models.py`` and ``tests.py``, automatically build a test suite out of those test cases, and run that suite. @@ -194,7 +199,6 @@ documentation`_. .. _unittest: http://docs.python.org/lib/module-unittest.html .. _standard library unittest documentation: unittest_ -.. _run your tests: `Running tests`_ .. _suggested organization: http://docs.python.org/lib/organizing-tests.html Which should I use? @@ -233,6 +237,8 @@ Again, remember that you can use both systems side-by-side (even in the same app). In the end, most projects will eventually end up using both. Each shines in different circumstances. +.. _running-tests: + Running tests ============= @@ -240,11 +246,12 @@ Once you've written tests, run them using your project's ``manage.py`` utility:: $ ./manage.py test -By default, this will run every test in every application in ``INSTALLED_APPS``. -If you only want to run tests for a particular application, add the -application name to the command line. For example, if your ``INSTALLED_APPS`` -contains ``'myproject.polls'`` and ``'myproject.animals'``, you can run the -``myproject.animals`` unit tests alone with this command:: +By default, this will run every test in every application in +:setting:`INSTALLED_APPS`. If you only want to run tests for a particular +application, add the application name to the command line. For example, if your +:setting:`INSTALLED_APPS` contains ``'myproject.polls'`` and +``'myproject.animals'``, you can run the ``myproject.animals`` unit tests alone +with this command:: # ./manage.py test animals @@ -273,25 +280,25 @@ for the tests. Regardless of whether the tests pass or fail, the test database is destroyed when all the tests have been executed. -By default this test database gets its name by prepending ``test_`` to the -value of the ``DATABASE_NAME`` setting. When using the SQLite database engine +By default this test database gets its name by prepending ``test_`` to the value +of the :setting:`DATABASE_NAME` setting. When using the SQLite database engine the tests will by default use an in-memory database (i.e., the database will be created in memory, bypassing the filesystem entirely!). If you want to use a -different database name, specify the ``TEST_DATABASE_NAME`` setting. +different database name, specify the :setting:`TEST_DATABASE_NAME` setting. Aside from using a separate database, the test runner will otherwise use all of -the same database settings you have in your settings file: ``DATABASE_ENGINE``, -``DATABASE_USER``, ``DATABASE_HOST``, etc. The test database is created by the -user specified by ``DATABASE_USER``, so you'll need to make sure that the given -user account has sufficient privileges to create a new database on the system. +the same database settings you have in your settings file: +:setting:`DATABASE_ENGINE`, :setting:`DATABASE_USER`, :setting:`DATABASE_HOST`, +etc. The test database is created by the user specified by +:setting:`DATABASE_USER`, so you'll need to make sure that the given user +account has sufficient privileges to create a new database on the system. **New in Django development version:** For fine-grained control over the -character encoding of your test database, use the ``TEST_DATABASE_CHARSET`` -setting. If you're using MySQL, you can also use the ``TEST_DATABASE_COLLATION`` -setting to control the particular collation used by the test database. See the -settings_ documentation for details of these advanced settings. - -.. _settings: ../settings/ +character encoding of your test database, use the +:setting:`TEST_DATABASE_CHARSET` setting. If you're using MySQL, you can also +use the :setting:`TEST_DATABASE_COLLATION` setting to control the particular +collation used by the test database. See the :ref:`settings documentation +<ref-settings>` for details of these advanced settings. Understanding the test output ----------------------------- @@ -360,9 +367,12 @@ Django provides a small set of tools that come in handy when writing tests. The test client --------------- +.. module:: django.test.client + :synopsis: Django's test client. + The test client is a Python class that acts as a dummy Web browser, allowing you to test your views and interact with your Django-powered application -programatically. +programmatically. Some of the things you can do with the test client are: @@ -429,11 +439,12 @@ Note a few important things about how the test client works: use a Python standard library module such as urllib_ or urllib2_. * To resolve URLs, the test client uses whatever URLconf is pointed-to by - your ``ROOT_URLCONF`` setting. + your :setting:`ROOT_URLCONF` setting. * Although the above example would work in the Python interactive interpreter, some of the test client's functionality, notably the - template-related functionality, is only available *while tests are running*. + template-related functionality, is only available *while tests are + running*. The reason for this is that Django's test runner performs a bit of black magic in order to determine which template was loaded by a given view. @@ -449,11 +460,12 @@ Making requests Use the ``django.test.client.Client`` class to make requests. It requires no arguments at time of construction:: - >>> c = Client() +.. class:: Client() Once you have a ``Client`` instance, you can call any of the following methods: -``get(path, data={})`` +.. method:: Client.get(path, data={}) + Makes a GET request on the provided ``path`` and returns a ``Response`` object, which is documented below. @@ -467,7 +479,8 @@ Once you have a ``Client`` instance, you can call any of the following methods: /customers/details/?name=fred&age=7 -``post(path, data={}, content_type=MULTIPART_CONTENT)`` +.. method:: Client.post(path, data={}, content_type=MULTIPART_CONTENT) + Makes a POST request on the provided ``path`` and returns a ``Response`` object, which is documented below. @@ -516,10 +529,11 @@ Once you have a ``Client`` instance, you can call any of the following methods: Note that you should manually close the file after it has been provided to ``post()``. -``login(**credentials)`` +.. method:: Client.login(**credentials) + **New in Django development version** - If your site uses Django's `authentication system`_ and you deal with + If your site uses Django's :ref:`authentication system<topics-auth>` and you deal with logging in users, you can use the test client's ``login()`` method to simulate the effect of a user logging into the site. @@ -528,15 +542,16 @@ Once you have a ``Client`` instance, you can call any of the following methods: a view. The format of the ``credentials`` argument depends on which - `authentication backend`_ you're using (which is configured by your - ``AUTHENTICATION_BACKENDS`` setting). If you're using the standard + :ref:`authentication backend <authentication-backends>` you're using (which is configured by your + :setting:`AUTHENTICATION_BACKENDS` setting). If you're using the standard authentication backend provided by Django (``ModelBackend``), ``credentials`` should be the user's username and password, provided as keyword arguments:: >>> c = Client() >>> c.login(username='fred', password='secret') - >>> # Now you can access a view that's only available to logged-in users. + + # Now you can access a view that's only available to logged-in users. If you're using a different authentication backend, this method may require different credentials. It requires whichever credentials are required by @@ -552,10 +567,11 @@ Once you have a ``Client`` instance, you can call any of the following methods: conditions. You'll need to create users as part of the test suite -- either manually (using the Django model API) or with a test fixture. -``logout()`` +.. method:: Client.logout() + **New in Django development version** - If your site uses Django's `authentication system`_, the ``logout()`` + If your site uses Django's :ref:`authentication system<topics-auth>`, the ``logout()`` method can be used to simulate the effect of a user logging out of your site. @@ -563,9 +579,6 @@ Once you have a ``Client`` instance, you can call any of the following methods: session data cleared to defaults. Subsequent requests will appear to come from an AnonymousUser. -.. _authentication system: ../authentication/ -.. _authentication backend: ../authentication/#other-authentication-sources - Testing responses ~~~~~~~~~~~~~~~~~ @@ -576,46 +589,44 @@ test code to verify. Specifically, a ``Response`` object has the following attributes: - =============== ========================================================== - Attribute Description - =============== ========================================================== - ``client`` The test client that was used to make the request that - resulted in the response. +.. class:: Response() - ``content`` The body of the response, as a string. This is the final - page content as rendered by the view, or any error - message. +.. attribute:: Response.client`` + The test client that was used to make the request that resulted in the + response. - ``context`` The template ``Context`` instance that was used to render - the template that produced the response content. +.. attribute:: Response.content + The body of the response, as a string. This is the final page content as + rendered by the view, or any error message. - If the rendered page used multiple templates, then - ``context`` will be a list of ``Context`` - objects, in the order in which they were rendered. +.. attribute:: Response.context + The template ``Context`` instance that was used to render the template that + produced the response content. - ``request`` The request data that stimulated the response. + If the rendered page used multiple templates, then ``context`` will be a + list of ``Context`` objects, in the order in which they were rendered. - ``status_code`` The HTTP status of the response, as an integer. See - RFC2616_ for a full list of HTTP status codes. +.. attribute:: Response.request`` + The request data that stimulated the response. - ``template`` The ``Template`` instance that was used to render the - final content. Use ``template.name`` to get the - template's file name, if the template was loaded from a - file. (The name is a string such as - ``'admin/index.html'``.) +.. attribute:: Response.status_code + The HTTP status of the response, as an integer. See RFC2616_ for a full list + of HTTP status codes. - If the rendered page used multiple templates -- e.g., - using `template inheritance`_ -- then ``template`` will - be a list of ``Template`` instances, in the order in - which they were rendered. - =============== ========================================================== +.. attribute:: template + The ``Template`` instance that was used to render the final content. Use + ``template.name`` to get the template's file name, if the template was + loaded from a file. (The name is a string such as ``'admin/index.html'``.) + + If the rendered page used multiple templates -- e.g., using :ref:`template + inheritance<template-inheritance>` -- then ``template`` will be a list of ``Template`` instances, + in the order in which they were rendered. You can also use dictionary syntax on the response object to query the value of any settings in the HTTP headers. For example, you could determine the content type of a response using ``response['Content-Type']``. .. _RFC2616: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html -.. _template inheritance: ../templates/#template-inheritance Exceptions ~~~~~~~~~~ @@ -643,19 +654,15 @@ will effectively delete all cookies). A test client has two attributes that store persistent state information. You can access these properties as part of a test condition. - =============== ========================================================== - Attribute Description - =============== ========================================================== - ``cookies`` A Python ``SimpleCookie`` object, containing the current - values of all the client cookies. See the - `Cookie module documentation`_ for more. +.. attribute:: Client.cookies + A Python ``SimpleCookie`` object, containing the current values of all the + client cookies. See the `Cookie module documentation`_ for more. - ``session`` A dictionary-like object containing session information. - See the `session documentation`_ for full details. - =============== ========================================================== +.. attribute:: Client.session + A dictionary-like object containing session information. See the :ref:`session + documentation<topics-http-sessions>` for full details. .. _Cookie module documentation: http://docs.python.org/lib/module-Cookie.html -.. _session documentation: ../sessions/ Example ~~~~~~~ @@ -674,7 +681,7 @@ The following is a simple unit test using the test client:: # Issue a GET request. response = self.client.get('/customer/details/') - # Check that the respose is 200 OK. + # Check that the response is 200 OK. self.failUnlessEqual(response.status_code, 200) # Check that the rendered context contains 5 customers. @@ -683,10 +690,15 @@ The following is a simple unit test using the test client:: TestCase -------- +.. currentmodule:: django.test + Normal Python unit test classes extend a base class of ``unittest.TestCase``. -Django provides an extension of this base class -- ``django.test.TestCase`` --- that provides some additional capabilities that can be useful for -testing Web sites. +Django provides an extension of this base class: + +.. class:: TestCase() + +This class provides some additional capabilities that can be useful for testing +Web sites. Converting a normal ``unittest.TestCase`` to a Django ``TestCase`` is easy: just change the base class of your test from ``unittest.TestCase`` to @@ -699,6 +711,8 @@ Default test client **New in Django development version** +.. attribute:: TestCase.client + Every test case in a ``django.test.TestCase`` instance has access to an instance of a Django test client. This client can be accessed as ``self.client``. This client is recreated for each test, so you don't have to @@ -733,9 +747,13 @@ This means, instead of instantiating a ``Client`` in each test:: response = self.client.get('/customer/index/') self.failUnlessEqual(response.status_code, 200) +.. _topics-testing-fixtures: + Fixture loading ~~~~~~~~~~~~~~~ +.. attribute:: TestCase.fixtures + A test case for a database-backed Web site isn't much use if there isn't any data in the database. To make it easy to put test data into the database, Django's custom ``TestCase`` class provides a way of loading **fixtures**. @@ -746,7 +764,7 @@ fixture of fake user accounts in order to populate your database during tests. The most straightforward way of creating a fixture is to use the ``manage.py dumpdata`` command. This assumes you already have some data in -your database. See the `dumpdata documentation`_ for more details. +your database. See the :djadmin:`dumpdata documentation<dumpdata>` for more details. .. note:: If you've ever run ``manage.py syncdb``, you've already used a fixture @@ -782,21 +800,20 @@ Here's specifically what will happen: * Then, all the named fixtures are installed. In this example, Django will install any JSON fixture named ``mammals``, followed by any fixture named - ``birds``. See the `loaddata documentation`_ for more details on defining + ``birds``. See the :djadmin:`loaddata documentation<loaddata>` for more details on defining and installing fixtures. This flush/load procedure is repeated for each test in the test case, so you can be certain that the outcome of a test will not be affected by another test, or by the order of test execution. -.. _dumpdata documentation: ../django-admin/#dumpdata-appname-appname -.. _loaddata documentation: ../django-admin/#loaddata-fixture-fixture - URLconf configuration ~~~~~~~~~~~~~~~~~~~~~ **New in Django development version** +.. attribute:: TestCase.urls + If your application provides views, you may want to include tests that use the test client to exercise those views. However, an end user is free to deploy the views in your application at any URL of their choosing. @@ -808,12 +825,12 @@ In order to provide a reliable URL space for your test, configuration for the duration of the execution of a test suite. If your ``TestCase`` instance defines an ``urls`` attribute, the ``TestCase`` will use the value of that attribute as the ``ROOT_URLCONF`` -for the duration of that test. +for the duration of that test. For example:: from django.test import TestCase - + class TestMyViews(TestCase): urls = 'myapp.test_urls' @@ -823,6 +840,8 @@ For example:: This test case will use the contents of ``myapp.test_urls`` as the URLconf for the duration of the test case. +.. _emptying-test-outbox: + Emptying the test outbox ~~~~~~~~~~~~~~~~~~~~~~~~ @@ -843,16 +862,16 @@ methods such as ``assertTrue`` and ``assertEquals``, Django's custom ``TestCase`` class provides a number of custom assertion methods that are useful for testing Web applications: -``assertContains(response, text, count=None, status_code=200)`` +.. method:: TestCase.assertContains(response, text, count=None, status_code=200) Asserts that a ``Response`` instance produced the given ``status_code`` and that ``text`` appears in the content of the response. If ``count`` is provided, ``text`` must occur exactly ``count`` times in the response. -``assertNotContains(response, text, status_code=200)`` +.. method:: TestCase.assertNotContains(response, text, status_code=200) Asserts that a ``Response`` instance produced the given ``status_code`` and that ``text`` does not appears in the content of the response. -``assertFormError(response, form, field, errors)`` +.. method:: assertFormError(response, form, field, errors) Asserts that a field on a form raises the provided list of errors when rendered on the form. @@ -867,17 +886,17 @@ useful for testing Web applications: ``errors`` is an error string, or a list of error strings, that are expected as a result of form validation. -``assertTemplateUsed(response, template_name)`` +.. method:: assertTemplateUsed(response, template_name) Asserts that the template with the given name was used in rendering the response. The name is a string such as ``'admin/index.html'``. -``assertTemplateNotUsed(response, template_name)`` +.. method:: assertTemplateNotUsed(response, template_name) Asserts that the template with the given name was *not* used in rendering the response. -``assertRedirects(response, expected_url, status_code=302, target_status_code=200)`` +.. method:: assertRedirects(response, expected_url, status_code=302, target_status_code=200) Asserts that the response return a ``status_code`` redirect status, it redirected to ``expected_url`` (including any GET data), and the subsequent page was received with ``target_status_code``. @@ -887,24 +906,28 @@ E-mail services **New in Django development version** -If any of your Django views send e-mail using `Django's e-mail functionality`_, -you probably don't want to send e-mail each time you run a test using that -view. For this reason, Django's test runner automatically redirects all -Django-sent e-mail to a dummy outbox. This lets you test every aspect of -sending e-mail -- from the number of messages sent to the contents of each -message -- without actually sending the messages. +If any of your Django views send e-mail using :ref:`Django's e-mail +functionality <topics-email>`, you probably don't want to send e-mail each time +you run a test using that view. For this reason, Django's test runner +automatically redirects all Django-sent e-mail to a dummy outbox. This lets you +test every aspect of sending e-mail -- from the number of messages sent to the +contents of each message -- without actually sending the messages. The test runner accomplishes this by transparently replacing the normal -`SMTPConnection`_ class with a different version. (Don't worry -- this has no -effect on any other e-mail senders outside of Django, such as your machine's -mail server, if you're running one.) +:class:`~django.core.mail.SMTPConnection` class with a different version. (Don't +worry -- this has no effect on any other e-mail senders outside of Django, such +as your machine's mail server, if you're running one.) + +.. currentmodule:: django.core.mail + +.. data:: django.core.mail.output During test running, each outgoing e-mail is saved in -``django.core.mail.outbox``. This is a simple list of all `EmailMessage`_ +``django.core.mail.outbox``. This is a simple list of all :class:`<~django.core.mail.EmailMessage>` instances that have been sent. It does not exist under normal execution conditions, i.e., when you're not running unit tests. The outbox is created -during test setup, along with the dummy `SMTPConnection`_. When the test -framework is torn down, the standard `SMTPConnection`_ class is restored, and +during test setup, along with the dummy :class:`<~django.core.mail.SMTPConnection>`. When the test +framework is torn down, the standard :class:`<~django.core.mail.SMTPConnection>` class is restored, and the test outbox is destroyed. Here's an example test that examines ``django.core.mail.outbox`` for length @@ -926,7 +949,7 @@ and contents:: # Verify that the subject of the first message is correct. self.assertEqual(mail.outbox[0].subject, 'Subject here') -As noted `previously`_, the test outbox is emptied at the start of every +As noted :ref:`previously <emptying-test-outbox>`, the test outbox is emptied at the start of every test in a Django ``TestCase``. To empty the outbox manually, assign the empty list to ``mail.outbox``:: @@ -935,11 +958,6 @@ empty list to ``mail.outbox``:: # Empty the test outbox mail.outbox = [] -.. _`Django's e-mail functionality`: ../email/ -.. _`SMTPConnection`: ../email/#the-emailmessage-and-smtpconnection-classes -.. _`EmailMessage`: ../email/#the-emailmessage-and-smtpconnection-classes -.. _`previously`: #emptying-the-test-outbox - Using different testing frameworks ================================== @@ -948,8 +966,8 @@ frameworks. While Django doesn't provide explicit support for alternative frameworks, it does provide a way to invoke tests constructed for an alternative framework as if they were normal Django tests. -When you run ``./manage.py test``, Django looks at the ``TEST_RUNNER`` -setting to determine what to do. By default, ``TEST_RUNNER`` points to +When you run ``./manage.py test``, Django looks at the :setting:`TEST_RUNNER` +setting to determine what to do. By default, :setting:`TEST_RUNNER` points to ``'django.test.simple.run_tests'``. This method defines the default Django testing behavior. This behavior involves: @@ -969,30 +987,32 @@ testing behavior. This behavior involves: #. Performing global post-test teardown. -If you define your own test runner method and point ``TEST_RUNNER`` at that -method, Django will execute your test runner whenever you run -``./manage.py test``. In this way, it is possible to use any test framework -that can be executed from Python code. +If you define your own test runner method and point :setting:`TEST_RUNNER` at +that method, Django will execute your test runner whenever you run ``./manage.py +test``. In this way, it is possible to use any test framework that can be +executed from Python code. Defining a test runner ---------------------- **New in Django development version** +.. currentmodule:: django.test.simple + By convention, a test runner should be called ``run_tests``. The only strict requirement is that it has the same arguments as the Django test runner: -``run_tests(test_labels, verbosity=1, interactive=True, extra_tests=[])`` - +.. function:: run_tests(test_labels, verbosity=1, interactive=True, extra_tests=[]) ``test_labels`` is a list of strings describing the tests to be run. A test label can take one of three forms: - * ``app.TestCase.test_method`` -- Run a single test method in a test case. + * ``app.TestCase.test_method`` -- Run a single test method in a test + case. * ``app.TestCase`` -- Run all the test methods in a test case. * ``app`` -- Search for and run all tests in the named application. If ``test_labels`` has a value of ``None``, the test runner should run - search for tests in all the applications in ``INSTALLED_APPS``. + search for tests in all the applications in :setting:`INSTALLED_APPS`. ``verbosity`` determines the amount of notification and debug information that will be printed to the console; ``0`` is no output, ``1`` is normal @@ -1013,15 +1033,18 @@ requirement is that it has the same arguments as the Django test runner: Testing utilities ----------------- +.. module:: django.test.utils + :synopsis: Helpers to write custom test runners. + To assist in the creation of your own test runner, Django provides a number of utility methods in the ``django.test.utils`` module. -``setup_test_environment()`` +.. function:: setup_test_environment() Performs any global pre-test setup, such as the installing the instrumentation of the template rendering system and setting up the dummy ``SMTPConnection``. -``teardown_test_environment()`` +.. function:: teardown_test_environment() Performs any global post-test teardown, such as removing the black magic hooks into the template system and restoring normal e-mail services. @@ -1029,7 +1052,7 @@ a number of utility methods in the ``django.test.utils`` module. The creation module of the database backend (``connection.creation``) also provides some utilities that can be useful during testing. -``create_test_db(verbosity=1, autoclobber=False)`` +.. function:: create_test_db(verbosity=1, autoclobber=False) Creates a new test database and runs ``syncdb`` against it. ``verbosity`` has the same behavior as in ``run_tests()``. @@ -1050,8 +1073,8 @@ provides some utilities that can be useful during testing. **New in Django development version:** This function returns the name of the test database that it created. -``destroy_test_db(old_database_name, verbosity=1)`` - Destroys the database whose name is in the ``DATABASE_NAME`` setting - and restores the value of ``DATABASE_NAME`` to the provided name. +.. function:: destroy_test_db(old_database_name, verbosity=1) + Destroys the database whose name is in the :setting:`DATABASE_NAME` setting + and restores the value of :setting:`DATABASE_NAME` to the provided name. ``verbosity`` has the same behavior as in ``run_tests()``.