2005-07-14 03:08:56 +08:00
==========
Django FAQ
==========
2005-07-15 08:42:28 +08:00
General questions
=================
2005-07-14 03:08:56 +08:00
2005-07-15 08:42:28 +08:00
Why does this project exist?
----------------------------
Django grew from a very practical need: in our fast-paced newsroom, we often
2005-07-16 00:19:53 +08:00
have only a matter of hours to take a complicated Web application from
2005-07-15 08:42:28 +08:00
concept to public launch. Django was designed to not only allow us to
2005-07-16 00:19:53 +08:00
build Web applications quickly, but to allow us to build them right.
2005-07-14 03:08:56 +08:00
2005-07-15 08:42:28 +08:00
Django would not be possible without a whole host of open-source projects --
2005-07-16 03:41:54 +08:00
`Apache`_, `Python`_, and `PostgreSQL`_ to name a few -- and we're thrilled to be
2005-07-16 00:19:53 +08:00
able to give something back to the open-source community.
2005-07-14 03:08:56 +08:00
2005-07-16 03:41:54 +08:00
.. _Apache: http://httpd.apache.org/
.. _Python: http://www.python.org/
.. _PostgreSQL: http://www.postgresql.org/
2005-07-16 01:59:30 +08:00
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.
2005-07-14 03:08:56 +08:00
According to Wikipedia_, "Django is pronounced **zhane**-go (with a long 'a')."
2005-07-16 01:59:30 +08:00
.. _Django Reinhardt: http://en.wikipedia.org/wiki/Django_Reinhardt
2005-07-14 03:08:56 +08:00
.. _Wikipedia: http://en.wikipedia.org/wiki/Django_Reinhardt
Is Django stable?
-----------------
2005-07-16 00:19:53 +08:00
We've been using Django for almost two years. Sites built on Django have
2005-07-14 03:08:56 +08:00
weathered traffic spikes of over one million hits an hour, and at least
2005-07-16 00:19:53 +08:00
one Slashdotting. Yes, it's quite stable.
2005-07-14 03:08:56 +08:00
2005-07-15 08:42:28 +08:00
Does Django scale?
------------------
2005-07-16 00:19:53 +08:00
Yes. Compared to development time, hardware is cheap, and so Django is
2005-07-15 08:42:28 +08:00
designed to take advantage of as much hardware as you can throw at it.
2005-07-16 00:19:53 +08:00
Django ships with clean separation of the database layer from the
application layer and a simple-yet-powerful `cache framework`_.
2005-07-15 08:42:28 +08:00
.. _`cache framework`: http://www.djangoproject.com/documentation/cache/
2005-07-14 03:08:56 +08:00
Who's behind this?
------------------
2005-07-16 00:19:53 +08:00
Django was developed at `World Online`_, the Web department of a newspaper in
Lawrence, Kansas, USA.
2005-07-14 03:08:56 +08:00
`Adrian Holovaty`_
2005-07-15 08:42:28 +08:00
Adrian is a gypsy-jazz virtuoso, an amateur Beatles historian and a proud
Chicagoan. He's also a pretty decent programmer, with a knack for whipping
data into shape and putting it to work for the good of his fellow man.
Adrian is the lead developer at World Online and the man behind the code at
2005-07-17 10:21:54 +08:00
`chicagocrime.org`_. He lives in Chicago.
2005-07-15 08:42:28 +08:00
2005-08-03 02:00:13 +08:00
On IRC, Adrian goes by ``adrian_h``.
2005-07-14 03:08:56 +08:00
`Simon Willison`_
2005-07-16 04:37:03 +08:00
Simon is a well-respected Web developer from England. He had a one-year
2005-07-17 10:21:54 +08:00
internship at World Online, during which time he and Adrian developed
Django from scratch. He's enthusiastic, he's passionate about best
practices in Web development, and he really likes squirrels. Probably to a
fault. He went back to university to finish his degree and is poised to
continue doing big, exciting things on the Web. He lives in England.
2005-07-14 03:08:56 +08:00
2005-08-03 02:00:13 +08:00
On IRC, Simon goes by ``SimonW``.
2005-07-14 03:08:56 +08:00
`Jacob Kaplan-Moss`_
2005-07-15 08:42:28 +08:00
Jacob is a whipper-snapper from California who spends equal time coding and
cooking. He does Web development for 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
2005-07-17 10:21:54 +08:00
he's been messing with Python on the PSP. He lives in Lawrence, Kansas.
2005-07-14 03:08:56 +08:00
2005-08-03 02:00:13 +08:00
On IRC, Jacob goes by ``jacobkm``.
2005-07-15 08:42:28 +08:00
`Wilson Miner`_
Wilson's design-fu makes us all look like rock stars. When not sneaking
2005-08-03 02:00:13 +08:00
into apartment complex swimming pools, he's the Commercial Development
2005-07-15 08:42:28 +08:00
Director for World Online, which means he makes the money that pays all our
2005-07-17 10:21:54 +08:00
paychecks. He lives in Lawrence, Kansas.
2005-07-16 00:19:53 +08:00
2005-08-03 02:00:13 +08:00
On IRC, Wilson goes by ``wilsonian``.
2005-07-16 00:19:53 +08:00
.. _`World Online`: http://code.djangoproject.com/wiki/WorldOnline
2005-07-14 03:08:56 +08:00
.. _`Adrian Holovaty`: http://www.holovaty.com/
2005-07-16 00:19:53 +08:00
.. _`chicagocrime.org`: http://www.chicagocrime.org/
2005-07-14 03:08:56 +08:00
.. _`Simon Willison`: http://simon.incutio.com/
2005-07-16 00:19:53 +08:00
.. _`simon.incutio.com`: http://simon.incutio.com/
2005-07-14 03:08:56 +08:00
.. _`Jacob Kaplan-Moss`: http://www.jacobian.org/
.. _`Wilson Miner`: http://www.wilsonminer.com/live/
2005-07-17 01:01:38 +08:00
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?
-----------------------------------------------------------------------------------------------------------------------------------------------------
2005-07-19 07:14:48 +08:00
That's because Django isn't strictly a MVC framework. We don't really believe in
any capital-M Methodologies; we do what "feels" right. If you squint the right
2005-07-17 01:01:38 +08:00
way, you can call Django's ORM the "Model", the view functions the "View", and
2005-07-17 05:16:40 +08:00
the dynamically-generated API the "Controller" -- but not really.
2005-07-17 01:01:38 +08:00
2005-07-25 03:02:22 +08:00
In fact, you might say that Django is a "MTV" framework -- that is, Model,
Template, and View make much more sense to us.
2005-07-17 05:16:40 +08:00
So, although we've been strongly influenced by MVC -- especially in the
separation-of-data-from-logic department -- we've also strayed from the path
2005-07-17 01:01:38 +08:00
where it makes sense.
2005-07-25 03:02:22 +08:00
<Framework X> does <feature Y> -- why doesn't Django?
-----------------------------------------------------
2005-07-26 00:46:52 +08:00
We're well aware that there are other awesome Web frameworks out there, and
we're not adverse to borrowing ideas where appropriate. However, Django was
2005-07-25 03:02:22 +08:00
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.
2005-07-17 01:01:38 +08:00
Do you have any of those nifty "screencast" things?
---------------------------------------------------
2005-07-19 07:14:48 +08:00
They're in the works. It's amazing how much time those things take! Stay tuned...
2005-07-17 01:01:38 +08:00
Installation questions
======================
2005-07-15 08:42:28 +08:00
How do I get started?
---------------------
2005-07-17 01:01:38 +08:00
#. `Download the code`_.
#. Install Django (read the `installation guide`_).
#. Walk through the tutorial_.
2005-07-19 07:14:48 +08:00
#. Check out the rest of the documentation_, and `ask questions`_ if you
2005-07-17 01:01:38 +08:00
run into trouble.
2005-07-17 05:16:40 +08:00
2005-07-17 01:01:38 +08:00
.. _`Download the code`: http://www.djangoproject.com/download/
.. _`installation guide`: http://www.djangoproject.com/documentation/install/
.. _tutorial: http://www.djangoproject.com/documentation/tutorial1/
.. _documentation: http://www.djangoproject.com/documentation/
2005-07-19 07:14:48 +08:00
.. _ask questions: http://www.djangoproject.com/community/
2005-07-17 01:01:38 +08:00
How do I fix the "install a later version of setuptools" error?
---------------------------------------------------------------
Just run the ``ex_setup.py`` script in the Django distribution.
2005-07-15 08:42:28 +08:00
2005-07-16 04:37:03 +08:00
What are Django's prerequisites?
--------------------------------
2005-07-19 07:14:48 +08:00
Django requires Python_ 2.3 or later.
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.
2005-07-17 05:16:40 +08:00
2005-07-22 11:15:43 +08:00
You'll also need a database engine. PostgreSQL_ is recommended, and MySQL_
and `SQLite 3`_ are supported.
2005-07-16 04:37:03 +08:00
.. _Python: http://www.python.org/
2005-07-17 05:16:40 +08:00
.. _Apache 2: http://httpd.apache.org/
2005-07-16 04:37:03 +08:00
.. _mod_python: http://www.modpython.org/
2005-07-19 07:14:48 +08:00
.. _WSGI: http://www.python.org/peps/pep-0333.html
2005-07-16 04:37:03 +08:00
.. _PostgreSQL: http://www.postgresql.org/
.. _MySQL: http://www.mysql.com/
2005-07-22 11:15:43 +08:00
.. _`SQLite 3`: http://www.sqlite.org/
2005-07-17 01:01:38 +08:00
2005-07-19 07:14:48 +08:00
Do I have to use mod_python?
----------------------------
Not if you just want to play around and develop things on your local computer.
Django comes with its own Web server, and things should Just Work.
For production use, though, we recommend mod_python. The Django developers have
been running it on mod_python for about two years, and it's quite stable.
However, if you don't want to use mod_python, you can use a different server,
as long as that server has WSGI_ hooks. More information on alternate server
arrangements is forthcoming.
2005-07-17 01:01:38 +08:00
2005-07-19 07:14:48 +08:00
.. _WSGI: http://www.python.org/peps/pep-0333.html
2005-07-17 01:01:38 +08:00
2005-07-19 07:14:48 +08:00
How do I install mod_python on Windows?
---------------------------------------
2005-07-17 01:01:38 +08:00
2005-07-22 02:03:25 +08:00
* For Python 2.4, check out this `guide to mod_python & Python 2.3`_.
* For Python 2.3, grab mod_python from http://www.modpython.org/ and read
`Running mod_python on Apache on Windows2000`_.
2005-07-26 00:46:52 +08:00
* Also, try this (not Windows-specific) `guide to getting mod_python
2005-07-22 02:03:25 +08:00
working`_.
2005-07-17 05:16:40 +08:00
2005-07-17 01:01:38 +08:00
.. _`guide to mod_python & Python 2.3`: http://www.lehuen.com/nicolas/index.php/2005/02/21/39-win32-build-of-mod_python-314-for-python-24
.. _`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
(Thanks to deelan for this info.)
Will Django run under shared hosting (like TextDrive or Dreamhost)?
-------------------------------------------------------------------
2005-08-03 04:33:02 +08:00
See our `Django-friendly Web hosts`_ page.
.. _`Django-friendly Web hosts`: http://code.djangoproject.com/wiki/DjangoFriendlyWebHosts
2005-07-17 01:13:20 +08:00
Using Django
============
2005-07-17 01:01:38 +08:00
Why do I get an error about importing DJANGO_SETTINGS_MODULE?
-------------------------------------------------------------
Make sure that:
2005-07-17 01:13:20 +08:00
* The environment variable DJANGO_SETTINGS_MODULE is set to a fully-qualified
2005-07-17 01:01:38 +08:00
Python module (i.e. "mysite.settings.main").
2005-07-17 05:16:40 +08:00
2005-07-17 01:01:38 +08:00
* Said module is on ``sys.path`` (``import mysite.settings.main`` should work).
2005-07-17 05:16:40 +08:00
2005-07-17 01:01:38 +08:00
* The module doesn't contain syntax errors (of course).
2005-07-17 05:16:40 +08:00
2005-07-17 01:01:38 +08:00
* 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::
2005-07-17 05:16:40 +08:00
2005-07-17 01:01:38 +08:00
os.environ.update(req.subprocess_env)
2005-07-17 05:16:40 +08:00
2005-07-17 01:01:38 +08:00
(where ``req`` is the mod_python request object).
2005-07-17 05:16:40 +08:00
I can't stand your template language. Do I have to use it?
2005-07-17 01:13:20 +08:00
----------------------------------------------------------
We happen to think our template engine is the best thing since chunky bacon,
2005-07-17 05:16:40 +08:00
but we recognize that choosing a template language runs close to religion.
2005-07-17 01:13:20 +08:00
There's nothing about Django that requires using the template language, so
2005-07-17 05:16:40 +08:00
if you're attached to ZPT, Cheetah, or whatever, feel free to use those.
2005-07-17 01:01:38 +08:00
2005-07-25 03:02:22 +08:00
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
2005-07-26 00:46:52 +08:00
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.
2005-07-25 03:02:22 +08:00
#. Add the ``FileField`` or ``ImageField`` to your model, making sure
2005-07-26 00:46:52 +08:00
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 must 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
2005-07-25 03:02:22 +08:00
``{{ object.get_mug_shot_url }}``.
2005-09-02 05:48:15 +08:00
If I make changes to a model, how do I update the database?
-----------------------------------------------------------
If you don't care about clearing data, just do this::
django-admin.py sqlreset appname | psql dbname
That "psql" assumes you're using PostgreSQL. If you're using MySQL, use the
appropriate command-line utility, ``mysql``.
2005-09-02 05:51:01 +08:00
``django-admin.py sqlreset`` outputs SQL that clears the app's database
table(s) and creates new ones. The above command uses a Unix pipe to send the
SQL directly to the PostgreSQL command-line utility, which accepts SQL as
input.
2005-09-02 05:48:15 +08:00
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 a
``django-admin.py updatedb`` command, which would output the necessary
``ALTER TABLE`` statements, if any.
2005-07-20 03:55:31 +08:00
The database API
================
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.core.db import db
>>> db.queries
[{'sql': 'SELECT polls_polls.id,polls_polls.question,polls_polls.pub_date FROM polls_polls',
'time': '0.002'}]
``db.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.
2005-08-03 04:38:55 +08:00
``db.queries`` includes all SQL statements -- INSERTs, UPDATES, SELECTs, etc.
2005-08-02 05:40:13 +08:00
Can I use Django with a pre-existing database?
----------------------------------------------
2005-08-26 06:51:30 +08:00
Yes. See `Integrating with a legacy database`_.
2005-08-02 05:40:13 +08:00
2005-08-26 06:51:30 +08:00
.. _`Integrating with a legacy database`: http://www.djangoproject.com/documentation/legacy_databases/
2005-08-02 05:40:13 +08:00
2005-07-17 10:43:18 +08:00
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:
2005-08-17 06:54:05 +08:00
* Set the ``SESSION_COOKIE_DOMAIN`` setting in your admin config file
2005-07-22 02:03:25 +08:00
to match your domain. For example, if you're going to
"http://www.mysite.com/admin/" in your browser, in
2005-08-17 06:54:05 +08:00
"myproject.settings.admin" you should set ``SESSION_COOKIE_DOMAIN =
2005-07-22 02:03:25 +08:00
'www.mysite.com'``.
2005-07-26 00:46:52 +08:00
2005-07-22 02:03:25 +08:00
* 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
2005-08-17 06:54:05 +08:00
``SESSION_COOKIE_DOMAIN`` accordingly.
2005-07-17 10:43:18 +08:00
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.
2005-07-15 08:42:28 +08:00
2005-07-20 09:34:08 +08:00
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 ``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.
2005-07-16 00:19:53 +08:00
The dynamically-generated admin site is ugly! How can I change it?
2005-07-16 00:29:26 +08:00
------------------------------------------------------------------
2005-07-15 08:42:28 +08:00
2005-07-16 04:37:03 +08:00
We think it's very purty, 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, so any changes you'd like to make should
be possible by editing the CSS stylesheet. We've got a `guide to the CSS used in
the admin`_ to get you started.
2005-07-15 08:42:28 +08:00
.. _`guide to the CSS used in the admin`: http://www.djangoproject.com/documentation/admin_css/