Code


Version 83 (modified by pbx, 6 years ago) (diff)

Added django-hotclub link to example/reusable section

This is a work in progress, answering questions that do indeed get asked frequently on the Django IRC channel (#django on irc.freenode.net). Feel free to contribute, but try to keep it clear and concise. Please don't editorialize.

There's also a helpful official FAQ.

TOC?

General Tips

Python questions

How do I learn Python if I'm new to programming?

How do I learn Python if I'm not new to programming?

Are there any books on Python?

Yes. http://wiki.python.org/moin/PythonBooks

What's this about Python Path? Django is complaning it can't import stuff.

This is an important concept to understand in order to use Python/Django happily. The official Python tutorial explains it pretty well.

Installing and Deploying Django

Which version should I use, the 0.96 release or the Subversion checkout?

The 0.96 release is well-tested and stable, and is best for production deployments. Tracking the development version of Django through a Subversion checkout can be nice if there's a new feature you really want, but does require you to pay more attention to what's going on in Django development -- if a backwards-incompatible change is introduced, you'll need to be watching the development timeline to notice it and change your code to suit, where sticking to official releases means that you get a list of any changes you need to make in the release notes.

All backwards incompatible changes are (or should be) also recorded on the BackwardsIncompatibleChanges wiki page. Let us know (file a ticket) if you notice any genuine backwards incompatibilities that are missing.

There will be several backwards-incompatible changes before the next release of Django (for example, the workings of the admin app will be changing), so it's officially recommended that production deployments stick to the 0.96 release until the next release is ready.

When will the next release be out? -or- When will X branch be done?

"When it's done" is the short answer. Fixed release dates are rarely set, but searching or browsing the developer list (http://groups.google.com/group/django-developers/) can be informative.

The VersionOneFeatures page might be helpful also.

If you feel like pitching in, great! See the Contributing docs.

I'm trying to install Django on Windows and something is weird.

Have you looked here? http://code.djangoproject.com/wiki/WindowsInstall

What should I use for development -- the built-in server, mod_python, FastCGI?

It's generally easiest to use the built-in development server for development, since it automatically reloads your Python source files when it detects changes. Apache needs to be restarted to see changes to your source files (unless you set MaxRequestsPerChild 1, which you should do with caution since it is not suitable for production).

Some prefer to replicate the production environment as closely as possible, meaning that if their deployed project uses mod_python then their development server does as well.

What database should I use?

For development, most people find SQLite to be fastest and simplest to run with -- just make sure the database file and its directory are writeable by the owner of the web server process. For production, PostgreSQL and MySQL are the most thoroughly-tested of the databases Django supports, but it's best to choose based on the needs of your applications; for example, applications which do very little writing of data to the DB will enjoy the speed of SQLite, but applications which involve many complex queries or which require robust concurrent-write features like transaction isolation will probably want to look at Postgres or MySQL (and, of course, MySQL is often handy simply because many shared hosting providers have it set up by default).

Learning Django

Should I read the documentation on the djangoproject.com website, or djangobook.com?

Start with the documentation here, and then have a look at the book if you're interested; the documentation on djangoproject.com includes the official tutorial, and a number of comprehensive references which aren't currently available in the book.

What's the difference between null=True and blank=True in models?

null=True means that the database will accept a NULL value for that field; blank=True means that Django's validation system won't complain about a missing value. If you use blank=True but not null=True you will need to have your code fill in a value before storage in the database -- specifying a default on a field, or putting something in the model's save method to generate a value are two good ways to handle this, and can be extremely useful when you want to calculate one field's value based on others.

Which runs faster, X or Y?

This is a tempting question to ask in hopes of getting a quick answer on the "best" way to do something. Unfortunately, the answer is generally "profile your app and see". Performance tuning always starts with a baseline. If you haven't measured current performance to get a baseline, you aren't in a position to do much with the answer to the question anyway.

You can learn more about Python's handy profiling tools in the Python documentation.

Troubleshooting

General problem-solving advice: Test the things you think are true until you find the one that isn't.

"It doesn't work!" or "I got an error!"

If you want good help you'll need to give a little more information. Keep in mind that we probably know little if anything about your project, your level of experience with Python and Django, etc.

Did it work before? Or is this something you're trying for the first time? Does it raise an error? Die silently? Give unexpected output?

If you want help with an error, try to give us 1) the code that produced the error and 2) the error traceback itself.

