Skip to content

Commit

Permalink
Fixed #4453 -- Allow dots in URL pattern names (although the string i…
Browse files Browse the repository at this point in the history
…n that case is first tried as an import path and only then falls back to being treated as a pattern).

git-svn-id: http://code.djangoproject.com/svn/django/trunk@5530 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information
malcolmt committed Jun 25, 2007
1 parent 14161db commit a5802b3
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 6 deletions.
21 changes: 17 additions & 4 deletions django/core/urlresolvers.py
Expand Up @@ -27,11 +27,24 @@ class NoReverseMatch(Exception):
# Don't make this raise an error when used in a template.
silent_variable_failure = True

def get_callable(lookup_view):
def get_callable(lookup_view, can_fail=False):
"""
Convert a string version of a function name to the callable object.
If the lookup_view is not an import path, it is assumed to be a URL pattern
label and the original string is returned.
If can_fail is True, lookup_view might be a URL pattern label, so errors
during the import fail and the string is returned.
"""
if not callable(lookup_view):
mod_name, func_name = get_mod_func(lookup_view)
if func_name != '':
lookup_view = getattr(__import__(mod_name, {}, {}, ['']), func_name)
try:
if func_name != '':
lookup_view = getattr(__import__(mod_name, {}, {}, ['']), func_name)
except (ImportError, AttributeError):
if not can_fail:
raise
return lookup_view
get_callable = memoize(get_callable, _callable_cache)

Expand Down Expand Up @@ -248,7 +261,7 @@ def resolve500(self):

def reverse(self, lookup_view, *args, **kwargs):
try:
lookup_view = get_callable(lookup_view)
lookup_view = get_callable(lookup_view, True)
except (ImportError, AttributeError):
raise NoReverseMatch
if lookup_view in self.reverse_dict:
Expand Down
2 changes: 1 addition & 1 deletion tests/regressiontests/templates/tests.py
Expand Up @@ -725,7 +725,7 @@ def test_templates(self):
'url01' : ('{% url regressiontests.templates.views.client client.id %}', {'client': {'id': 1}}, '/url_tag/client/1/'),
'url02' : ('{% url regressiontests.templates.views.client_action client.id, action="update" %}', {'client': {'id': 1}}, '/url_tag/client/1/update/'),
'url03' : ('{% url regressiontests.templates.views.index %}', {}, '/url_tag/'),
'url04' : ('{% url named-client client.id %}', {'client': {'id': 1}}, '/url_tag/named-client/1/'),
'url04' : ('{% url named.client client.id %}', {'client': {'id': 1}}, '/url_tag/named-client/1/'),

# Failures
'url-fail01' : ('{% url %}', {}, template.TemplateSyntaxError),
Expand Down
2 changes: 1 addition & 1 deletion tests/regressiontests/templates/urls.py
Expand Up @@ -7,5 +7,5 @@
(r'^$', views.index),
(r'^client/(\d+)/$', views.client),
(r'^client/(\d+)/(?P<action>[^/]+)/$', views.client_action),
url(r'^named-client/(\d+)/$', views.client, name="named-client"),
url(r'^named-client/(\d+)/$', views.client, name="named.client"),
)

0 comments on commit a5802b3

Please sign in to comment.