Newbie mistakes

Please feel free to share the things that tripped you up when you started with Django. We'll try to improve Django's error handling to catch such mistakes in the future.

POST to views loses POST data

Symptom

You've got a form that does a POST to some view, and the view doesn't get the POST data from the form.

Probable cause

You might be missing the / at the end of the form action. If that's the case, the CommonMiddleware (check your MIDDLEWARE_CLASSES redirects to the exact name of the view - and that always includes a trailing slash. Because it does so by using the standard HTTP redirection through Location header, it can't pass on the POST data - and that's why it gets lost.

Your forms doesn't upload files

Symptom

You have FileField() and ImageField() fields in your form and the files are not uploaded when you submit this form

Probable cause

You might be missing the request.FILES argument when intantiate your Form object.

Solution

Always make sure that you are passing request.FILES when intantiate your Form object:

form = MyForm(request.POST, request.FILES)

URLconf include() misbehaving

Symptom

You're trying to get your URLconf files to work, but getting cryptic errors about how there is no module 'index' (where 'index' is some function you are trying to assign as a view), or module 'foo' has no attribute 'urlpatterns'.

Probable cause

You may have tried to load your view files using include() in the URLconf file (in tutorial 3, this is myproject/settings/urls/main.py). The include() call assumes that the file it's loading is also a URLconf file.

Solution

Remove the include(). Just give the module and function name (e.g., 'myproject.apps.polls.views.polls.index') as a string, with no include() around it.

Blank object names

Symptom

The automatic admin interface is showing nothing (or a single &nbsp;) in the "Select [object_type] to change" view.

Probable cause

You may have forgotten to create a __unicode__() function for your model. Django calls __unicode__() to find out how to display objects in the admin interface. An alternate cause is the string you return from __unicode__() includes brackets (an therefore looks like an html tag), and is cleaned up by the strip_tags template filter, resulting in blank entries.

Solution

Add a correct __unicode__() function (without brackets in the output) to all your models. Make it a habit so it becomes automatic.

Integer & NULLS

Problem

When you have a Field: current_zip = meta.IntegerField(maxlength=5,blank=True)

django will create a not nullable field in the DB. However leaving the field blank (in admin/web) django will try and insert a NULL value in the DB.

Solution

Add null=True:

current_zip = meta.IntegerField(maxlength=5,null=True,blank=True)

Date & NULLS

Same problem as Integer & NULLS with the same solution.

Appending to a list in session doesn't work

Problem

If you have a list in your session, append operations don't get saved to the object.

Solution

Copy the list out of the session object, append to it, then copy it back in:

Errors about undefined attributes with one-char names

Problem

You get an AttributeError with some weird attribute name that's only one char long. You don't have that attribute name anywhere in your code.

Solution

Search your model and code for situations where you have to pass a tuple of values and want to pass a tuple with one element - and that element is a string like in this sample:

classMETA:...
admin = meta.Admin(
list_display =('total_price'),...)

You are just missing a comma in the list_display assignment like this:

classMETA:...
admin = meta.Admin(
list_display =('total_price',),...)

Remember, in python:

>>> a =(1)## This causes problems1>>> a =(1,)## These are fine.(1,)>>> a =[1][1]>>> a =[1,][1]

Since a tuple is expected but a string provided, the code will merrily iterate over the characters of the string instead of the tuple elements - and that's where the single-char attribute names come from. If the commas are consistently causing you problems, try using brackets [] instead of parentheses.

I'm using formfields.FormWrapper and none of my form fields show up

Problem

You are using code similar to that documented ​here, but when you put {{ form.field_name }}, you get nothing.

Solution

Make sure when you create your form object, you are passing in empty dictionaries, not tuples. For example:

Possible cause

Check to see that you didn't use a reserved name in naming your application, i.e. "email", "date" and "time" are common application names that would validate when the server starts but will break Django's admin.

Solution

Rename your application directory using a non-reserved name, i.e., "email_app" instead of "email". Go into the INSTALLED_APPS section of settings.py and change the name there too. Also, don't forget to do a syncdb to create the newly renamed app in your database. You may also want to go in to your database and drop the old "mis-named" table.