When asking for help, make sure you describe 1) what you did, 2) what you expected to happen, and 3) what actually happened.

Pasting your code is often helpful. Don't forget to set the syntax when you paste so that the proper colorizing is applied -- that makes it easier for us to read your stuff. The Django debug page has a handy button for automatically sharing traceback code.

I'm using the development version (via Subversion) and when I ran "svn up" a bunch of stuff broke!

Don't use the development version of Django unless you also follow the BackwardsIncompatibleChanges and possibly the timeline as well. That way you can see what has changed *before* you update.

That way, changes like auto-escaping of HTML in templates won't catch you by surprise.

Also, when reading the documentation, keep a special eye out for the "New In Development Version" sections.

My app and/or models are not showing up on the home page of the admin

  • Is the app listed in INSTALLED_APPS?
  • Is your models.py free of syntax errors?
  • Do you have an "Admin" inner class in your model?
  • Have you tried restarting the server (this includes the dev server)?

My media/static files (CSS, images, etc.) aren't showing up.

Django doesn't serve static media automatically (exception: admin app running under the dev server).

If you're running the development server, read this: http://www.djangoproject.com/documentation/static_files/

If you're running Apache, read this: http://www.djangoproject.com/documentation/modpython/#serving-media-files

Confusingly, though the MEDIA_* settings in your settings.py file refer to your media files, not the Admin app's media files, the default path for Admin app media (ADMIN_MEDIA_PREFIX) is set to "/media/". Many Django users change this to "/admin_media/" or "/adminmedia/" to reduce potential confusion.

Why isn't my template tag or filter working?

