Version 41 (modified by NickAdams, 11 years ago) ( diff )

--

Better Error Messages

Good error messages make for more productive developers. This page is a place to collect error messages that could stand improvement, or which are misleading or confusing in certain contexts. Most of us have had the experience of getting a weird message, puzzling it out (perhaps with help from django-users or #django) and then moving on.

Some of these may seem like quick patches but others will take a bit of consideration -- that's why the wiki page rather than individual tickets. Some are more along the lines of "Django Lint" than simple changes to error output.

For now, let's try dividing them into sections by major module. Within those sections suggested format is: error message, explanatory context (often important -- a message that is very helpful in one context can be confusing in another), suggested improvements/changes.

Also see:

django.contrib.admin

'NoneType' object has no attribute 'get_field_sets'

Context: One or more models that are referenced by ForeignKey from another model are missing their inner Admin class. Possible other causes as well. See ticket #1808.
Suggestion: Check relevant Admin settings during model validation?

  • Ticket #3219 -- suggestion for better error messages for invalid Admin attributes
Please correct the error below.

Context: This error may appear on the admin screen after trying to save a form, even though there is no error below that is highlighted.
Suggestion: Check to see if you have listed the desired fields in ModelAdmin, but then misspelled one while trying to use a custom form field in an associated ModelForm.

django.core

TypeError at ...
string indices must be integers

Context: A FileUploadField is being validated but the form did not have enctype="multipart/form-data" set.
Suggestion: Check form enctype during validation? Show FILES in addition to GET and POST on error pages?

  • Ticket #3221 -- patch for better error message for faulty URLconf
  File "c:\django\django\core\urlresolvers.py", line 255, in _get_urlconf_module
    raise ImproperlyConfigured, "Error while importing URLconf %r: %s" % (self.urlconf_name, e)

ImproperlyConfigured: Error while importing URLconf 'reports.urls': tuple index out of range

Context: A Trying to load my home page and it is evidently finding something wrong with my urls.py
Suggestion: Output which tuple it is trying to index, and perhaps even the entire 'patterns'

  • Ticket #6537 -- Unhelpful error message: 'tuple index out of range'
Error: cannot import name FooBar

Context: You get only this error line starting the developer server. But this doesn't help to find the real error.
Suggestion: e.g. one model can't import because you have a import loop. Use the patch from Ticket #11667 to get a full traceback and bugfix your models.

  • Ticket #11667 -- Full traceback if import error before model validation

django.core.servers

AttributeError: WSGIRequestHandler instance has no attribute 'path'

Context: This error gets raised when a server started by runserver is (by accident) accessed via https://. Details here.
Suggestion: runserver does not support https, please use it only via http.

django.db

OperationalError: Unable to close due to unfinalised statements

Context: SQLite file permissions are incorrect (directory or DB file lack write permission)
Suggestion: Check file permissions when running with SQLite backend and warn user if they seem incorrect

ProgrammingError: ERROR:  current transaction is aborted, commands ignored until end of transaction block

This pyscopg2 (PostgreSQL) error usually signifies that some previous database query was incorrect (e.g., you tried to order_by() a field that doesn't exist, or put a string in an integer column, etc.). That previous error aborted the transaction, causing all subsequent database access to fail with this message.

If you get this while at a shell, you can fix your database connection by executing a rollback:

from django.db import connection
connection.cursor().execute('rollback')

If you get this from a view, it probably means the immediately previous query had a problem (but was caught by an over-eager exception handler).

In certain situations with PostgreSQL, a bogus error message about SET TIME ZONE may be returned. See #3179 (which is closed, but has a description of the problem). The real error message can probably be found in the postgres log file.

DoesNotExist: %s matching query does not exist

It would be really helpful for the error message to state what the query was, for example:

        raise self.model.DoesNotExist(("%s matching query does not exist " +
            "(query was: %s, %s)") % (self.model._meta.object_name,
                args, kwargs))

If you create a ForeignKey with blank=True, but you don't specify null=True, and try to save the object without a value for the foreign key, you get this exception:

ValueError: Cannot assign None: "Cat.home" does not allow null values.

You could argue that it's obvious, but it's confusing many people:

I think it would be a really good idea to make it really clear from the error message what you need to do (blank=True requires null=True on foreign key fields).

Unfortunately we can't automatically fix it, because if the field is left blank, the developer might be intending to supply the value automatically before save (https://code.djangoproject.com/ticket/13824).

django.forms

AttributeError: 'NoneType' object has no attribute 'widget'

(in BaseForm.full_clean)

A ModelForm refers to a nonexistent field.

If you create a ModelForm but neglect to indicate the model in the Meta, you get:

TypeError: 'NoneType' object is not callable

In django.forms.models line 240 there could be a check to make sure the options instance has a valid model declaration and if not warn the user more explicitly ("ModelForm <classname> does is missing the model") This is covered by #12285.

#15126 describes a common class of problem -- users with a single-item tuple forgetting the trailing comma. This was reported in the context of ModelForm.fields, but is a general problem that can (and should) be caught and reported.

django.http

AttributeError: Http404 instance has no attribute 'has_header'

Context: Http404 is returned instead of raised
Suggestion: Check type of HttpResponse before attempting to use (perhaps unPythonic?) or possibly give Http404 a clearer name like Http404Exception

django.shortcuts

Invoking .render() with a <coconut> object instead of a HttpRequest as the first argument invokes AttributeError with the message: "'<coconut>' object has no attribute 'META'". Better will be something like, "render() takes a request object for the first argument."

django.template

django.template.__init__.py

Using an invalid template tag results in the generic 'list index out of range' error which doesn't show any information about the offending file or expression. E.g., if a template contains:

...
{% invalid_template_tag %} 
...

An error occurs at line 279 of django.template.__init__.py:

278   try:
279      compiled_result = compile_func(self, token)
280   except KeyError:
281      self.invalid_block_tag(token, command)
282   except TemplateSyntaxError, e:
283      if not self.compile_function_error(token,e):
291          raise

What seems to be happening is that self.invalid_block_tag(...) raises an error which gets caught by TemplateSyntaxError and which eventually leads to the generic 'list index out of range' error being reported in the Django error page.

FIXED

  • Ticket #1732 -- a problem that elicits no error message, but should.
  • Ticket #16770 -- Any error that occurred during template rendering was previously wrapped by TemplateSyntaxError.
Note: See TracWiki for help on using the wiki.
Back to Top