here is the relevant information to solve my problem, including why
the development server worked and apache didn't:
Serving media files¶
Django doesn't serve media files itself; it leaves that job to
whichever Web 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
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 particular part of the site:
<Location "/media">
SetHandler None
</Location>
Just change Location to the root URL of your media files. You can also
use <LocationMatch> to match a regular expression.
This example sets up Django at the site root but explicitly disables
Django for the media subdirectory and any URL that ends with .jpg,
.gif or .png:
<Location "/">
SetHandler python-program
PythonHandler django.core.handlers.modpython
SetEnv DJANGO_SETTINGS_MODULE mysite.settings
</Location>
<Location "/media">
SetHandler None
</Location>
<LocationMatch "\.(jpg|gif|png)$">
SetHandler None
</LocationMatch>
Serving the admin files¶
Note that the Django development server automagically serves admin
media files, 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 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.
2. Or, copy the admin media files so that they live within your
Apache document root.