Skip to content

Commit

Permalink
In urlconfs, include() may now be used on an iterable of patterns ins…
Browse files Browse the repository at this point in the history
…tead of just a module string. Refs #6470 -- making the admin use a urlconf is much easier with this work done. Thanks, Alex Gaynor.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@9728 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information
jacobian committed Jan 10, 2009
1 parent 299e1e8 commit c01098e
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 4 deletions.
16 changes: 12 additions & 4 deletions django/core/urlresolvers.py
Expand Up @@ -143,6 +143,8 @@ def __init__(self, regex, urlconf_name, default_kwargs=None):
# urlconf_name is a string representing the module containing urlconfs. # urlconf_name is a string representing the module containing urlconfs.
self.regex = re.compile(regex, re.UNICODE) self.regex = re.compile(regex, re.UNICODE)
self.urlconf_name = urlconf_name self.urlconf_name = urlconf_name
if not isinstance(urlconf_name, basestring):
self._urlconf_module = self.urlconf_name
self.callback = None self.callback = None
self.default_kwargs = default_kwargs or {} self.default_kwargs = default_kwargs or {}
self._reverse_dict = MultiValueDict() self._reverse_dict = MultiValueDict()
Expand All @@ -151,8 +153,8 @@ def __repr__(self):
return '<%s %s %s>' % (self.__class__.__name__, self.urlconf_name, self.regex.pattern) return '<%s %s %s>' % (self.__class__.__name__, self.urlconf_name, self.regex.pattern)


def _get_reverse_dict(self): def _get_reverse_dict(self):
if not self._reverse_dict and hasattr(self.urlconf_module, 'urlpatterns'): if not self._reverse_dict:
for pattern in reversed(self.urlconf_module.urlpatterns): for pattern in reversed(self.url_patterns):
p_pattern = pattern.regex.pattern p_pattern = pattern.regex.pattern
if p_pattern.startswith('^'): if p_pattern.startswith('^'):
p_pattern = p_pattern[1:] p_pattern = p_pattern[1:]
Expand All @@ -176,7 +178,7 @@ def resolve(self, path):
match = self.regex.search(path) match = self.regex.search(path)
if match: if match:
new_path = path[match.end():] new_path = path[match.end():]
for pattern in self.urlconf_module.urlpatterns: for pattern in self.url_patterns:
try: try:
sub_match = pattern.resolve(new_path) sub_match = pattern.resolve(new_path)
except Resolver404, e: except Resolver404, e:
Expand All @@ -200,7 +202,13 @@ def _get_urlconf_module(self):
urlconf_module = property(_get_urlconf_module) urlconf_module = property(_get_urlconf_module)


def _get_url_patterns(self): def _get_url_patterns(self):
return self.urlconf_module.urlpatterns patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
try:
iter(patterns)
except TypeError:
raise ImproperlyConfigured("The included urlconf %s doesn't have any"
"patterns in it" % self.urlconf_name)
return patterns
url_patterns = property(_get_url_patterns) url_patterns = property(_get_url_patterns)


def _resolve_special(self, view_type): def _resolve_special(self, view_type):
Expand Down
1 change: 1 addition & 0 deletions tests/regressiontests/urlpatterns_reverse/tests.py
Expand Up @@ -81,6 +81,7 @@
('kwargs_view', '/arg_view/10/', [], {'arg1':10}), ('kwargs_view', '/arg_view/10/', [], {'arg1':10}),
('regressiontests.urlpatterns_reverse.views.absolute_kwargs_view', '/absolute_arg_view/', [], {}), ('regressiontests.urlpatterns_reverse.views.absolute_kwargs_view', '/absolute_arg_view/', [], {}),
('regressiontests.urlpatterns_reverse.views.absolute_kwargs_view', '/absolute_arg_view/10/', [], {'arg1':10}), ('regressiontests.urlpatterns_reverse.views.absolute_kwargs_view', '/absolute_arg_view/10/', [], {'arg1':10}),
('non_path_include', '/includes/non_path_include/', [], {})


) )


Expand Down
8 changes: 8 additions & 0 deletions tests/regressiontests/urlpatterns_reverse/urls.py
@@ -1,6 +1,10 @@
from django.conf.urls.defaults import * from django.conf.urls.defaults import *
from views import empty_view, absolute_kwargs_view from views import empty_view, absolute_kwargs_view


other_patterns = patterns('',
url(r'non_path_include/$', empty_view, name='non_path_include'),
)

urlpatterns = patterns('', urlpatterns = patterns('',
url(r'^places/(\d+)/$', empty_view, name='places'), url(r'^places/(\d+)/$', empty_view, name='places'),
url(r'^places?/$', empty_view, name="places?"), url(r'^places?/$', empty_view, name="places?"),
Expand Down Expand Up @@ -51,5 +55,9 @@
url(r'arg_view/(?P<arg1>\d+)/$', 'kwargs_view'), url(r'arg_view/(?P<arg1>\d+)/$', 'kwargs_view'),
url(r'absolute_arg_view/(?P<arg1>\d+)/$', absolute_kwargs_view), url(r'absolute_arg_view/(?P<arg1>\d+)/$', absolute_kwargs_view),
url(r'absolute_arg_view/$', absolute_kwargs_view), url(r'absolute_arg_view/$', absolute_kwargs_view),

url('^includes/', include(other_patterns)),


) )


0 comments on commit c01098e

Please sign in to comment.