Skip to content

Commit c01098e

Browse files
committed
In urlconfs, include() may now be used on an iterable of patterns instead 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
1 parent 299e1e8 commit c01098e

File tree

3 files changed

+21
-4
lines changed

3 files changed

+21
-4
lines changed

django/core/urlresolvers.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,8 @@ def __init__(self, regex, urlconf_name, default_kwargs=None):
143143
# urlconf_name is a string representing the module containing urlconfs.
144144
self.regex = re.compile(regex, re.UNICODE)
145145
self.urlconf_name = urlconf_name
146+
if not isinstance(urlconf_name, basestring):
147+
self._urlconf_module = self.urlconf_name
146148
self.callback = None
147149
self.default_kwargs = default_kwargs or {}
148150
self._reverse_dict = MultiValueDict()
@@ -151,8 +153,8 @@ def __repr__(self):
151153
return '<%s %s %s>' % (self.__class__.__name__, self.urlconf_name, self.regex.pattern)
152154

153155
def _get_reverse_dict(self):
154-
if not self._reverse_dict and hasattr(self.urlconf_module, 'urlpatterns'):
155-
for pattern in reversed(self.urlconf_module.urlpatterns):
156+
if not self._reverse_dict:
157+
for pattern in reversed(self.url_patterns):
156158
p_pattern = pattern.regex.pattern
157159
if p_pattern.startswith('^'):
158160
p_pattern = p_pattern[1:]
@@ -176,7 +178,7 @@ def resolve(self, path):
176178
match = self.regex.search(path)
177179
if match:
178180
new_path = path[match.end():]
179-
for pattern in self.urlconf_module.urlpatterns:
181+
for pattern in self.url_patterns:
180182
try:
181183
sub_match = pattern.resolve(new_path)
182184
except Resolver404, e:
@@ -200,7 +202,13 @@ def _get_urlconf_module(self):
200202
urlconf_module = property(_get_urlconf_module)
201203

202204
def _get_url_patterns(self):
203-
return self.urlconf_module.urlpatterns
205+
patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
206+
try:
207+
iter(patterns)
208+
except TypeError:
209+
raise ImproperlyConfigured("The included urlconf %s doesn't have any"
210+
"patterns in it" % self.urlconf_name)
211+
return patterns
204212
url_patterns = property(_get_url_patterns)
205213

206214
def _resolve_special(self, view_type):

tests/regressiontests/urlpatterns_reverse/tests.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@
8181
('kwargs_view', '/arg_view/10/', [], {'arg1':10}),
8282
('regressiontests.urlpatterns_reverse.views.absolute_kwargs_view', '/absolute_arg_view/', [], {}),
8383
('regressiontests.urlpatterns_reverse.views.absolute_kwargs_view', '/absolute_arg_view/10/', [], {'arg1':10}),
84+
('non_path_include', '/includes/non_path_include/', [], {})
8485

8586
)
8687

tests/regressiontests/urlpatterns_reverse/urls.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
from django.conf.urls.defaults import *
22
from views import empty_view, absolute_kwargs_view
33

4+
other_patterns = patterns('',
5+
url(r'non_path_include/$', empty_view, name='non_path_include'),
6+
)
7+
48
urlpatterns = patterns('',
59
url(r'^places/(\d+)/$', empty_view, name='places'),
610
url(r'^places?/$', empty_view, name="places?"),
@@ -51,5 +55,9 @@
5155
url(r'arg_view/(?P<arg1>\d+)/$', 'kwargs_view'),
5256
url(r'absolute_arg_view/(?P<arg1>\d+)/$', absolute_kwargs_view),
5357
url(r'absolute_arg_view/$', absolute_kwargs_view),
58+
59+
url('^includes/', include(other_patterns)),
5460

5561
)
62+
63+

0 commit comments

Comments
 (0)