From c6c25adf6d9f71ea11f61392f6f3d221f01e5216 Mon Sep 17 00:00:00 2001 From: Jacob Kaplan-Moss Date: Fri, 3 Apr 2009 18:30:54 +0000 Subject: [PATCH] Fixed a whole bunch of small docs typos, errors, and ommissions. Fixes #8358, #8396, #8724, #9043, #9128, #9247, #9267, #9267, #9375, #9409, #9414, #9416, #9446, #9454, #9464, #9503, #9518, #9533, #9657, #9658, #9683, #9733, #9771, #9835, #9836, #9837, #9897, #9906, #9912, #9945, #9986, #9992, #10055, #10084, #10091, #10145, #10245, #10257, #10309, #10358, #10359, #10424, #10426, #10508, #10531, #10551, #10635, #10637, #10656, #10658, #10690, #10699, #19528. Thanks to all the respective authors of those tickets. git-svn-id: http://code.djangoproject.com/svn/django/trunk@10371 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/utils/html.py | 4 +- docs/_static/djangodocs.css | 6 +- docs/_static/docicons-behindscenes.gif | Bin 1024 -> 0 bytes docs/_static/docicons-behindscenes.png | Bin 0 -> 2269 bytes docs/_static/docicons-note.gif | Bin 632 -> 0 bytes docs/_static/docicons-note.png | Bin 0 -> 1013 bytes docs/_static/docicons-philosophy.gif | Bin 799 -> 0 bytes docs/_static/docicons-philosophy.png | Bin 0 -> 1523 bytes docs/howto/custom-file-storage.txt | 6 +- docs/howto/deployment/modpython.txt | 34 +++++++--- docs/howto/initial-data.txt | 2 +- docs/howto/static-files.txt | 11 ++- docs/intro/tutorial01.txt | 17 +++-- docs/intro/tutorial03.txt | 16 ++++- docs/intro/tutorial04.txt | 26 ++++--- docs/misc/distributions.txt | 81 ++-------------------- docs/obsolete/_images/formrow.gif | Bin 9156 -> 0 bytes docs/obsolete/_images/formrow.png | Bin 0 -> 16601 bytes docs/obsolete/_images/module.gif | Bin 5786 -> 0 bytes docs/obsolete/_images/module.png | Bin 0 -> 10072 bytes docs/obsolete/_images/objecttools_01.gif | Bin 1473 -> 0 bytes docs/obsolete/_images/objecttools_01.png | Bin 0 -> 1398 bytes docs/obsolete/_images/objecttools_02.gif | Bin 1874 -> 0 bytes docs/obsolete/_images/objecttools_02.png | Bin 0 -> 2268 bytes docs/obsolete/admin-css.txt | 8 +-- docs/ref/contrib/admin/index.txt | 40 ++++++++++- docs/ref/contrib/comments/index.txt | 5 ++ docs/ref/contrib/comments/models.txt | 82 +++++++++++++++++++++++ docs/ref/contrib/flatpages.txt | 5 ++ docs/ref/contrib/syndication.txt | 15 ++--- docs/ref/databases.txt | 61 +++++++++++++---- docs/ref/django-admin.txt | 20 ++---- docs/ref/forms/api.txt | 34 ++++++++++ docs/ref/forms/fields.txt | 65 +++++------------- docs/ref/forms/widgets.txt | 9 ++- docs/ref/models/fields.txt | 18 ++--- docs/ref/models/instances.txt | 12 ++++ docs/ref/models/relations.txt | 27 +++++++- docs/ref/templates/api.txt | 26 ++++--- docs/ref/unicode.txt | 2 +- docs/releases/1.0-porting-guide.txt | 23 ++++--- docs/topics/auth.txt | 34 +++++++--- docs/topics/cache.txt | 8 +-- docs/topics/db/models.txt | 35 ++++++++-- docs/topics/db/queries.txt | 9 ++- docs/topics/forms/formsets.txt | 8 ++- docs/topics/forms/modelforms.txt | 42 ++++++++++-- docs/topics/http/middleware.txt | 10 +++ docs/topics/serialization.txt | 5 ++ docs/topics/testing.txt | 7 +- 50 files changed, 551 insertions(+), 262 deletions(-) delete mode 100644 docs/_static/docicons-behindscenes.gif create mode 100644 docs/_static/docicons-behindscenes.png delete mode 100644 docs/_static/docicons-note.gif create mode 100644 docs/_static/docicons-note.png delete mode 100644 docs/_static/docicons-philosophy.gif create mode 100644 docs/_static/docicons-philosophy.png delete mode 100644 docs/obsolete/_images/formrow.gif create mode 100644 docs/obsolete/_images/formrow.png delete mode 100644 docs/obsolete/_images/module.gif create mode 100644 docs/obsolete/_images/module.png delete mode 100644 docs/obsolete/_images/objecttools_01.gif create mode 100644 docs/obsolete/_images/objecttools_01.png delete mode 100644 docs/obsolete/_images/objecttools_02.gif create mode 100644 docs/obsolete/_images/objecttools_02.png create mode 100644 docs/ref/contrib/comments/models.txt diff --git a/django/utils/html.py b/django/utils/html.py index c9855380410..951b3f2a592 100644 --- a/django/utils/html.py +++ b/django/utils/html.py @@ -28,7 +28,9 @@ trailing_empty_content_re = re.compile(r'(?:

(?: |\s|
)*?

