= NewbieMistakes = 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 are having 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 missing the / at the end of the form action. If that is the case, the CommonMiddleware redirects to the exact name of the view - and that always includes a trailing /. 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. ==== Solution ==== Allways make sure that your form actions end with / like this: {{{
}}} == 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 {{{ }}}) in the "Select [object_type] to change" view. ==== Probable cause ==== You may have forgotten to create a {{{__str__()}}} function for your model. Django calls {{{__str__()}}} to find out how to display objects in the admin interface. An alternate cause is the string you return from {{{__str__()}}} 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 {{{__str__()}}} 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: {{{ sessionlist = request.session['my_list'] sessionlist.append(new_object) request.session['my_list'] = sessionlist }}} == 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: {{{ #!python class META: ... admin = meta.Admin( list_display = ('total_price'), ... ) }}} You are just missing a comma in the list_display assignement like this: {{{ #!python class META: ... admin = meta.Admin( list_display = ('total_price',), ... ) }}} Remember, in python: {{{ #!python >>> a = (1) ## This causes problems 1 >>> 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 [http://www.djangoproject.com/documentation/forms/ 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: {{{ manip = things.AddManipulator() form = formfields.FormWrapper(manip, {}, {}) }}} Not: {{{ manip = things.AddManipulator() form = formfields.FormWrapper(manip, (), ()) }}} If you pass in empty tuples for data & errors, it will silently fail to insert your form fields.