Opened 17 years ago

Last modified 17 years ago

#4319 closed

urlresolvers.RegexURLPattern._get_callback doesn't handle ValueError — at Version 2

Reported by: django@… Owned by: Adrian Holovaty
Component: Core (Other) Version: dev
Severity: Keywords: url resolver _get_callback
Cc: Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description (last modified by Malcolm Tredinnick)

It seems import raises a ValueError if the module name is empty. This can occur in _get_callback and isn't handled properly:

Using a named URL pattern "blog-post" in a permalink-decorated get_absolute_url method causes the exception detailed below.

Switching the name to "blog.post" instead fools the reverse functions into allowing it because _get_callback receives a non-empty module name.

Traceback (most recent call last):
File "d:\python25\Lib\site-packages\django\template\__init__.py" in render_node
  741. result = node.render(context)
File "d:\python25\Lib\site-packages\django\template\defaulttags.py" in render
  125. nodelist.append(node.render(context))
File "d:\python25\Lib\site-packages\django\template\__init__.py" in render
  791. output = self.filter_expression.resolve(context)
File "d:\python25\Lib\site-packages\django\template\__init__.py" in resolve
  576. obj = resolve_variable(self.var, context)
File "d:\python25\Lib\site-packages\django\template\__init__.py" in resolve_variable
  674. current = current()
File "d:\python25\Lib\site-packages\django\utils\functional.py" in _curried
  3. return _curried_func(*(args+moreargs), **dict(kwargs, **morekwargs))
File "d:\python25\Lib\site-packages\django\db\models\base.py" in get_absolute_url
  453. return settings.ABSOLUTE_URL_OVERRIDES.get('%s.%s' % (opts.app_label, opts.module_name), func)(self)
File "d:\python25\Lib\site-packages\django\db\models\__init__.py" in inner
  27. return reverse(bits[0], None, *bits[1:3])
File "d:\python25\Lib\site-packages\django\core\urlresolvers.py" in reverse
  251. return '/' + resolver.reverse(viewname, *args, **kwargs)
File "d:\python25\Lib\site-packages\django\core\urlresolvers.py" in reverse
  222. return pattern.reverse_helper(lookup_view, *args, **kwargs)
File "d:\python25\Lib\site-packages\django\core\urlresolvers.py" in reverse_helper
  233. sub_match = self.reverse(lookup_view, *args, **kwargs)
File "d:\python25\Lib\site-packages\django\core\urlresolvers.py" in reverse
  225. elif pattern.callback == lookup_view or pattern.name == lookup_view:
File "d:\python25\Lib\site-packages\django\core\urlresolvers.py" in _get_callback
  134. self._callback = getattr(__import__(mod_name, {}, {}, ['']), func_name)

  ValueError at /blog/articles/
  Empty module name

Change History (2)

comment:1 by django@…, 17 years ago

Can't get this to work at all in fact.

Switching to "blog.post" (an existing named urlpattern) causes NoReverseMatch exceptions.
Using the generic view name "django.views.generic.date_based.object_detail" causes ValueErrors because of empty module name in import.

comment:2 by Malcolm Tredinnick, 17 years ago

Description: modified (diff)

Could you give an example of a url pattern and the associated get_absolute_url() method that causes this problem, please?

Note: See TracTickets for help on using tickets.
Back to Top