\s*)+\ del x # Temporary variable def escape(html): - """Returns the given HTML with ampersands, quotes and carets encoded.""" + """ + Returns the given HTML with ampersands, quotes and angle brackets encoded. + """ return mark_safe(force_unicode(html).replace('&', '&').replace('<', '<').replace('>', '>').replace('"', '"').replace("'", ''')) escape = allow_lazy(escape, unicode) diff --git a/docs/_static/djangodocs.css b/docs/_static/djangodocs.css index fdaccf70ba4..a41be6d1b04 100644 --- a/docs/_static/djangodocs.css +++ b/docs/_static/djangodocs.css @@ -103,9 +103,9 @@ dt .literal, table .literal { background:none; } .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;} +.note, .admonition { padding-left:65px; background:url(docicons-note.png) .8em .8em no-repeat;} +div.admonition-philosophy { padding-left:65px; background:url(docicons-philosophy.png) .8em .8em no-repeat;} +div.admonition-behind-the-scenes { padding-left:65px; background:url(docicons-behindscenes.png) .8em .8em no-repeat;} /*** versoinadded/changes ***/ div.versionadded, div.versionchanged { } diff --git a/docs/_static/docicons-behindscenes.gif b/docs/_static/docicons-behindscenes.gif deleted file mode 100644 index 921bc45c33dc92f33c5c0d4c1a56f78647e14b34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1024 zcmV+b1poU-Nk%w1VJ`qL0M!5h2@M1#GZM+>qlv#mNoFK&nKh@@YFmIT5*i6NO&fr- zK6j=%*6h0Y{PQkA78@oFQgbLkSs!GKF`3U(&;x=)2&I zoY7dL)MT{Wfq;O3#^jy9zrVucn5x%rvDylbK%bwVxZZ}ZudkrfUfoQAd0t7zu}T#U|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@)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|Rl+#GpX8Qv5z%O3}5asUJ}q>zFO{%9qE8^aUYYZ(zB5CK!U7*z%$gFNd-WZ2Ag>miZM u@v0rQ%;!cddJMrGhJ-xCkuDWun1{x@U|>;57xd17L}sx?F-5vT00291;f>G$ diff --git a/docs/_static/docicons-behindscenes.png b/docs/_static/docicons-behindscenes.png new file mode 100644 index 0000000000000000000000000000000000000000..dc901bc867704a4411e3eb673a660f4aeaa56f22 GIT binary patch literal 2269 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 literal 0 HcmV?d00001 diff --git a/docs/_static/docicons-philosophy.gif b/docs/_static/docicons-philosophy.gif deleted file mode 100644 index 432d93ba7920dac1fcf7c879cc00205bf0108ac5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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@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?1jEtEdWtWxq!%(d+|?*$ zJ>j)CiQ#&W;wvx4KONs17{3%RTy?l~wcWh2#iG%A)QlU2xGRrILH4HiZQYXBf-C5`|9 diff --git a/docs/_static/docicons-philosophy.png b/docs/_static/docicons-philosophy.png new file mode 100644 index 0000000000000000000000000000000000000000..09f16c785b8b1e06ef3d0f7cd8bd583517a90ced GIT binary patch literal 1523 zcmVbqL0};7ApCGKBNeVP|*i52?%|tkd%VbswAd`%G#QUZi|s7At?=h z5r212GCQ3+ckZOV^b+o#d*;kJ|2gN(nU8E(Sy{PnJ`sVGMxXwog#(&(of&d@t(WBjP^wN#$;_pvbOxGeO1s=_TZCD+1lgQOtPSfg>vD` z!kJUo1Vq>>Q1)atAAEPG15*?r6O9|n+>PZ=a+h%lAex$*>g(&%>2xZUs;sP>oSa-( zSQs509T^#c0LsB*JL_IahT#gw3dltB*_C&q0z^>y+b%9I{R57ko*qD0EdiykuP>L& z(OUOv@<`Wis~AiGy}s+D-g*ZbN7@1+_u4t$gM)+3&CR+BD~+of8X7=$pmoQA*6mgq zm_|~UDLE#yV+MWn-h@Atz)U(lF)={|&z!n?wHR4tNGGs}UBxM(p{^*dL6ElO3eNZO zit0-!hlhg#ak~4mVulIb?kXCpt)s*-gBWFddwW=yo0G|87yz@6@kB{t7wgg*pkW?S z_@ktyqI7h004Pev!Iv>y8lQE@sAVTW^Yg+t0E&{HDk^GhY>X0c^Q8ock|;^6gMron zjl(gtN)Dpbs*AbP+uPgS-90okG&3_}l_6g6@v*g4n1W#=VT&p-sNWw44SZv7(YX5$JqAAUET`~y4YXh8`&i2{T(#&3;=<*PwaJw=}lf}=toWi~XUP!JD}eL?g=vzE@A1ICxq!bT6wUeUvB}6`a*>T=o2T^Q_NaM^vcOxYDQ- z{olQ;f4XVXMO`$N2EkR&7y0+yJyol9v+`Shk@KkkIw0DxtJIdzFu^z#I}X394@7ZQ z4`w3f3;9I|&M2UP;JSpj=YvJP#FWs`pIfKGt*O`}1d^oM$7F<`@SHWlb(ttAk!Yl|<8ny^$eVMY{-RrAv2?Fc#`Tfj z7uxO{CB&)XUb!z;nC_LkbOi|FuK&-lYtu`*9tRy0sc=tL55mWv5McqT8O5Hr5Mcoa Z=Rf900)6*lkY)e?002ovPDHLkV1gq@*9`yw literal 0 HcmV?d00001 diff --git a/docs/howto/custom-file-storage.txt b/docs/howto/custom-file-storage.txt index 8620b376038..cfb32262893 100644 --- a/docs/howto/custom-file-storage.txt +++ b/docs/howto/custom-file-storage.txt @@ -63,7 +63,11 @@ backend storage system. 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. +``File`` object itself. + +Should return the actual name of name of the file saved (usually the ``name`` +passed in, but if the storage needs to change the file name return the new name +instead). ``get_valid_name(name)`` ------------------------ diff --git a/docs/howto/deployment/modpython.txt b/docs/howto/deployment/modpython.txt index 3c3af82ec41..331515bdd82 100644 --- a/docs/howto/deployment/modpython.txt +++ b/docs/howto/deployment/modpython.txt @@ -17,14 +17,22 @@ 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 :ref:`How to use Django with FastCGI, SCGI, or -AJP `. +.. seealso:: + + * Apache is a big, complex animal, and this document only scratches the + surface of what Apache can do. If you need more advanced information about + Apache, there's no better source than `Apache's own official + documentation`_ + + * You may also be interested in :ref:`How to use Django with FastCGI, SCGI, + or 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 +.. _apache's own official documentation: http://httpd.apache.org/docs/ Basic configuration =================== @@ -52,15 +60,15 @@ Django mod_python handler." It passes the value of :ref:`DJANGO_SETTINGS_MODULE .. versionadded:: 1.0 The ``PythonOption django.root ...`` is new in this version. -Because mod_python does not know we are -serving this site from underneath the ``/mysite/`` prefix, this value needs to -be passed through to the mod_python handler in Django, via the ``PythonOption -django.root ...`` line. The value set on that line (the last item) should -match the string given in the ```` directive. The effect of this -is that Django will automatically strip the ``/mysite`` string from the front -of any URLs before matching them against your URLconf patterns. If you later -move your site to live under ``/mysite2``, you will not have to change anything -except the ``django.root`` option in the config file. +Because mod_python does not know we are serving this site from underneath the +``/mysite/`` prefix, this value needs to be passed through to the mod_python +handler in Django, via the ``PythonOption django.root ...`` line. The value set +on that line (the last item) should match the string given in the ```` directive. The effect of this is that Django will automatically strip the +``/mysite`` string from the front of any URLs before matching them against your +URLconf patterns. If you later move your site to live under ``/mysite2``, you +will not have to change anything except the ``django.root`` option in the config +file. When using ``django.root`` you should make sure that what's left, after the prefix has been removed, begins with a slash. Your URLconf patterns that are @@ -97,6 +105,10 @@ 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. +Make sure that your Python source files' permissions are set such that the +Apache user (usually named ``apache`` or ``httpd`` on most systems) will have +read access to the files. + 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 diff --git a/docs/howto/initial-data.txt b/docs/howto/initial-data.txt index b005c01b069..d36329daa49 100644 --- a/docs/howto/initial-data.txt +++ b/docs/howto/initial-data.txt @@ -47,7 +47,7 @@ look like in JSON: "first_name": "Paul", "last_name": "McCartney" } - }, + } ] And here's that same fixture as YAML: diff --git a/docs/howto/static-files.txt b/docs/howto/static-files.txt index a5e069f6f06..43062bebb62 100644 --- a/docs/howto/static-files.txt +++ b/docs/howto/static-files.txt @@ -10,9 +10,9 @@ How to serve static files 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. -The reasoning here is that standard Web servers, such as Apache_, lighttpd_ and Cherokee_, -are much more fine-tuned at serving static files than a Web application -framework. +The reasoning here is that standard Web servers, such as Apache_, lighttpd_ and +Cherokee_, are much more fine-tuned at serving static files than a Web +application framework. With that said, Django does support static files **during development**. You can use the :func:`django.views.static.serve` view to serve media files. @@ -21,6 +21,11 @@ use the :func:`django.views.static.serve` view to serve media files. .. _lighttpd: http://www.lighttpd.net/ .. _Cherokee: http://www.cherokee-project.com/ +.. seealso:: + + If you just need to serve the admin media from a nonstandard location, see + the :djadminopt:`--adminmedia` parameter to :djadmin:`runserver`. + The big, fat disclaimer ======================= diff --git a/docs/intro/tutorial01.txt b/docs/intro/tutorial01.txt index 8feb22141eb..a97359667f7 100644 --- a/docs/intro/tutorial01.txt +++ b/docs/intro/tutorial01.txt @@ -134,18 +134,27 @@ It worked! .. admonition:: Changing the port 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: + on the internal IP at 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 + + If you want to change the server's IP, pass it along with the port. So to + listen on all public IPs (useful if you want to show off your work on other + computers), use: + + .. code-block:: bash + + python manage.py runserver 0.0.0.0:8000 Full docs for the development server can be found in the :djadmin:`runserver` reference. - Database setup -------------- diff --git a/docs/intro/tutorial03.txt b/docs/intro/tutorial03.txt index df48a0286a3..ca0b985508c 100644 --- a/docs/intro/tutorial03.txt +++ b/docs/intro/tutorial03.txt @@ -302,6 +302,13 @@ for a given poll. Here's the view:: The new concept here: The view raises the :exc:`~django.http.Http404` exception if a poll with the requested ID doesn't exist. +We'll discuss what you could put in that ``polls/detail.html`` template a bit +later, but if you'd like to quickly get the above example working, just:: + + {{ poll }} + +will get you started for now. + A shortcut: get_object_or_404() ------------------------------- @@ -357,6 +364,10 @@ in ``django/conf/urls/defaults.py``, ``handler404`` is set to Three more things to note about 404 views: + * If :setting:`DEBUG` is set to ``True`` (in your settings module) then your + 404 view will never be used (and thus the ``404.html`` template will never + be rendered) because the traceback will be displayed instead. + * The 404 view is also called if Django doesn't find a match after checking every regular expression in the URLconf. @@ -365,8 +376,9 @@ Three more things to note about 404 views: 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. + * If :setting:`DEBUG` is set to ``False`` (in your settings module) and if + you didn't create a ``404.html`` file, an ``Http500`` is raised instead. + So remember to create a ``404.html``. Write a 500 (server error) view =============================== diff --git a/docs/intro/tutorial04.txt b/docs/intro/tutorial04.txt index 5c2e1e8ec1f..07aa477d67f 100644 --- a/docs/intro/tutorial04.txt +++ b/docs/intro/tutorial04.txt @@ -20,7 +20,7 @@ tutorial, so that the template contains an HTML ``
`` element: {% if error_message %}