Of course, you've read the documentation, right? Here's a brief list of things to check first before asking:

  • your filter/tag should be in a file named something like [yourfilterlibraryname].py (e.g. if it was myfilter.py, you'll use {% load myfilter %} in the template)
  • that file exists in a directory named templatetags and this directory is sitting inside of an app directory (e.g. .../projectdir/appdir/templatetags)
  • an empty file named __init__.py also exists in the templatetags directory (this makes the directory into a python module which can be imported)
  • in your project settings.py, the application where the templatetags directory is contained is in INSTALLED_APPS
  • each filter or tag in your library is decorated correctly (see docs)
  • neither your library nor anything it imports raises any exceptions (for example, if your library tries to import something that's not installed, and so raises an ImportError, that will prevent Django from seeing it)
  • restart the webserver (yes, even if you're using runserver)

I have a DateField or DateTimeField with a default value of now(), but it's not working!

What you've probably done is something like this:

some_date_field = models.DateTimeField(default=datetime.datetime.now())

When you do that you're immediately calling datetime.datetime.now and passing its return value -- at the moment the class is defined -- to be the default, which means it will not change during the life of a server process. What you want to do instead is this:

some_date_field = models.DateTimeField(default=datetime.datetime.now)

Note that there are no parentheses on datetime.datetime.now in this version, so you're passing the function itself to be the default. When Django receives a function as a default value for a model field, it will call the function each time a new object is saved, and that will correctly generate the current date/time for each object.

I'm trying to use __str__() or __unicode__() on my model, but it's not working

It's likely that you're using __str__() with the development version of Django, or __unicode__() with a release version. After the release of 0.96, Django's internals became fully Unicode aware. As a result, model classes that used to use __str__() to provide string versions of themselves need to be updated to use __unicode__() to work with the development version of Django. However, users of a Django release still need to use __str__().

More information on exactly what changed regarding Unicode in Django is available on the UnicodeBranch page; note the application porting checklist if you're coming from an older version of Django.

See the StringEncoding page for an overview of how Django handles Unicode text.

How to do Stuff

How do I create a subclass of an existing model?

Model inheritance (aka model subclassing) is available in Django trunk as of r7477.

If you're using it, make sure you've read the documentation and understand the difference between abstract base class and multi-table inheritance options. The latter can be confusing to newcomers because an instance of a parent class will also contain, on an attribute named after a child class, that same object represented as an instance of the child class. Got that?

An established mechanism for adding additional information to Django User objects without subclassing is known as "profiles"; you can read about it in the Definitive Guide.

For an important alternatve viewpoint on model subclassing, see: http://www.b-list.org/weblog/2007/02/20/about-model-subclassing

I think Ajax is awesome! How do I do Ajax with Django?

Choose your favorite excellent Javascript library and go to it. Django provides serializers to JSON and XML, which you can read about in the documentation: http://www.djangoproject.com/documentation/serialization/

Also see this helpful article from James Bennett (with bonus anti-Javascript-helpers rant!): http://www.b-list.org/weblog/2006/07/02/django-and-ajax

How do I customise the admin interface so all logged-in users can use it without screwing up anything?

The admin interface is designed for use by trusted site staff, not by any user -- if you don't trust a user with the level of access the admin application provides, you'll need to provide non-admin views for the actions you'd like to allow them to take.

How do I make extensive changes in the admin interface?

At the moment it's probably best not to; the admin app is fairly specialized and doesn't have a lot of places to customize behavior, so you'll usually end up writing less code by just rolling your own set of views. The newforms-admin branch, however, is significantly chanaging the admin app's interfaces to make customization much simpler and more flexible.

For less extensive changes, also see the documentation in The Definitive Guide to Django.

I want to have some code run when the server/application starts. How do I do that?

Both mod_python and FastCGI are structured in such a way that there's no such thing as "application startup" or "server startup"; the best solution is to place your "startup" code somewhere that's guaranteed to be imported early on in the request/response cycle (the __init__.py file of your project, or of a specific application you're using, can be a good place, because Python will execute code found there the first time it has to import the module; just be aware that referencing the same module in different ways, say by doing from myproject.myapp import foo in one place, and from myapp import foo in another, will cause that code to be executed once for each different way you import it).

Do I have to hard-code my media URL in all my templates for CSS, images and Javascript?

No; you can use {{ MEDIA_URL }}. If you're using the development version of django and generic views, you can use {{ MEDIA_URL }} without changing anything.

If you're using the development version and render_to_response(), you'll have to include RequestContext, as described here: http://www.djangoproject.com/documentation/templates_python/#subclassing-context-requestcontext

If you're using 0.96, you can get the same functionality by creating a template context processor, as described: http://www.b-list.org/weblog/2006/jun/14/django-tips-template-context-processors/

How do I use Django in a shell script?

http://www.b-list.org/weblog/2007/sep/22/standalone-django-scripts/

Can I use the Date/Time picker JavaScript from the Admin in my own app?

Short answer: No.

Long answer: It is possible, but requires reusing the Admin JS and CSS, and is more trouble than it is worth. Most JavaScript frameworks (such as YUI, Dojo, jQuery, and Prototype) provide similar functionality, either out of the box or through plugins. Additionally, there are many JavaScript snippets available across the Web.

I want to repeat a bit of dynamic information (eg from a database) on many views. Do I have to change every view?

No, you can use an inclusion tag.

If I change my model, will manage.py syncdb update my database table?

No, you'll need to manually change your database table. If you use manage.py sqlall on your app to produce a SQL file before editing your models, you can run it again afterwards and use the difference between the two to see what you need to change in the database.

Resources, Tools, and Code

What editor is best for Django?

Vim. No, wait, Emacs. A lot of people seem to like TextMate, too. The best editor is the editor you prefer.

Is there a free CMS available for Django?

At this point there is nothing well-established (like Plone, for instance). In practice, people mean so many different things by "CMS" that it may be hard to get a straight answer. This question is often asked by newcomers; one recommendation is to learn a bit of Django and see just how easy it is to make a site that does what you want. If you're in a big rush, there's always Ellington: http://www.ellingtoncms.com/

Where can I find example code and/or reusable apps?

IRC and djangoproject.com Miscellany

The ticket tracker thinks I'm a spammer!

You need to register: http://www.djangoproject.com/accounts/register/

Is there a channel bot?

Yes, it's very handy -- see DjangoBot for more.