{{ error_message }}

{% endif %} - + {% for choice in poll.choice_set.all %}
@@ -36,12 +36,12 @@ A quick rundown: selects one of the radio buttons and submits the form, it'll send the POST data ``choice=3``. This is HTML Forms 101. - * We set the form's ``action`` to ``/polls/{{ poll.id }}/vote/``, and we - set ``method="post"``. Using ``method="post"`` (as opposed to - ``method="get"``) is very important, because the act of submitting this - form will alter data server-side. Whenever you create a form that alters - data server-side, use ``method="post"``. This tip isn't specific to - Django; it's just good Web development practice. + * We set the form's ``action`` to ``vote/``, and we set ``method="post"``. + Using ``method="post"`` (as opposed to ``method="get"``) is very + important, because the act of submitting this form will alter data + server-side. Whenever you create a form that alters 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 :ttag:`for` tag has gone through its loop @@ -170,7 +170,17 @@ to write Python code to write an app. Let's convert our poll app to use the generic views system, so we can delete a bunch of our own code. We'll just have to take a few steps to make the -conversion. +conversion. We will: + + 1. Convert the URLconf. + + 2. Rename a few templates. + + 3. Delete some the old, now unneeded views. + + 4. Fix up URL handling for the new views. + +Read on for details. .. admonition:: Why the code-shuffle? diff --git a/docs/misc/distributions.txt b/docs/misc/distributions.txt index c94c399ce0c..6a0845801d4 100644 --- a/docs/misc/distributions.txt +++ b/docs/misc/distributions.txt @@ -4,7 +4,7 @@ Third-party distributions of Django =================================== -Several third-party distributors are now providing versions of Django integrated +Many third-party distributors are now providing versions of Django integrated with their package-management systems. These can make installation and upgrading much easier for users of Django since the integration includes the ability to automatically install dependencies (like database adapters) that Django @@ -15,81 +15,14 @@ if you want to use the development version of Django you'll need to follow the instructions for :ref:`installing the development version ` from our Subversion repository. -FreeBSD -======= +If you're using Linux or a Unix installation, such as OpenSolaris, +check with your distributor to see if they already package Django. If +you're using a Linux distro and don't know how to find out if a package +is available, then now is a good time to learn. The Django Wiki contains +a list of `Third Party Distributions`_ to help you out. -The `FreeBSD`_ ports system offers both Django 0.96 (`py-django`_) and a more -recent, but not current, version based on Django's trunk (`py-django-devel`_). -These are installed in the normal FreeBSD way; for Django 0.96, for example, type: -``cd /usr/ports/www/py-django && sudo make install clean``. +.. _`Third Party Distributions`: http://code.djangoproject.com/wiki/Distributions -.. _FreeBSD: http://www.freebsd.org/ -.. _py-django: http://www.freebsd.org/cgi/cvsweb.cgi/ports/www/py-django/ -.. _py-django-devel: http://www.freebsd.org/cgi/cvsweb.cgi/ports/www/py-django-devel/ - -Linux distributions -=================== - -Debian ------- - -A `packaged version of Django`_ is available for `Debian GNU/Linux`_. Version -0.95.1 is available in the "stable" repository; Version 0.96 is available in -the "testing" and "unstable" repositories. Regardless of your chosen repository, -you can install Django by typing ``apt-get install python-django``. - -When you install this package, ``apt`` will recommend installing a database -adapter; you should select and install the adapter for whichever database you -plan to use with Django. - -.. _Debian GNU/Linux: http://www.debian.org/ -.. _packaged version of Django: http://packages.debian.org/stable/python/python-django - -Fedora ------- - -A Django package is available for `Fedora Linux`_, in the "Fedora Extras" -repository. The `current Fedora package`_ is based on Django 0.96, and can be -installed by typing ``yum install Django``. The previous link is for the i386 -binary. Users of other architectures should be able to use that as a starting -point to find their preferred version. - -.. _Fedora Linux: http://fedora.redhat.com/ -.. _current Fedora package: http://download.fedora.redhat.com/pub/fedora/linux/extras/6/i386/repoview/Django.html - -Gentoo ------- - -A Django package is available for `Gentoo Linux`_, and is based on Django 0.96.1. -The `current Gentoo package`_ can be installed by typing ``emerge django``. - -.. _Gentoo Linux: http://www.gentoo.org/ -.. _current Gentoo package: http://packages.gentoo.org/package/django - -Ubuntu ------- - -The Debian ``python-django`` package is also available for `Ubuntu Linux`_, in -the "universe" repository for Ubuntu 7.10 ("Gutsy Gibbon"). The `current Ubuntu -package`_ is based on Django 0.96.1 and can be installed in the same fashion as -for Debian. - -.. _Ubuntu Linux: http://www.ubuntu.com/ -.. _current Ubuntu package: http://packages.ubuntu.com/gutsy/python/python-django - - -Mac OS X -======== - -MacPorts --------- - -Django 0.96 can be installed via the `MacPorts`_ system. If you're using Python 2.4, -type ``sudo port install py-django-devel``. For Python 2.5, type ``sudo port -install py25-django-devel``. MacPorts can also be used to install a database, -and the Python interface to your chosen database. - -.. _MacPorts: http://www.macports.org/ For distributors ================ diff --git a/docs/obsolete/_images/formrow.gif b/docs/obsolete/_images/formrow.gif deleted file mode 100644 index 3ff425862fb29a97b503a54490252f9894b99951..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9156 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

J)M$@o6R|ZZj=T)4)Y}97lK;c$jfz zEJAoGal;%YA(?8%jR^O-g$un5*%V;x=+1^t}PV&+jHxL z%NTi9BikFRaD?7Zy-j)vW3luk%AK|$l~a&Cf&O$((%%xfEj@_R#VCR`)W|Te!j$lF zyU>kNX~S$65lW7P%ct-yzYNQ?c5B-l#E?jptW6)x)i4W|qV3`ju2$67@ zWXhr;Y;1Ku13GcN`|+a0B#V>;o2wezGj_rysTSrIIQAki4lQrTZbgydJ=B$luAPSW zRR*j#+rMM03G8z##*d&N(X`4CVN~{J-8NWeFv84;zGl5c)@~)uhNn8;KKA1LrlPkD zt0i#mI7p>PBO4bJK##kC3lu7Mq)cY^7JQ3sM(2fh24KYHW4<+MC($H8iJ;h^^3;-~ zu$&`TI`F!et?OWWLrv646m6?;MNN}}timKHFj=0#19p3nVq)pBv9S$J&?uc>sd{@a zxjiD$+gDGXg5tKe=Z&!(5FVby`vhb73l%8u?;m7n6`LDAck&c7+MBmAA;C8ktJTEK zp@Q~I7R<4+dmS)tS<(R9yn=5%zi_AzUDxYkv!w5&$HtB6tewPT=raRf&rh++X{awx z?V`*<(@ZAz0dG2g>;sKQ*d^R&isr**r-s%yIyRq+TNqBp(m`aZChWRGo^*tc6R=FIw&!Mh!`=)qJ6AIB^B-Mr+a2fb&8Vri75no7LiR1 zP!A*5#Z0K?wih$hwTQ@KypV&&;G5<1lC2ZR zc(M||K+avC;Cc%ZsEK0_50BB%&>Z)GoB3fWM2NsdY)?;@Q&fUB3s!W}wSf2y#nvE4Ncf4!h=f!+*GT=K+nVINz%z{*l;{#xt|+a7IBV!aTaohG%F4FDPZj77zBh);kU-eLumM9+XzBWh;FCqQzPDE= zh<1cSa7_}*o0X6@2pdrKSQ(Pqg$4?J>B192naDj!ky_h_`gd4y4OUlpz2Q)&c_hsG zpvU|A7;t?_qs8g8eo68NEz>8g;x;ZWV->D62_;IpY)L-?ZW-xe14cy# zBn0C!^3M}w5eLnrOvuKk)Ojz$nA}lh$~RzmQ6afza#% z(jb{aTUtr5~+==V%JjLuP>xIQa(E*L-YV&OQ7N+ldmDff=}c%|hN01JA75TBV& zaPWLM(ZhVTsyijkQem;Hu^KB3mk zekvEg*n|;)*9|&C zy?0VD9{95Oh&S1Op*R_Wo$x`TAR)?x9R|T70TT5wQZKw+fJZ=_TfaN?K}QQU;&8iq z&pu@%*laC*_O8_;bhbjN+E_<#pj464h^Y~=82jcANqu@a0s4i(mPtWl6wRb1G`lA^nwWH!xyR3Wwb@(GDb&LXq*lTK7($y{jy zu=!tP71askLSn4AE{z&MJFiq!@>UF%Ym;jlq+jJ9J6WnE#LyzgMzvAtU?l~8(u7ga zm5;*Muz|ifqzsMxgF7&)Fp-}97oyR=cqNaUaYEr)jsYd>`-I!jO6yFEE-rB37otUnLR6`{*Sz!5_%Fb_#mJhV;KZmHmFU zia|t^A^yXLnu0$V&>YOH3HiT0%LM-FQH0o@YY>D42s&o0mH0D{2mEhZfB`gO4`G`| zND#H#EVwjT((4Cb<}DvshbH=eWB!a91;nLFRRpbbnslW+nRz%&)brB-Vu%J$a!4qg zN*u(Gbu#}Yn;M{UzzD8$;sCx;N`PTR?avYYxTh^a8G7lG(5)K(y&Hm% zvz$5;;s`qyTbsWAhcSQpK|taph;Z@|M8@f?cXkkw|9JOP_Kct#{)b<=Aps7Fzpc1< zLR|iwnOOhtGgrjg)vyr#=B((h?ROcUuUT{D2Jmy|8u7JriM!M!r+Dh zRJ~r+@)jY#f+A+&eva_he^bgl(n2|ZSZBEC>B&$XJ7-&Fdo>l*ovmmxxT|(ziQ)W@I(QDiBWZsnK&SIpi>=72gewSDo;4i3Dl1c z1$%(jT@4!KQ#A@m%u3X}5q4DbIdPpj?+wswWOp~7uKufBiin$E+{)=S9IR6e8v8KW zk-dBFO{_t?oG9*cAQT8d=dB_hEh<5-pt-Fyfcj@E);*l!Q5lG6zd80@% zQJJZHva!aX=w|V?YLU>Ts35)8L|e~4$$cqDs!Zu@pbP;mECpYUY^rCb2!}fn2PKj4 zQJ^@)A%~GNYVR&ykqQf65^ri&+Y(QLgKR#PQF1Z2Y0fP?H1NY-XCYVYXmUm!nu$G3NI%qfvMc0#yt zW-kR8B8njDj@Y1&r)odJXn|1FTG2fYcZ!!j0VBG?+gx+XU)8;v>#qHjBvOn#g8d^y zH|BORamj>c$fGhKb7U0Q`E{b0jE-Qv5R@Fr{Ia5%@W1LkwF1z1{F!~FiZo~r4((!41k0fM-2zCP zI$Laanq!KEzP|9kIjx;vYSrTEp$#otf80r@n;F61pKNZ7>LyVxJk#^1KP-R)43y#g7dzsM+a)9W*Hbja_GZU2(;lpc7%e)?M@i2hxZ7TM2^eJ_ zrf9e6JXVZ1W-}JiFYM;Yy$6m~9Xk@_GwapYmwoM)4OC%cY=)va&=85<(^V7%-c4@Q z-usQ!mftLt58-oIHS6%$RA3Nhk}=jM1AId9UR2m8r_9Pcd3Cp+%iC@R?VbCZ?Cd|T z@lh4*Mh2roWy_jjyZg6Z(A$?(U;~gRj3clkIxFv;DgKW4t@axWEGTzHMWVP|7eb~M zq1xG5VBgp+atJa2A`FNMuw*VD$tXaQ3ajCP?Q=iwSO`kXnu5vXqL#B0an9;g>@t=d zFD5{q00-%ZgV0HRUZqpZG)i8e*W7iT zt@r!n1J*(*#1VV6v2+L01YtO6+6EGC75C1~Jx5aM{6>&_puvg&9 zQhH5As+xt_0xm)v)hHMlBbM`MZuK+F^4r1qVC!U;&NkcSjT$uXS1Hv^MR={$YPHJs ziHe$@8vqUcYWW~fl#D`dq8jFg&$XL>-GEJ|=*|n|j69K;jOK7f*WdTM#bfq`WP6X# z#pNwGr_;0XPvEovSnJa{_o8Thl>PU#Lc`fG|7(+fip`cU5U9HM`|jywXWwzVo>xAYEQCI2l7$jX z^V{{;WygBIqGsBB@1yyuBi}!BzAh$@@txj?J_w=pR zGDkqX11(lzyMDvXzK2Klx~-MzeF5oQAC-N=k@XP5($o5FUW0RAy!M~x zaTw+5I&z?w%Q~+8e(E_%>dRgCcUrAmfbq-j`SI7{qa*QbZ=c@?4& zeLb!)T({H0#F{$qF#8WGnm=k?&a17v97mnx?Yqw6U*&n8sv0%&WZ~x~Iv7vx9Q9Sgc|cZfCo{KC$w;7_M$z?L97A)tiJz)b8PYF*<}zRsAV#=h;Yl`X8&joO?Am1cC;TB9jdXP;Aft;j-775AqK_0Y zI@iu>C8BVV!QAfW3jf-Ud-R^M++MB=5{R_eD!^q-xPoiz@CX5vPhr3s@8oEw*Q>O zSDP+7LKd;?}oM?aXyQhF8zMsPS!GUTR=0pm|v^ z=jUu!(QbX{yY@XELXy7rqt!O38oMJY2oScW(|5Wof74(|#>K~F%?LpC5-cbL^L>5) z3~1ka+sDVRe^nlz(muKu8C&!(!Eak1nr-8D4TCO+2|s%6!=gfR4eleTeR6&g>tK+K zP@_NJ=p5ul{`%zqQp%+X6DLk3Ab_DB8PV3CqambpR^av96fxCMRS zFg%r|XuV-a?;iKo8htgLZr6UV#kIj735n;{@a}iX2}3mBXBa@3-b3f~*ixm4yp)2C z0DAFm9CdlkE+ofcvwjU{H=X#6Ank=Ox*tLm5V(|EpKbA!`u0XDc}f_QA345vuL&NL zOFKr5*5g+3Q$SI{s&be z4ylA*wAlotv9~j#GKc9e;jAU4u)k?f)mpVZ7IkGX(t99T5)(0G`Ixwb)M-3p2D6lwL|1H8 z-n&Kr5>>*$YO1}<$~y5)F{(5`qLTF-Oeg(|46gxxY83G|yH(h@Vu&1>)sX7i1mw(u z(B3%JJ?_Kw_Cf!8SbF2sr>NiWufN;u=C2Mbl6k&jeEGT?y?tzDvz4fkXMdT;mG{gx zINkfniT*jy5-STOQ3eT04Sn4B%z)@IdCET|xOY$q(sE$I4xtl}$zP;R*Y3WpdY|du zAF;Ua#VGp`4$imiMR2UpElJ&Y70NY}7Snyd4r_P|^!yaki}x&8_fFEdHF7wT1j>qB zM2Yy2_iS_4|Os4sLD`nFDZ~ zvtRw4X<&aRUQQl~MYrOiB=~EKq*9BdGx$5R)k1nfg6`e^8_ZXuI;2Pl2h-Nl=8W$U zg*mGng7+mMjUADKx!+0Cs+xCX9$h*rj+9VVSDrd{43Xs}h#fs-;`pN`(Z5?NL+Pq5 ztJYjoTDg{+Xyi{OUNA4^$^CBXewbAB8lA@%L93yrIy$ow9C;;>xl5cN%^-&~s-j}? zuV|j*$72@|YH@vvHokye1gls13rem_YQ^mYaiElDG++Wb3=D=W zzK&`rktG;uF{H+w9|(OxFe~81xdE<|$+xy7q@?WIFFmaYd5h4)MDFh{YRPqvUU=o- zttuX!J3;f*M;S12Tp$c1QJFkw1qnocGx6o@Ly3TS(Ln;vAA$g)Cuc5O4h7{+nR@t0 zVG6r|AibKL9s|>`G#KN^A(C1}bU)@8AmiEtN6PyZ7|@59-!*m*S9M1Sn{>{q63FT7SUpMjCX(DhECoh8Ew0M&6&W%q`2+Oouu;1&k5EB8t z0Eary%3dj)&3ThCyl?1t*1X;^mn3i9y*FV}M+i+_|sIKD31@Lj*?5Cc}k<$w$aDPF1j{nrO46Kj_*w%`ZsM?t6xMcSr zf+8ze6=jy>$uR%b(+fmEzXl2G^)VUvgW-Sy_dzkZ%Gwa)|Cxn;rv6DG3Y19YDTEFh lz5O~)1em1#-?I0Me}@7TYO;~s@#p7(Bt_*!s)Y>v{|}9mB0B&8 literal 0 HcmV?d00001 diff --git a/docs/obsolete/_images/module.gif b/docs/obsolete/_images/module.gif deleted file mode 100644 index 43c4d4de99d94fe8be6c5d541d4f9075e06e6d4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5786 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 diff --git a/docs/obsolete/_images/module.png b/docs/obsolete/_images/module.png new file mode 100644 index 0000000000000000000000000000000000000000..6acda978091070ec62c96c9d335b5bb0fdfb06e4 GIT binary patch literal 10072 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 Ef&~hkumAu6 literal 0 HcmV?d00001 diff --git a/docs/obsolete/_images/objecttools_02.gif b/docs/obsolete/_images/objecttools_02.gif deleted file mode 100644 index 0faa39a6a94dcbce6c99768e38ea903b6d3c7100..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1874 zcmWktdsGv57LEiY1~3#9!GjtVAGHXm=^h_j!=v&LRJ5)|?RHtEoYqnoMQyP?XM>@% zRktA0g+WqqfKgLrorM8nM@bwoc1mQkW{phAc3^05%B*3QaYx31-^TBc``5kad!3t+ zmA-M)A1#V#g{V-N&F1p*^6Kj9_V)J5%1Xpa&&JfQE(! z0HpKh&reNF0U#rYe^<2GY#4?SjEGo048y>XA0`t70m(-b=8ldI1cArK#$endF$9bt zEX$$}R*(S%A-oKlo0|nm6ltr)Vqs-~djydoT3T8-p7V%ce0+RpXvpbw0^qxQ_ik@* zF8~6^aZZb$2X?eUJcaWBT)TG7>-EAGS8Z)AilSCpXoDb86de`>$X>4-rx`|)B&Sd2 zUh<+MjSDOTM2hi{4l^V%R@qDNjLRnhiefAdTHq+w89N@XL0jBnuN?&H;!PW z2PZuw#X2aK_UB@PohSrj4jjiBx83WqV}A2c+m$O7Udo}L~%YOsmG+}PMC zdF`+X!yt%ux(OI^ppYGbXc0*M)#hhZzFJOlHdE0X*e!I37QKJUu-v_`^2)Jvn&FB1@9h&8(N zn6(+`oC5_#%Ay_J&Lp?mHK~;mFW^ zwAo&%O*17g%}Iu)H;cldFs2UvRbcm7q|yoThE>kLb~Tn>zPE zaAr&H+C(`U8%)~aXm}%XTkNCVk->-3HZIAmwrOiW-4Hl4(e+Dj z&(^Hx%F6YOtlaTNM$^Q3U9qgQ1q8INs!@SaM)Nt|n~|=mP{pMuV$qCd)8;^9j+(<= zKmU2wt<=!?$=~Kb$QA}a-ucn@5Cg$YMt@)-UH@CYfZ8a~K%qco08-o^tri(v@ z4dzZ(zS<>U{3?6@(ZSZj&F`0-39xnx1vPISxwrkBw;z>`=>^4C^HSY$^9}DRZ^YCT zwii^TtlM!k>YhGg?@0RcdFfzyASmMcaOH|iA4L5{FUb$T-h3RshE%6I|Etj_tUeZ4 zv@`P`LD3)w?br7tO%ANK57FncJE*g-1=M3B1Fxx7%sd-&HuBD`% zR-2Q9dv7idS$n%`O+fu;yEB#Gd{azM$G&0B63fiR3jON-3BwvPV7{?lQlC`Ywn)lL z%Rr{BJbbTC*{g5*WLfU|#1(ik(Qtcgk5#!K^e5YlA%6W2{JqgdpNw2s5H(AjDM=0) z$HZ?7AIrQ|TlZMjXwTG546LkfnJ{Q>Vg=9iBZ2=qQ=b{~`Q0Q?^dG)3QEvYtCafPV zO8~it!feJ{1+PCkPy#&l{WAisbL}y1!L%RsEb2lI4OSe?Q_Q=a99F%%FsATgX;Vg2 zz{v^Ks$FtP-|Ta$7Q>Pc_1vxxG=|8%VHrDjx^$pu^04<9y)=CJm(M33=zs2r$ucHf zIJ)`Q`cit}z0mHC(y_{dxwoEJeE)ut)3Ks8@AsbAsl0$F>$U(@-!5xP_K~_Jky}w+ za@K%uf0f~V`n%V+?q(a8xTcdnYPzGB55JT5bXnAqZ(_IezrO(!qlfNWk zG%Ij>zB1%$eue&+L7f<%Z;Tk7Shs~6)|9O#!cL!69H%Q@`M9Kd%>n*wUOybwb-yp+ QG=DBXv^lybI$W{k|DldvhX4Qo diff --git a/docs/obsolete/_images/objecttools_02.png b/docs/obsolete/_images/objecttools_02.png new file mode 100644 index 0000000000000000000000000000000000000000..06a854009bcef5dd425f9ca50b6239a60cd09b7f GIT binary patch literal 2268 zcmV<22qX82P)e5Szl8VSr)(0-H=QOn~*V*HEf*DLITdf$Pz`&0v431 zVoR;9ota84I!_i~z>nagQ*hMS%A${(-=bk>lU!Okr_D$KFH*Zj>l^7_1f${=uN+u-+Xa-8TQp$ru z87SpSp-h$R@LUwYK4xWQ#pQCndi5$C4(Bra|LQReQ!14Q4jeF>%{4VOWo2b~;(0F+ z<%xfrL+8(*zj*OtE+;sSt5hnIBwJfswOXwtlhV18PNyF}eE9U~(_F6ih@PS-$YW?u zr?auK@z}9rfLSuO_XUw;@H?VRCX;#m06)KMwnvX1wY9a`Y&J2I5^E4l8y+6s`-vhz z4go{h5WGMS-S-rc7|3=s8yg#v)5SUAa5%1AyC!B*m@81IA3S&v2m~bk?r|lA4Z#ae z0p4pw{{zC?+uLF35!`5ge*X6D+X5zexdLOMPzd%Yf|lH^z(Bvvlrb>b`UeKS zZc-wp$p-qqCbi^5{o&qIokq!_?JFU8fWU$*4iRp&L)-&@BN2VVGL(xW*D)MD+WezGsbjFNXJ5`*pTqT1PA~mlflIza!oB*dPrTP3C)bjjb;r(DZk5CraY2? zgXD*MA=N>R!t>)d?=AQKy-&S5@y$(#srRccl9;$L=!iAhzp|qFABOJEvSCTV?6mh7 zW5I|*t07P-=o~{N7GEM8rzc#B8j#m)yoCy?(gqBv5n8NTW zR7bUmtR|?4@2!afz5xPTIg3RU_e=*VglUYh41Lm62j09>ZWc~$JDn&IpL4<;R2eL% zj$+FRB-4?4Ty3mVA*3J=)~f&5P>rG0g+&_XX3GInP9Q?1m3f_WF^bTdk2lGg2?&XJ zt7T$Ha|sm2b6mKNWIYxjDHMt`XU=d9BasNpBuoE!tyrvq|l925y1;h15f8;@YKz%ha0p6qWsg|?7MpK50DU4B8h!eL9ezdBk6Vd z;CiU-Gc{d0k>Wt(=XBKxJ7=S;<2*3^W5Xl=y*uWkiQ|6ki+N+bQCtE=@zitjjhRvK zH5Q9qzkWTBId2UDJE%o4C(i`&P-5|?;X8D_HTL%R(9bm6yrXx<(Gf%K#~PJNU)}yi zRr;Tvj6wFk>2=yZK~dRh2(7QtF{A@O&m|6#WJf0@d~94}feaA1nqm>nPJ66mv%b{= zP9pA^WrUQhJ32;8QB@UB#{GUj6%W65FGkw+hGsL^&ighD`uci$*>Xb$37RBKYI8l! zaKT+#rFh%&hvOUqMezu3nyY*H@?~}i4y8IeIueP*)vH&z3lJDUrD4rL5Z0A_`}T2% z3zC_=EzStctjbRNmlpHySEhfsH$KlO=_{dbXm6@r2}XeWmcG8W!<~PzK>bVwmsc}p z7|IYBot_DTxeP;*xhZ&Tg){*KLHF$*0?y6%91K&>r|H7Rw&mA!0f?=5pZk+qovwqHo@86f4 zDfU&MMy^!iC>@Qm3qP(@%Hz@KRyyEvr5w+8IZknO!p`TI2t_z2 z=8%jFr6yMagqM;L>2KQ~NidxUb|h(};V ztJM%ZKwuou*BwWcGhFUn#d2<#V%v-+_lgp0O$;%aZ7t71b z;SXEb?@Ufk?#x*WFR6{%DLAN<%xgq3^g<~ zSglr#M#E(i!sF!%^nqMB#e;vPEfz~%T^%e&us42(Lzf*v9$yW3@>VxEh=JUP{D7sW zwzd}jRfpi&M9IXkrx5K3ExX|aRwDT70S+NifJ|v7x%-vf2%_ZkgJFR89rVGVDgoII q21>cI8?1hqK1;dsVLsR0K=m89nOK7bs>~Sx0000Add redirect -.. image:: _images/objecttools_01.gif +.. image:: _images/objecttools_01.png :alt: Object tools on a changelist page and from a form page: @@ -146,7 +146,7 @@ and from a form page:

  • View on site
  • -.. image:: _images/objecttools_02.gif +.. image:: _images/objecttools_02.png :alt: Object tools on a form page Form Styles @@ -176,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:: _images/formrow.gif +.. image:: _images/formrow.png :alt: Example use of form-row class Labels diff --git a/docs/ref/contrib/admin/index.txt b/docs/ref/contrib/admin/index.txt index 1c14a77a9cb..463829538a8 100644 --- a/docs/ref/contrib/admin/index.txt +++ b/docs/ref/contrib/admin/index.txt @@ -46,6 +46,11 @@ Other topics :maxdepth: 1 actions + +.. seealso:: + + For information about serving the media files (images, JavaScript, and CSS) + associated with the admin in production, see :ref:`serving-media-files`. ``ModelAdmin`` objects ====================== @@ -425,8 +430,8 @@ edit and save multiple rows at once. ``list_editable`` interacts with a couple of other options in particular ways; you should note the following rules: - * To use ``list_editable`` you must have defined ``ordering`` on - either your model or your ``ModelAdmin``. + * To use ``list_editable`` you must have defined ``ordering`` on either + your model's or your ``ModelAdmin``'s inner ``Meta``. * Any field in ``list_editable`` must also be in ``list_display``. You can't edit a field that's not displayed! @@ -1155,6 +1160,37 @@ If you wish to change the index or login templates, you are better off creating your own ``AdminSite`` instance (see below), and changing the ``index_template`` or ``login_template`` properties. +Linking to admin views +====================== + +.. versionadded:: 1.1 + +All the admin views use :ref:`named URL patterns ` so it's +easy to link to admin views with ``urlresolvers.reverse`` or the :ttag:`url` +template tag. + +Each model gets its own set of views and its own name using the model's app name +and model name. For example, the "add" view for a ``Choice`` model in a +``polls`` app would be named ``"admin_polls_choice_add"``. + +All the available views and their names are: + + ============== ====================================== =================== + View View name Parameters + ============== ====================================== =================== + Change list ``"admin___changelist"`` None + Add object ``"admin___add"`` None + Change object ``"admin___change"`` ``object_id`` + Delete object ``"admin___delete"`` ``object_id`` + Object history ``"admin___history"`` ``object_id`` + ============== ====================================== =================== + +For example, to get the change URL for a particular ``Choice`` object:: + + >>> from django.core import urlresolvers + >>> c = Choice.objects.get(...) + >>> change_url = urlresolvers.reverse('admin_polls_choice_change', (c.id,)) + ``AdminSite`` objects ===================== diff --git a/docs/ref/contrib/comments/index.txt b/docs/ref/contrib/comments/index.txt index 36151d5fbf1..f3ccf54ebee 100644 --- a/docs/ref/contrib/comments/index.txt +++ b/docs/ref/contrib/comments/index.txt @@ -99,6 +99,10 @@ For example:: {% for comment in comment_list %} ... {% endfor %} + +This returns a list of :class:`~django.contrib.comments.models.Comment` objects; +see :ref:`the comment model documentation ` for +details. .. templatetag:: get_comment_count @@ -212,6 +216,7 @@ More information .. toctree:: :maxdepth: 1 + models settings signals upgrade diff --git a/docs/ref/contrib/comments/models.txt b/docs/ref/contrib/comments/models.txt new file mode 100644 index 00000000000..af85d68f00a --- /dev/null +++ b/docs/ref/contrib/comments/models.txt @@ -0,0 +1,82 @@ +.. _ref-contrib-comments-models: + +=========================== +The built-in comment models +=========================== + +.. module:: django.contrib.comments.models + :synopsis: The built-in comment models + +.. class:: Comment + + Django's built-in comment model. Has the following fields: + + .. attribute:: content_object + + A :class:`~django.contrib.contettypes.generic.GenericForeignKey` + attribute pointing to the object the comment is attached to. You can use + this to get at the related object (i.e. ``my_comment.content_object``). + + Since this field is a + :class:`~django.contrib.contettypes.generic.GenericForeignKey`, it's + actually syntactic sugar on top of two underlying attributes, described + below. + + .. attribute:: content_type + + A :class:`~django.db.models.ForeignKey` to + :class:`~django.contrib.contenttypes.models.ContentType`; this is the + type of the object the comment is attached to. + + .. attribute:: object_pk + + A :class:`~django.db.models.TextField` containing the primary + key of the object the comment is attached to. + + .. attribute:: site + + A :class:`~django.db.models.ForeignKey` to the + :class:`~django.contrib.sites.models.Site` on which the comment was + posted. + + .. attribute:: user + + A :class:`~django.db.models.ForeignKey` to the + :class:`~django.contrib.auth.models.User` who posted the comment. + May be blank if the comment was posted by an unauthenticated user. + + .. attribute:: user_name + + The name of the user who posted the comment. + + .. attribute:: user_email + + The email of the user who posteed the comment. + + .. attribute:: user_url + + The URL entered by the person who posted the comment. + + .. attribute:: comment + + The actual content of the comment itself. + + .. attribute:: submit_date + + The date the comment was submitted. + + .. attribute:: ip_address + + The IP address of the user posting the comment. + + .. attribute:: is_public + + ``False`` if the comment is in moderation (see + :ref:`ref-contrib-comments-moderation`); If ``True``, the comment will + be displayed on the site. + + .. attribute:: is_removed + + ``True`` if the comment was removed. Used to keep track of removed + comments instead of just deleting them. + diff --git a/docs/ref/contrib/flatpages.txt b/docs/ref/contrib/flatpages.txt index f1c3a1b8f52..875a1c05e5a 100644 --- a/docs/ref/contrib/flatpages.txt +++ b/docs/ref/contrib/flatpages.txt @@ -39,6 +39,11 @@ To install the flatpages app, follow these steps: ``'django.contrib.sites'`` to your :setting:`INSTALLED_APPS` setting, if it's not already in there. + Also make sure you've correctly set :setting:`SITE_ID` to the ID of the + site the settings file represents. This will usually be ``1`` (i.e. + ``SITE_ID = 1``, but if you're not using the sites framework to manage + multiple sites, it could be the ID of a different site. + 2. Add ``'django.contrib.flatpages'`` to your :setting:`INSTALLED_APPS` setting. diff --git a/docs/ref/contrib/syndication.txt b/docs/ref/contrib/syndication.txt index 795ce0c7c4c..cb9c22b8bde 100644 --- a/docs/ref/contrib/syndication.txt +++ b/docs/ref/contrib/syndication.txt @@ -160,11 +160,11 @@ into those elements. :class:`~django.contrib.syndication.feeds.Feed` class. * To specify the contents of ````, 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 + in :meth:`items()`, Django first 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. If that method doesn't exist, Django tries executing a + ``get_absolute_url()`` method on that object. . 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 @@ -644,9 +644,8 @@ This example illustrates all possible attributes and methods for a Returns the URL for every item in the feed. """ - # ITEM_GUID -- The following method is optional. This property is - # only used for Atom feeds (it is the ID element for an item in an - # Atom feed). If not provided, the item's link is used by default. + # ITEM_GUID -- The following method is optional. If not provided, the + # item's link is used by default. def item_guid(self, obj): """ diff --git a/docs/ref/databases.txt b/docs/ref/databases.txt index bd28df0835d..d035da2ead0 100644 --- a/docs/ref/databases.txt +++ b/docs/ref/databases.txt @@ -80,7 +80,6 @@ You should also audit your existing code for any instances of this behavior before enabling this feature. It's faster, but it provides less automatic protection for multi-call operations. - .. _mysql-notes: MySQL notes @@ -247,18 +246,18 @@ anything in a `MySQL option file`_. Here's a sample configuration which uses a MySQL option file:: - # settings.py - DATABASE_ENGINE = "mysql" - DATABASE_OPTIONS = { - 'read_default_file': '/path/to/my.cnf', - } - - # my.cnf - [client] - database = DATABASE_NAME - user = DATABASE_USER - password = DATABASE_PASSWORD - default-character-set = utf8 + # settings.py + DATABASE_ENGINE = "mysql" + DATABASE_OPTIONS = { + 'read_default_file': '/path/to/my.cnf', + } + + # my.cnf + [client] + database = DATABASE_NAME + user = DATABASE_USER + password = DATABASE_PASSWORD + default-character-set = utf8 Several other MySQLdb connection options may be useful, such as ``ssl``, ``use_unicode``, ``init_command``, and ``sql_mode``. Consult the @@ -426,6 +425,42 @@ This provides the ability to upgrade both the DB-API 2.0 interface or SQLite 3 itself to versions newer than the ones included with your particular Python binary distribution, if needed. +"Database is locked" errors +----------------------------------------------- + +SQLite is meant to be a lightweight database, and thus can't support a high +level of concurrency. ``OperationalError: database is locked`` errors indicate +that your application is experiencing more concurrency than ``sqlite`` can +handle in default configuration. This error means that one thread or process has +an exclusive lock on the database connection and another thread timed out +waiting for the lock the be released. + +Python's SQLite wrapper has +a default timeout value that determines how long the second thread is allowed to +wait on the lock before it times out and raises the ``OperationalError: database +is locked`` error. + +If you're getting this error, you can solve it by: + + * Switching to another database backend. At a certain point SQLite becomes + too "lite" for real-world applications, and these sorts of concurrency + errors indicate you've reached that point. + + * Rewriting your code to reduce concurrency and ensure that database + transactions are short-lived. + + * Increase the default timeout value by setting the ``timeout`` database + option option:: + + DATABASE_OPTIONS = { + # ... + "timeout": 20, + # ... + } + + This will simply make SQLite wait a bit longer before throwing "database + is locked" errors; it won't really do anything to solve them. + .. _oracle-notes: Oracle notes diff --git a/docs/ref/django-admin.txt b/docs/ref/django-admin.txt index 60ed244d17f..71804cf0227 100644 --- a/docs/ref/django-admin.txt +++ b/docs/ref/django-admin.txt @@ -458,8 +458,10 @@ supports the FastCGI protocol. See the :ref:`FastCGI deployment documentation .. _flup: http://www.saddi.com/software/flup/ -runserver [optional port number, or ipaddr:port] ------------------------------------------------- +runserver +--------- + +.. django-admin:: runserver [port or ipaddr:port] Starts a lightweight development Web server on the local machine. By default, the server runs on port 8000 on the IP address 127.0.0.1. You can pass in an @@ -491,8 +493,7 @@ machines on your network. To make your development server viewable to other machines on the network, use its own IP address (e.g. ``192.168.2.1``) or ``0.0.0.0``. ---adminmedia -~~~~~~~~~~~~ +.. django-admin-option:: --adminmedia Use the ``--adminmedia`` option to tell Django where to find the various CSS and JavaScript files for the Django admin interface. Normally, the development @@ -503,8 +504,7 @@ Example usage:: django-admin.py runserver --adminmedia=/tmp/new-admin-style/ ---noreload -~~~~~~~~~~ +.. django-admin-option:: --noreload Use the ``--noreload`` option to disable the use of the auto-reloader. This means any Python code changes you make while the server is running will *not* @@ -541,14 +541,6 @@ 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 :ref:`howto-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 ----- diff --git a/docs/ref/forms/api.txt b/docs/ref/forms/api.txt index 96c0440fb38..7a2341f69b4 100644 --- a/docs/ref/forms/api.txt +++ b/docs/ref/forms/api.txt @@ -129,6 +129,40 @@ what happens with unbound forms:: >>> f.errors {} +Dynamic initial values +---------------------- + +.. attribute:: Form.initial + +Use ``initial`` to declare the initial value of form fields 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:: + + >>> f = ContactForm(initial={'subject': 'Hi there!'}) + +These values are only displayed for unbound forms, and they're not used as +fallback values if a particular value isn't provided. + +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 + Name: + Url: + Comment: + Accessing "clean" data ---------------------- diff --git a/docs/ref/forms/fields.txt b/docs/ref/forms/fields.txt index d1ff54908d1..63ac707acf3 100644 --- a/docs/ref/forms/fields.txt +++ b/docs/ref/forms/fields.txt @@ -127,6 +127,8 @@ We've specified ``auto_id=False`` to simplify the output:: The ``initial`` argument lets you specify the initial value to use when rendering this ``Field`` in an unbound ``Form``. +To specify dynamic initial data, see the :attr:`Form.initial` parameter. + 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:: @@ -234,7 +236,6 @@ fields. We've specified ``auto_id=False`` to simplify the output:: .. attribute:: Field.error_messages - 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:: @@ -256,54 +257,6 @@ And here is a custom error message:: 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 - Name: - Url: - Comment: - >>> f = CommentForm(initial={'name': 'another username'}, auto_id=False) - >>> print f - Name: - Url: - Comment: - -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 - Name: - Url: - Comment: - - Built-in ``Field`` classes -------------------------- @@ -819,6 +772,20 @@ example:: def label_from_instance(self, obj): return "My Object #%i" % obj.id +.. attribute:: ModelChoiceField.empty_label + + By default the ``