Browse Source

Fixed #14675 -- Completed removal of `from django.conf.urls.default import *` usage.

This applies to both our own [test] code and documentation examples. Also:
 * Moved the functions and handlers from `django.conf.urls.defaults` up to
   `django.conf.urls` deprecating the former module.
 * Added documentation for `handler403`.
 * Tweaked the URLs topic document a bit.

Thanks to pupeno and cdestigter for their great work contributing patches.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@16818 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Ramiro Morales 13 years ago
parent
commit
26b8122087
88 changed files with 243 additions and 198 deletions
  1. 1 1
      django/conf/project_template/urls.py
  2. 61 0
      django/conf/urls/__init__.py
  3. 5 60
      django/conf/urls/defaults.py
  4. 1 1
      django/conf/urls/i18n.py
  5. 1 1
      django/conf/urls/shortcut.py
  6. 1 1
      django/conf/urls/static.py
  7. 1 1
      django/contrib/admin/options.py
  8. 2 2
      django/contrib/admin/sites.py
  9. 1 1
      django/contrib/admindocs/urls.py
  10. 1 1
      django/contrib/auth/admin.py
  11. 1 1
      django/contrib/auth/tests/urls.py
  12. 1 1
      django/contrib/auth/urls.py
  13. 1 1
      django/contrib/comments/urls.py
  14. 1 1
      django/contrib/databrowse/urls.py
  15. 1 1
      django/contrib/flatpages/tests/urls.py
  16. 1 1
      django/contrib/flatpages/urls.py
  17. 1 1
      django/contrib/formtools/tests/urls.py
  18. 1 1
      django/contrib/formtools/tests/wizard/namedwizardtests/urls.py
  19. 1 1
      django/contrib/formtools/tests/wizard/wizardtests/urls.py
  20. 1 1
      django/contrib/gis/tests/geoadmin/urls.py
  21. 1 1
      django/contrib/gis/tests/geoapp/urls.py
  22. 1 1
      django/contrib/messages/tests/urls.py
  23. 1 1
      django/contrib/sitemaps/tests/urls.py
  24. 6 0
      docs/internals/deprecation.txt
  25. 1 1
      docs/intro/overview.txt
  26. 1 1
      docs/intro/tutorial02.txt
  27. 15 15
      docs/intro/tutorial03.txt
  28. 5 5
      docs/intro/tutorial04.txt
  29. 3 3
      docs/ref/contrib/admin/index.txt
  30. 2 2
      docs/ref/contrib/comments/example.txt
  31. 3 3
      docs/ref/contrib/formtools/form-wizard.txt
  32. 1 1
      docs/ref/contrib/gis/tutorial.txt
  33. 1 1
      docs/ref/contrib/sitemaps.txt
  34. 2 2
      docs/ref/contrib/syndication.txt
  35. 1 1
      docs/ref/models/instances.txt
  36. 14 3
      docs/releases/1.4.txt
  37. 3 3
      docs/topics/class-based-views.txt
  38. 3 3
      docs/topics/generic-views.txt
  39. 42 19
      docs/topics/http/urls.txt
  40. 3 3
      docs/topics/i18n/internationalization.txt
  41. 1 1
      tests/modeltests/test_client/urls.py
  42. 1 1
      tests/regressiontests/admin_views/customadmin.py
  43. 1 1
      tests/regressiontests/admin_views/urls.py
  44. 1 2
      tests/regressiontests/admin_widgets/urls.py
  45. 1 1
      tests/regressiontests/comment_tests/urls.py
  46. 1 1
      tests/regressiontests/comment_tests/urls_admin.py
  47. 1 1
      tests/regressiontests/conditional_processing/urls.py
  48. 1 1
      tests/regressiontests/context_processors/urls.py
  49. 1 1
      tests/regressiontests/file_uploads/urls.py
  50. 1 1
      tests/regressiontests/generic_inline_admin/urls.py
  51. 1 1
      tests/regressiontests/generic_views/urls.py
  52. 1 1
      tests/regressiontests/i18n/patterns/urls/default.py
  53. 1 1
      tests/regressiontests/i18n/patterns/urls/disabled.py
  54. 1 1
      tests/regressiontests/i18n/patterns/urls/namespace.py
  55. 1 1
      tests/regressiontests/i18n/patterns/urls/wrong.py
  56. 1 1
      tests/regressiontests/i18n/patterns/urls/wrong_namespace.py
  57. 1 1
      tests/regressiontests/middleware/cond_get_urls.py
  58. 1 1
      tests/regressiontests/middleware/extra_urls.py
  59. 1 1
      tests/regressiontests/middleware/urls.py
  60. 1 1
      tests/regressiontests/middleware_exceptions/urls.py
  61. 1 1
      tests/regressiontests/model_permalink/urls.py
  62. 1 1
      tests/regressiontests/special_headers/urls.py
  63. 1 1
      tests/regressiontests/staticfiles_tests/urls/default.py
  64. 1 1
      tests/regressiontests/syndication/urls.py
  65. 1 1
      tests/regressiontests/templates/alternate_urls.py
  66. 1 1
      tests/regressiontests/templates/urls.py
  67. 1 1
      tests/regressiontests/test_client_regress/urls.py
  68. 1 1
      tests/regressiontests/test_utils/urls.py
  69. 1 1
      tests/regressiontests/urlpatterns_reverse/erroneous_urls.py
  70. 1 1
      tests/regressiontests/urlpatterns_reverse/extra_urls.py
  71. 1 1
      tests/regressiontests/urlpatterns_reverse/included_named_urls.py
  72. 1 1
      tests/regressiontests/urlpatterns_reverse/included_named_urls2.py
  73. 1 1
      tests/regressiontests/urlpatterns_reverse/included_namespace_urls.py
  74. 1 1
      tests/regressiontests/urlpatterns_reverse/included_urls.py
  75. 1 1
      tests/regressiontests/urlpatterns_reverse/included_urls2.py
  76. 1 1
      tests/regressiontests/urlpatterns_reverse/named_urls.py
  77. 1 1
      tests/regressiontests/urlpatterns_reverse/namespace_urls.py
  78. 1 1
      tests/regressiontests/urlpatterns_reverse/no_urls.py
  79. 1 1
      tests/regressiontests/urlpatterns_reverse/reverse_lazy_urls.py
  80. 1 1
      tests/regressiontests/urlpatterns_reverse/urlconf_inner.py
  81. 1 1
      tests/regressiontests/urlpatterns_reverse/urlconf_outer.py
  82. 1 1
      tests/regressiontests/urlpatterns_reverse/urls.py
  83. 1 1
      tests/regressiontests/urlpatterns_reverse/urls_error_handlers.py
  84. 1 1
      tests/regressiontests/urlpatterns_reverse/urls_error_handlers_callables.py
  85. 2 2
      tests/regressiontests/urlpatterns_reverse/urls_without_full_import.py
  86. 1 1
      tests/regressiontests/views/generic_urls.py
  87. 1 1
      tests/regressiontests/views/urls.py
  88. 1 1
      tests/urls.py

+ 1 - 1
django/conf/project_template/urls.py

@@ -1,4 +1,4 @@
-from django.conf.urls.defaults import patterns, include, url
+from django.conf.urls import patterns, include, url
 
 
 # Uncomment the next two lines to enable the admin:
 # Uncomment the next two lines to enable the admin:
 # from django.contrib import admin
 # from django.contrib import admin

+ 61 - 0
django/conf/urls/__init__.py

@@ -0,0 +1,61 @@
+from django.core.urlresolvers import (RegexURLPattern,
+    RegexURLResolver, LocaleRegexURLResolver)
+from django.core.exceptions import ImproperlyConfigured
+from django.utils.importlib import import_module
+
+
+__all__ = ['handler403', 'handler404', 'handler500', 'include', 'patterns', 'url']
+
+handler403 = 'django.views.defaults.permission_denied'
+handler404 = 'django.views.defaults.page_not_found'
+handler500 = 'django.views.defaults.server_error'
+
+def include(arg, namespace=None, app_name=None):
+    if isinstance(arg, tuple):
+        # callable returning a namespace hint
+        if namespace:
+            raise ImproperlyConfigured('Cannot override the namespace for a dynamic module that provides a namespace')
+        urlconf_module, app_name, namespace = arg
+    else:
+        # No namespace hint - use manually provided namespace
+        urlconf_module = arg
+
+    if isinstance(urlconf_module, basestring):
+        urlconf_module = import_module(urlconf_module)
+    patterns = getattr(urlconf_module, 'urlpatterns', urlconf_module)
+
+    # Make sure we can iterate through the patterns (without this, some
+    # testcases will break).
+    if isinstance(patterns, (list, tuple)):
+        for url_pattern in patterns:
+            # Test if the LocaleRegexURLResolver is used within the include;
+            # this should throw an error since this is not allowed!
+            if isinstance(url_pattern, LocaleRegexURLResolver):
+                raise ImproperlyConfigured(
+                    'Using i18n_patterns in an included URLconf is not allowed.')
+
+    return (urlconf_module, app_name, namespace)
+
+def patterns(prefix, *args):
+    pattern_list = []
+    for t in args:
+        if isinstance(t, (list, tuple)):
+            t = url(prefix=prefix, *t)
+        elif isinstance(t, RegexURLPattern):
+            t.add_prefix(prefix)
+        pattern_list.append(t)
+    return pattern_list
+
+def url(regex, view, kwargs=None, name=None, prefix=''):
+    if isinstance(view, (list,tuple)):
+        # For include(...) processing.
+        urlconf_module, app_name, namespace = view
+        return RegexURLResolver(regex, urlconf_module, kwargs, app_name=app_name, namespace=namespace)
+    else:
+        if isinstance(view, basestring):
+            if not view:
+                raise ImproperlyConfigured('Empty URL pattern view name not permitted (for pattern %r)' % regex)
+            if prefix:
+                view = prefix + '.' + view
+        return RegexURLPattern(regex, view, kwargs, name)
+

+ 5 - 60
django/conf/urls/defaults.py

@@ -1,61 +1,6 @@
-from django.core.urlresolvers import (RegexURLPattern,
+import warnings
-    RegexURLResolver, LocaleRegexURLResolver)
+warnings.warn("django.conf.urls.defaults is deprecated; use django.conf.urls instead",
-from django.core.exceptions import ImproperlyConfigured
+              PendingDeprecationWarning)
-from django.utils.importlib import import_module
-
-
-__all__ = ['handler404', 'handler500', 'include', 'patterns', 'url']
-
-handler403 = 'django.views.defaults.permission_denied'
-handler404 = 'django.views.defaults.page_not_found'
-handler500 = 'django.views.defaults.server_error'
-
-def include(arg, namespace=None, app_name=None):
-    if isinstance(arg, tuple):
-        # callable returning a namespace hint
-        if namespace:
-            raise ImproperlyConfigured('Cannot override the namespace for a dynamic module that provides a namespace')
-        urlconf_module, app_name, namespace = arg
-    else:
-        # No namespace hint - use manually provided namespace
-        urlconf_module = arg
-
-    if isinstance(urlconf_module, basestring):
-        urlconf_module = import_module(urlconf_module)
-    patterns = getattr(urlconf_module, 'urlpatterns', urlconf_module)
-
-    # Make sure we can iterate through the patterns (without this, some
-    # testcases will break).
-    if isinstance(patterns, (list, tuple)):
-        for url_pattern in patterns:
-            # Test if the LocaleRegexURLResolver is used within the include;
-            # this should throw an error since this is not allowed!
-            if isinstance(url_pattern, LocaleRegexURLResolver):
-                raise ImproperlyConfigured(
-                    'Using i18n_patterns in an included URLconf is not allowed.')
-
-    return (urlconf_module, app_name, namespace)
-
-def patterns(prefix, *args):
-    pattern_list = []
-    for t in args:
-        if isinstance(t, (list, tuple)):
-            t = url(prefix=prefix, *t)
-        elif isinstance(t, RegexURLPattern):
-            t.add_prefix(prefix)
-        pattern_list.append(t)
-    return pattern_list
-
-def url(regex, view, kwargs=None, name=None, prefix=''):
-    if isinstance(view, (list,tuple)):
-        # For include(...) processing.
-        urlconf_module, app_name, namespace = view
-        return RegexURLResolver(regex, urlconf_module, kwargs, app_name=app_name, namespace=namespace)
-    else:
-        if isinstance(view, basestring):
-            if not view:
-                raise ImproperlyConfigured('Empty URL pattern view name not permitted (for pattern %r)' % regex)
-            if prefix:
-                view = prefix + '.' + view
-        return RegexURLPattern(regex, view, kwargs, name)
 
 
+from django.conf.urls import (handler403, handler404, handler500,
+        include, patterns, url)

+ 1 - 1
django/conf/urls/i18n.py

@@ -1,5 +1,5 @@
 from django.conf import settings
 from django.conf import settings
-from django.conf.urls.defaults import patterns
+from django.conf.urls import patterns
 from django.core.urlresolvers import LocaleRegexURLResolver
 from django.core.urlresolvers import LocaleRegexURLResolver
 
 
 def i18n_patterns(prefix, *args):
 def i18n_patterns(prefix, *args):

+ 1 - 1
django/conf/urls/shortcut.py

@@ -1,4 +1,4 @@
-from django.conf.urls.defaults import *
+from django.conf.urls import patterns
 
 
 urlpatterns = patterns('django.views',
 urlpatterns = patterns('django.views',
     (r'^(?P<content_type_id>\d+)/(?P<object_id>.*)/$', 'defaults.shortcut'),
     (r'^(?P<content_type_id>\d+)/(?P<object_id>.*)/$', 'defaults.shortcut'),

+ 1 - 1
django/conf/urls/static.py

@@ -1,6 +1,6 @@
 import re
 import re
 from django.conf import settings
 from django.conf import settings
-from django.conf.urls.defaults import patterns, url
+from django.conf.urls import patterns, url
 from django.core.exceptions import ImproperlyConfigured
 from django.core.exceptions import ImproperlyConfigured
 
 
 def static(prefix, view='django.views.static.serve', **kwargs):
 def static(prefix, view='django.views.static.serve', **kwargs):

+ 1 - 1
django/contrib/admin/options.py

@@ -320,7 +320,7 @@ class ModelAdmin(BaseModelAdmin):
         super(ModelAdmin, self).__init__()
         super(ModelAdmin, self).__init__()
 
 
     def get_urls(self):
     def get_urls(self):
-        from django.conf.urls.defaults import patterns, url
+        from django.conf.urls import patterns, url
 
 
         def wrap(view):
         def wrap(view):
             def wrapper(*args, **kwargs):
             def wrapper(*args, **kwargs):

+ 2 - 2
django/contrib/admin/sites.py

@@ -174,7 +174,7 @@ class AdminSite(object):
             class MyAdminSite(AdminSite):
             class MyAdminSite(AdminSite):
 
 
                 def get_urls(self):
                 def get_urls(self):
-                    from django.conf.urls.defaults import patterns, url
+                    from django.conf.urls import patterns, url
 
 
                     urls = super(MyAdminSite, self).get_urls()
                     urls = super(MyAdminSite, self).get_urls()
                     urls += patterns('',
                     urls += patterns('',
@@ -199,7 +199,7 @@ class AdminSite(object):
         return update_wrapper(inner, view)
         return update_wrapper(inner, view)
 
 
     def get_urls(self):
     def get_urls(self):
-        from django.conf.urls.defaults import patterns, url, include
+        from django.conf.urls import patterns, url, include
 
 
         if settings.DEBUG:
         if settings.DEBUG:
             self.check_dependencies()
             self.check_dependencies()

+ 1 - 1
django/contrib/admindocs/urls.py

@@ -1,4 +1,4 @@
-from django.conf.urls.defaults import *
+from django.conf.urls import patterns, url
 from django.contrib.admindocs import views
 from django.contrib.admindocs import views
 
 
 urlpatterns = patterns('',
 urlpatterns = patterns('',

+ 1 - 1
django/contrib/auth/admin.py

@@ -74,7 +74,7 @@ class UserAdmin(admin.ModelAdmin):
         return super(UserAdmin, self).get_form(request, obj, **defaults)
         return super(UserAdmin, self).get_form(request, obj, **defaults)
 
 
     def get_urls(self):
     def get_urls(self):
-        from django.conf.urls.defaults import patterns
+        from django.conf.urls import patterns
         return patterns('',
         return patterns('',
             (r'^(\d+)/password/$', self.admin_site.admin_view(self.user_change_password))
             (r'^(\d+)/password/$', self.admin_site.admin_view(self.user_change_password))
         ) + super(UserAdmin, self).get_urls()
         ) + super(UserAdmin, self).get_urls()

+ 1 - 1
django/contrib/auth/tests/urls.py

@@ -1,4 +1,4 @@
-from django.conf.urls.defaults import patterns, url
+from django.conf.urls import patterns, url
 from django.contrib.auth import context_processors
 from django.contrib.auth import context_processors
 from django.contrib.auth.urls import urlpatterns
 from django.contrib.auth.urls import urlpatterns
 from django.contrib.auth.views import password_reset
 from django.contrib.auth.views import password_reset

+ 1 - 1
django/contrib/auth/urls.py

@@ -2,7 +2,7 @@
 # provided as a convenience to those who want to deploy these URLs elsewhere.
 # provided as a convenience to those who want to deploy these URLs elsewhere.
 # This file is also used to provide a reliable view deployment for test purposes.
 # This file is also used to provide a reliable view deployment for test purposes.
 
 
-from django.conf.urls.defaults import *
+from django.conf.urls import patterns
 
 
 urlpatterns = patterns('',
 urlpatterns = patterns('',
     (r'^login/$', 'django.contrib.auth.views.login'),
     (r'^login/$', 'django.contrib.auth.views.login'),

+ 1 - 1
django/contrib/comments/urls.py

@@ -1,4 +1,4 @@
-from django.conf.urls.defaults import *
+from django.conf.urls import patterns, url
 
 
 urlpatterns = patterns('django.contrib.comments.views',
 urlpatterns = patterns('django.contrib.comments.views',
     url(r'^post/$',          'comments.post_comment',       name='comments-post-comment'),
     url(r'^post/$',          'comments.post_comment',       name='comments-post-comment'),

+ 1 - 1
django/contrib/databrowse/urls.py

@@ -1,4 +1,4 @@
-from django.conf.urls.defaults import *
+from django.conf.urls import patterns
 from django.contrib.databrowse import views
 from django.contrib.databrowse import views
 
 
 # Note: The views in this URLconf all require a 'models' argument,
 # Note: The views in this URLconf all require a 'models' argument,

+ 1 - 1
django/contrib/flatpages/tests/urls.py

@@ -1,4 +1,4 @@
-from django.conf.urls.defaults import *
+from django.conf.urls import patterns, include
 
 
 # special urls for flatpage test cases
 # special urls for flatpage test cases
 urlpatterns = patterns('',
 urlpatterns = patterns('',

+ 1 - 1
django/contrib/flatpages/urls.py

@@ -1,4 +1,4 @@
-from django.conf.urls.defaults import *
+from django.conf.urls import patterns
 
 
 urlpatterns = patterns('django.contrib.flatpages.views',
 urlpatterns = patterns('django.contrib.flatpages.views',
     (r'^(?P<url>.*)$', 'flatpage'),
     (r'^(?P<url>.*)$', 'flatpage'),

+ 1 - 1
django/contrib/formtools/tests/urls.py

@@ -2,7 +2,7 @@
 This is a URLconf to be loaded by tests.py. Add any URLs needed for tests only.
 This is a URLconf to be loaded by tests.py. Add any URLs needed for tests only.
 """
 """
 
 
-from django.conf.urls.defaults import *
+from django.conf.urls import patterns, url
 from django.contrib.formtools.tests import TestFormPreview, TestWizardClass
 from django.contrib.formtools.tests import TestFormPreview, TestWizardClass
 
 
 from forms import (ContactWizard, Page1, Page2, Page3, TestForm,
 from forms import (ContactWizard, Page1, Page2, Page3, TestForm,

+ 1 - 1
django/contrib/formtools/tests/wizard/namedwizardtests/urls.py

@@ -1,4 +1,4 @@
-from django.conf.urls.defaults import patterns, url
+from django.conf.urls import patterns, url
 from django.contrib.formtools.tests.wizard.namedwizardtests.forms import (
 from django.contrib.formtools.tests.wizard.namedwizardtests.forms import (
     SessionContactWizard, CookieContactWizard, Page1, Page2, Page3, Page4)
     SessionContactWizard, CookieContactWizard, Page1, Page2, Page3, Page4)
 
 

+ 1 - 1
django/contrib/formtools/tests/wizard/wizardtests/urls.py

@@ -1,4 +1,4 @@
-from django.conf.urls.defaults import *
+from django.conf.urls import patterns, url
 from django.contrib.formtools.tests.wizard.wizardtests.forms import (
 from django.contrib.formtools.tests.wizard.wizardtests.forms import (
     SessionContactWizard, CookieContactWizard, Page1, Page2, Page3, Page4)
     SessionContactWizard, CookieContactWizard, Page1, Page2, Page3, Page4)
 
 

+ 1 - 1
django/contrib/gis/tests/geoadmin/urls.py

@@ -1,4 +1,4 @@
-from django.conf.urls.defaults import *
+from django.conf.urls import patterns, include
 from django.contrib import admin
 from django.contrib import admin
 
 
 urlpatterns = patterns('',
 urlpatterns = patterns('',

+ 1 - 1
django/contrib/gis/tests/geoapp/urls.py

@@ -1,4 +1,4 @@
-from django.conf.urls.defaults import *
+from django.conf.urls import patterns
 from feeds import feed_dict
 from feeds import feed_dict
 
 
 urlpatterns = patterns('',
 urlpatterns = patterns('',

+ 1 - 1
django/contrib/messages/tests/urls.py

@@ -1,4 +1,4 @@
-from django.conf.urls.defaults import *
+from django.conf.urls import patterns
 from django.contrib import messages
 from django.contrib import messages
 from django.core.urlresolvers import reverse
 from django.core.urlresolvers import reverse
 from django.http import HttpResponseRedirect, HttpResponse
 from django.http import HttpResponseRedirect, HttpResponse

+ 1 - 1
django/contrib/sitemaps/tests/urls.py

@@ -1,5 +1,5 @@
 from datetime import datetime
 from datetime import datetime
-from django.conf.urls.defaults import *
+from django.conf.urls import patterns
 from django.contrib.sitemaps import Sitemap, GenericSitemap, FlatPageSitemap
 from django.contrib.sitemaps import Sitemap, GenericSitemap, FlatPageSitemap
 from django.contrib.auth.models import User
 from django.contrib.auth.models import User
 
 

+ 6 - 0
docs/internals/deprecation.txt

@@ -243,6 +243,12 @@ their deprecation, as per the :ref:`deprecation policy
       :mod:`django.contrib.gis.geoip` in 1.4 -- the shortcut in
       :mod:`django.contrib.gis.geoip` in 1.4 -- the shortcut in
       :mod:`django.contrib.gis.utils` will be removed.
       :mod:`django.contrib.gis.utils` will be removed.
 
 
+    * In 1.4, functions :func:`~django.conf.urls.include`, :func:`~django.conf.urls.patterns`
+      and :func:`~django.conf.urls.url` plus :data:`~django.conf.urls.handler404`,
+      :data:`~django.conf.urls.handler500` were moved to :mod:`django.conf.urls`
+      from their previous location ``django.conf.urls.defaults``. This module
+      was deprecated at the same time and will be removed in this Django release.
+
 2.0
 2.0
 ---
 ---
 
 

+ 1 - 1
docs/intro/overview.txt

@@ -176,7 +176,7 @@ decouple URLs from Python code.
 Here's what a URLconf might look like for the ``Reporter``/``Article``
 Here's what a URLconf might look like for the ``Reporter``/``Article``
 example above::
 example above::
 
 
-    from django.conf.urls.defaults import *
+    from django.conf.urls import patterns, url, include
 
 
     urlpatterns = patterns('',
     urlpatterns = patterns('',
         (r'^articles/(\d{4})/$', 'news.views.year_archive'),
         (r'^articles/(\d{4})/$', 'news.views.year_archive'),

+ 1 - 1
docs/intro/tutorial02.txt

@@ -40,7 +40,7 @@ activate the admin site for your installation, do these three things:
 
 
       .. parsed-literal::
       .. parsed-literal::
 
 
-          from django.conf.urls.defaults import patterns, include, url
+          from django.conf.urls import patterns, include, url
 
 
           # Uncomment the next two lines to enable the admin:
           # Uncomment the next two lines to enable the admin:
           **from django.contrib import admin**
           **from django.contrib import admin**

+ 15 - 15
docs/intro/tutorial03.txt

@@ -78,7 +78,7 @@ point at that file::
 
 
 Time for an example. Edit ``mysite/urls.py`` so it looks like this::
 Time for an example. Edit ``mysite/urls.py`` so it looks like this::
 
 
-    from django.conf.urls.defaults import patterns, include, url
+    from django.conf.urls import patterns, include, url
 
 
     from django.contrib import admin
     from django.contrib import admin
     admin.autodiscover()
     admin.autodiscover()
@@ -367,7 +367,7 @@ special: It's just a normal view.
 You normally won't have to bother with writing 404 views. By default, URLconfs
 You normally won't have to bother with writing 404 views. By default, URLconfs
 have the following line up top::
 have the following line up top::
 
 
-    from django.conf.urls.defaults import patterns, include, url
+    from django.conf.urls import patterns, include, url
 
 
 That takes care of setting ``handler404`` in the current module. As you can see
 That takes care of setting ``handler404`` in the current module. As you can see
 in ``django/conf/urls/defaults.py``, ``handler404`` is set to
 in ``django/conf/urls/defaults.py``, ``handler404`` is set to
@@ -443,7 +443,7 @@ Namely, ``polls.views`` is in every callback.
 
 
 Because this is a common case, the URLconf framework provides a shortcut for
 Because this is a common case, the URLconf framework provides a shortcut for
 common prefixes. You can factor out the common prefixes and add them as the
 common prefixes. You can factor out the common prefixes and add them as the
-first argument to :func:`~django.conf.urls.defaults.patterns`, like so::
+first argument to :func:`~django.conf.urls.patterns`, like so::
 
 
     urlpatterns = patterns('polls.views',
     urlpatterns = patterns('polls.views',
         (r'^polls/$', 'index'),
         (r'^polls/$', 'index'),
@@ -457,21 +457,21 @@ tidier.
 
 
 Since you generally don't want the prefix for one app to be applied to every
 Since you generally don't want the prefix for one app to be applied to every
 callback in your URLconf, you can concatenate multiple
 callback in your URLconf, you can concatenate multiple
-:func:`~django.conf.urls.defaults.patterns`. Your full ``mysite/urls.py`` might
+:func:`~django.conf.urls.patterns`. Your full ``mysite/urls.py`` might
 now look like this::
 now look like this::
 
 
-    from django.conf.urls.defaults import patterns, include, url
+    from django.conf.urls import patterns, include, url
 
 
     from django.contrib import admin
     from django.contrib import admin
     admin.autodiscover()
     admin.autodiscover()
-    
+
     urlpatterns = patterns('polls.views',
     urlpatterns = patterns('polls.views',
         (r'^polls/$', 'index'),
         (r'^polls/$', 'index'),
         (r'^polls/(?P<poll_id>\d+)/$', 'detail'),
         (r'^polls/(?P<poll_id>\d+)/$', 'detail'),
         (r'^polls/(?P<poll_id>\d+)/results/$', 'results'),
         (r'^polls/(?P<poll_id>\d+)/results/$', 'results'),
         (r'^polls/(?P<poll_id>\d+)/vote/$', 'vote'),
         (r'^polls/(?P<poll_id>\d+)/vote/$', 'vote'),
     )
     )
-    
+
     urlpatterns += patterns('',
     urlpatterns += patterns('',
         url(r'^admin/', include(admin.site.urls)),
         url(r'^admin/', include(admin.site.urls)),
     )
     )
@@ -494,23 +494,23 @@ URLs within the app directory.
 
 
 Copy the file ``mysite/urls.py`` to ``polls/urls.py``. Then, change
 Copy the file ``mysite/urls.py`` to ``polls/urls.py``. Then, change
 ``mysite/urls.py`` to remove the poll-specific URLs and insert an
 ``mysite/urls.py`` to remove the poll-specific URLs and insert an
-:func:`~django.conf.urls.defaults.include`, leaving you with::
+:func:`~django.conf.urls.include`, leaving you with::
 
 
     # This also imports the include function
     # This also imports the include function
-    from django.conf.urls.defaults import patterns, include, url
+    from django.conf.urls import patterns, include, url
-    
+
     from django.contrib import admin
     from django.contrib import admin
     admin.autodiscover()
     admin.autodiscover()
-    
+
     urlpatterns = patterns('',
     urlpatterns = patterns('',
         (r'^polls/', include('polls.urls')),
         (r'^polls/', include('polls.urls')),
         url(r'^admin/', include(admin.site.urls)),
         url(r'^admin/', include(admin.site.urls)),
     )
     )
 
 
-:func:`~django.conf.urls.defaults.include` simply references another URLconf.
+:func:`~django.conf.urls.include` simply references another URLconf.
 Note that the regular expression doesn't have a ``$`` (end-of-string match
 Note that the regular expression doesn't have a ``$`` (end-of-string match
 character) but has the trailing slash. Whenever Django encounters
 character) but has the trailing slash. Whenever Django encounters
-:func:`~django.conf.urls.defaults.include`, it chops off whatever part of the
+:func:`~django.conf.urls.include`, it chops off whatever part of the
 URL matched up to that point and sends the remaining string to the included
 URL matched up to that point and sends the remaining string to the included
 URLconf for further processing.
 URLconf for further processing.
 
 
@@ -527,7 +527,7 @@ URLconf by removing the leading "polls/" from each line, and removing the
 lines registering the admin site. Your ``polls/urls.py`` file should now look like
 lines registering the admin site. Your ``polls/urls.py`` file should now look like
 this::
 this::
 
 
-    from django.conf.urls.defaults import patterns, include, url
+    from django.conf.urls import patterns, include, url
 
 
     urlpatterns = patterns('polls.views',
     urlpatterns = patterns('polls.views',
         (r'^$', 'index'),
         (r'^$', 'index'),
@@ -536,7 +536,7 @@ this::
         (r'^(?P<poll_id>\d+)/vote/$', 'vote'),
         (r'^(?P<poll_id>\d+)/vote/$', 'vote'),
     )
     )
 
 
-The idea behind :func:`~django.conf.urls.defaults.include` and URLconf
+The idea behind :func:`~django.conf.urls.include` and URLconf
 decoupling is to make it easy to plug-and-play URLs. Now that polls are in their
 decoupling is to make it easy to plug-and-play URLs. Now that polls are in their
 own URLconf, they can be placed under "/polls/", or under "/fun_polls/", or
 own URLconf, they can be placed under "/polls/", or under "/fun_polls/", or
 under "/content/polls/", or any other path root, and the app will still work.
 under "/content/polls/", or any other path root, and the app will still work.

+ 5 - 5
docs/intro/tutorial04.txt

@@ -218,7 +218,7 @@ Read on for details.
 First, open the ``polls/urls.py`` URLconf. It looks like this, according to the
 First, open the ``polls/urls.py`` URLconf. It looks like this, according to the
 tutorial so far::
 tutorial so far::
 
 
-    from django.conf.urls.defaults import patterns, include, url
+    from django.conf.urls import patterns, include, url
 
 
     urlpatterns = patterns('polls.views',
     urlpatterns = patterns('polls.views',
         (r'^$', 'index'),
         (r'^$', 'index'),
@@ -229,7 +229,7 @@ tutorial so far::
 
 
 Change it like so::
 Change it like so::
 
 
-    from django.conf.urls.defaults import patterns, include, url
+    from django.conf.urls import patterns, include, url
     from django.views.generic import DetailView, ListView
     from django.views.generic import DetailView, ListView
     from polls.models import Poll
     from polls.models import Poll
 
 
@@ -269,9 +269,9 @@ two views abstract the concepts of "display a list of objects" and
       that we have a way to refer to its URL later on (see the
       that we have a way to refer to its URL later on (see the
       documentation about :ref:`naming URL patterns
       documentation about :ref:`naming URL patterns
       <naming-url-patterns>` for information). We're also using the
       <naming-url-patterns>` for information). We're also using the
-      :func:`~django.conf.urls.default.url` function from
+      :func:`~django.conf.urls.url` function from
-      :mod:`django.conf.urls.defaults` here. It's a good habit to use
+      :mod:`django.conf.urls` here. It's a good habit to use
-      :func:`~django.conf.urls.defaults.url` when you are providing a
+      :func:`~django.conf.urls.url` when you are providing a
       pattern name like this.
       pattern name like this.
 
 
 By default, the :class:`~django.views.generic.list.DetailView` generic
 By default, the :class:`~django.views.generic.list.DetailView` generic

+ 3 - 3
docs/ref/contrib/admin/index.txt

@@ -1831,7 +1831,7 @@ In this example, we register the default ``AdminSite`` instance
 ``django.contrib.admin.site`` at the URL ``/admin/`` ::
 ``django.contrib.admin.site`` at the URL ``/admin/`` ::
 
 
     # urls.py
     # urls.py
-    from django.conf.urls.defaults import *
+    from django.conf.urls import patterns, url, include
     from django.contrib import admin
     from django.contrib import admin
 
 
     admin.autodiscover()
     admin.autodiscover()
@@ -1847,7 +1847,7 @@ In this example, we register the ``AdminSite`` instance
 ``myproject.admin.admin_site`` at the URL ``/myadmin/`` ::
 ``myproject.admin.admin_site`` at the URL ``/myadmin/`` ::
 
 
     # urls.py
     # urls.py
-    from django.conf.urls.defaults import *
+    from django.conf.urls import patterns, url, include
     from myproject.admin import admin_site
     from myproject.admin import admin_site
 
 
     urlpatterns = patterns('',
     urlpatterns = patterns('',
@@ -1871,7 +1871,7 @@ separate versions of the admin site -- using the ``AdminSite`` instances
 respectively::
 respectively::
 
 
     # urls.py
     # urls.py
-    from django.conf.urls.defaults import *
+    from django.conf.urls import patterns, url, include
     from myproject.admin import basic_site, advanced_site
     from myproject.admin import basic_site, advanced_site
 
 
     urlpatterns = patterns('',
     urlpatterns = patterns('',

+ 2 - 2
docs/ref/contrib/comments/example.txt

@@ -143,7 +143,7 @@ enable it in your project's ``urls.py``:
 
 
 .. code-block:: python
 .. code-block:: python
 
 
-  from django.conf.urls.defaults import *
+  from django.conf.urls import patterns, url, include
   from django.contrib.comments.feeds import LatestCommentFeed
   from django.contrib.comments.feeds import LatestCommentFeed
 
 
   urlpatterns = patterns('',
   urlpatterns = patterns('',
@@ -161,7 +161,7 @@ syndication feed view:
 
 
 .. code-block:: python
 .. code-block:: python
 
 
-    from django.conf.urls.defaults import *
+    from django.conf.urls import patterns
     from django.contrib.comments.feeds import LatestCommentFeed
     from django.contrib.comments.feeds import LatestCommentFeed
 
 
     feeds = {
     feeds = {

+ 3 - 3
docs/ref/contrib/formtools/form-wizard.txt

@@ -217,7 +217,7 @@ deploy the new :class:`WizardView` object a URL in the ``urls.py``. The
 wizard's :meth:`as_view` method takes a list of your
 wizard's :meth:`as_view` method takes a list of your
 :class:`~django.forms.Form` classes as an argument during instantiation::
 :class:`~django.forms.Form` classes as an argument during instantiation::
 
 
-    from django.conf.urls.defaults import patterns
+    from django.conf.urls import patterns
 
 
     from myapp.forms import ContactForm1, ContactForm2
     from myapp.forms import ContactForm1, ContactForm2
     from myapp.views import ContactWizard
     from myapp.views import ContactWizard
@@ -525,7 +525,7 @@ We define our wizard in a ``views.py``::
 
 
 We need to add the ``ContactWizard`` to our ``urls.py`` file::
 We need to add the ``ContactWizard`` to our ``urls.py`` file::
 
 
-    from django.conf.urls.defaults import pattern
+    from django.conf.urls import pattern
 
 
     from myapp.forms import ContactForm1, ContactForm2
     from myapp.forms import ContactForm1, ContactForm2
     from myapp.views import ContactWizard, show_message_form_condition
     from myapp.views import ContactWizard, show_message_form_condition
@@ -572,7 +572,7 @@ Additionally you have to pass two more arguments to the
 
 
 Example code for the changed ``urls.py`` file::
 Example code for the changed ``urls.py`` file::
 
 
-    from django.conf.urls.defaults import url, patterns
+    from django.conf.urls import url, patterns
 
 
     from myapp.forms import ContactForm1, ContactForm2
     from myapp.forms import ContactForm1, ContactForm2
     from myapp.views import ContactWizard
     from myapp.views import ContactWizard

+ 1 - 1
docs/ref/contrib/gis/tutorial.txt

@@ -697,7 +697,7 @@ Let's dive in again -- create a file called ``admin.py`` inside the
 Next, edit your ``urls.py`` in the ``geodjango`` project folder to look
 Next, edit your ``urls.py`` in the ``geodjango`` project folder to look
 as follows::
 as follows::
 
 
-    from django.conf.urls.defaults import *
+    from django.conf.urls import patterns, url, include
     from django.contrib.gis import admin
     from django.contrib.gis import admin
 
 
     admin.autodiscover()
     admin.autodiscover()

+ 1 - 1
docs/ref/contrib/sitemaps.txt

@@ -241,7 +241,7 @@ Example
 
 
 Here's an example of a :doc:`URLconf </topics/http/urls>` using both::
 Here's an example of a :doc:`URLconf </topics/http/urls>` using both::
 
 
-    from django.conf.urls.defaults import *
+    from django.conf.urls import patterns, url, include
     from django.contrib.sitemaps import FlatPageSitemap, GenericSitemap
     from django.contrib.sitemaps import FlatPageSitemap, GenericSitemap
     from blog.models import Entry
     from blog.models import Entry
 
 

+ 2 - 2
docs/ref/contrib/syndication.txt

@@ -80,7 +80,7 @@ latest five news items::
 To connect a URL to this feed, put an instance of the Feed object in
 To connect a URL to this feed, put an instance of the Feed object in
 your :doc:`URLconf </topics/http/urls>`. For example::
 your :doc:`URLconf </topics/http/urls>`. For example::
 
 
-    from django.conf.urls.defaults import *
+    from django.conf.urls import patterns, url, include
     from myproject.feeds import LatestEntriesFeed
     from myproject.feeds import LatestEntriesFeed
 
 
     urlpatterns = patterns('',
     urlpatterns = patterns('',
@@ -327,7 +327,7 @@ Here's a full example::
 
 
 And the accompanying URLconf::
 And the accompanying URLconf::
 
 
-    from django.conf.urls.defaults import *
+    from django.conf.urls import patterns, url, include
     from myproject.feeds import RssSiteNewsFeed, AtomSiteNewsFeed
     from myproject.feeds import RssSiteNewsFeed, AtomSiteNewsFeed
 
 
     urlpatterns = patterns('',
     urlpatterns = patterns('',

+ 1 - 1
docs/ref/models/instances.txt

@@ -524,7 +524,7 @@ pattern, it's possible to give a name to a pattern, and then reference the name
 rather than the view function. A named URL pattern is defined by replacing the
 rather than the view function. A named URL pattern is defined by replacing the
 pattern tuple by a call to the ``url`` function)::
 pattern tuple by a call to the ``url`` function)::
 
 
-    from django.conf.urls.defaults import *
+    from django.conf.urls import patterns, url, include
 
 
     url(r'^people/(\d+)/$', 'blog_views.generic_detail', name='people_view'),
     url(r'^people/(\d+)/$', 'blog_views.generic_detail', name='people_view'),
 
 

+ 14 - 3
docs/releases/1.4.txt

@@ -290,9 +290,10 @@ Django 1.4 also includes several smaller improvements worth noting:
   MySQL with the InnoDB database engine.
   MySQL with the InnoDB database engine.
 
 
 * A new 403 response handler has been added as
 * A new 403 response handler has been added as
-  ``'django.views.defaults.permission_denied'``. See the documentation
+  ``'django.views.defaults.permission_denied'``. You can set your own handler by
-  about :ref:`the 403 (HTTP Forbidden) view<http_forbidden_view>` for more
+  setting the value of :data:`django.conf.urls.handler403`. See the
-  information.
+  documentation about :ref:`the 403 (HTTP Forbidden) view<http_forbidden_view>`
+  for more information.
 
 
 * The :ttag:`trans` template tag now takes an optional ``as`` argument to
 * The :ttag:`trans` template tag now takes an optional ``as`` argument to
   be able to retrieve a translation string without displaying it but setting
   be able to retrieve a translation string without displaying it but setting
@@ -590,3 +591,13 @@ backwards-compatibility shim will be removed entirely.
 
 
 The existence of any ``'filters'`` key under the ``'mail_admins'`` handler will
 The existence of any ``'filters'`` key under the ``'mail_admins'`` handler will
 disable this backward-compatibility shim and deprecation warning.
 disable this backward-compatibility shim and deprecation warning.
+
+``django.conf.urls.defaults``
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Until Django 1.3 the functions :func:`~django.conf.urls.include`,
+:func:`~django.conf.urls.patterns` and :func:`~django.conf.urls.url` plus
+:data:`~django.conf.urls.handler404`, :data:`~django.conf.urls.handler500`
+were located in a ``django.conf.urls.defaults`` module.
+
+Starting with Django 1.4 they are now available in :mod:`django.conf.urls`.

+ 3 - 3
docs/topics/class-based-views.txt

@@ -75,7 +75,7 @@ views themselves are classes, we point the URL to the ``as_view`` class method
 instead, which is the entry point for class-based views::
 instead, which is the entry point for class-based views::
 
 
     # urls.py
     # urls.py
-    from django.conf.urls.defaults import *
+    from django.conf.urls import patterns, url, include
     from some_app.views import AboutView
     from some_app.views import AboutView
 
 
     urlpatterns = patterns('',
     urlpatterns = patterns('',
@@ -86,7 +86,7 @@ Alternatively, if you're only changing a few simple attributes on a
 class-based view, you can simply pass the new attributes into the ``as_view``
 class-based view, you can simply pass the new attributes into the ``as_view``
 method call itself::
 method call itself::
 
 
-    from django.conf.urls.defaults import *
+    from django.conf.urls import patterns, url, include
     from django.views.generic import TemplateView
     from django.views.generic import TemplateView
 
 
     urlpatterns = patterns('',
     urlpatterns = patterns('',
@@ -135,7 +135,7 @@ be using these models::
 
 
 To build a list page of all publishers, we'd use a URLconf along these lines::
 To build a list page of all publishers, we'd use a URLconf along these lines::
 
 
-    from django.conf.urls.defaults import *
+    from django.conf.urls import patterns, url, include
     from django.views.generic import ListView
     from django.views.generic import ListView
     from books.models import Publisher
     from books.models import Publisher
 
 

+ 3 - 3
docs/topics/generic-views.txt

@@ -58,7 +58,7 @@ URLconf tuple for a given pattern.
 For example, here's a simple URLconf you could use to present a static "about"
 For example, here's a simple URLconf you could use to present a static "about"
 page::
 page::
 
 
-    from django.conf.urls.defaults import *
+    from django.conf.urls import patterns, url, include
     from django.views.generic.simple import direct_to_template
     from django.views.generic.simple import direct_to_template
 
 
     urlpatterns = patterns('',
     urlpatterns = patterns('',
@@ -80,7 +80,7 @@ the URLconf to point to a view function:
 
 
 .. parsed-literal::
 .. parsed-literal::
 
 
-    from django.conf.urls.defaults import *
+    from django.conf.urls import patterns, url, include
     from django.views.generic.simple import direct_to_template
     from django.views.generic.simple import direct_to_template
     **from books.views import about_pages**
     **from books.views import about_pages**
 
 
@@ -160,7 +160,7 @@ be using these models::
 
 
 To build a list page of all publishers, we'd use a URLconf along these lines::
 To build a list page of all publishers, we'd use a URLconf along these lines::
 
 
-    from django.conf.urls.defaults import *
+    from django.conf.urls import patterns, url, include
     from django.views.generic import list_detail
     from django.views.generic import list_detail
     from books.models import Publisher
     from books.models import Publisher
 
 

+ 42 - 19
docs/topics/http/urls.txt

@@ -50,7 +50,7 @@ algorithm the system follows to determine which Python code to execute:
 
 
     2. Django loads that Python module and looks for the variable
     2. Django loads that Python module and looks for the variable
        ``urlpatterns``. This should be a Python list, in the format returned by
        ``urlpatterns``. This should be a Python list, in the format returned by
-       the function :func:`django.conf.urls.defaults.patterns`.
+       the function :func:`django.conf.urls.patterns`.
 
 
     3. Django runs through each URL pattern, in order, and stops at the first
     3. Django runs through each URL pattern, in order, and stops at the first
        one that matches the requested URL.
        one that matches the requested URL.
@@ -69,7 +69,7 @@ Example
 
 
 Here's a sample URLconf::
 Here's a sample URLconf::
 
 
-    from django.conf.urls.defaults import *
+    from django.conf.urls import patterns, url, include
 
 
     urlpatterns = patterns('',
     urlpatterns = patterns('',
         (r'^articles/2003/$', 'news.views.special_case_2003'),
         (r'^articles/2003/$', 'news.views.special_case_2003'),
@@ -80,9 +80,6 @@ Here's a sample URLconf::
 
 
 Notes:
 Notes:
 
 
-    * ``from django.conf.urls.defaults import *`` makes the ``patterns()``
-      function available.
-
     * To capture a value from the URL, just put parenthesis around it.
     * To capture a value from the URL, just put parenthesis around it.
 
 
     * There's no need to add a leading slash, because every URL has that. For
     * There's no need to add a leading slash, because every URL has that. For
@@ -184,13 +181,21 @@ Syntax of the urlpatterns variable
 ==================================
 ==================================
 
 
 ``urlpatterns`` should be a Python list, in the format returned by the function
 ``urlpatterns`` should be a Python list, in the format returned by the function
-:func:`django.conf.urls.defaults.patterns`. Always use ``patterns()`` to create
+:func:`django.conf.urls.patterns`. Always use ``patterns()`` to create
 the ``urlpatterns`` variable.
 the ``urlpatterns`` variable.
 
 
-Convention is to use ``from django.conf.urls.defaults import *`` at the top of
+``django.conf.urls`` utility functions
-your URLconf. This gives your module access to these objects:
+======================================
+
+.. module:: django.conf.urls
 
 
-.. module:: django.conf.urls.defaults
+.. deprecated:: 1.4
+    Starting with Django 1.4 functions ``patterns``, ``url``, ``include`` plus
+    the ``handler*`` symbols described below live in the ``django.conf.urls``
+    module.
+
+    Until Django 1.3 they were located in ``django.conf.urls.defaults``. You
+    still can import them from there but it will be removed in Django 1.6.
 
 
 patterns
 patterns
 --------
 --------
@@ -281,6 +286,24 @@ URLconf will have no effect.
 See the documentation on :ref:`customizing error views
 See the documentation on :ref:`customizing error views
 <customizing-error-views>` for more details.
 <customizing-error-views>` for more details.
 
 
+handler403
+----------
+
+.. data:: handler403
+
+A callable, or a string representing the full Python import path to the view
+that should be called if the user has no the permissions required to access
+a resource.
+
+By default, this is ``'django.views.defaults.permission_denied'``. That default
+value should suffice.
+
+See the documentation about :ref:`the 403 (HTTP Forbidden) view
+<http_forbidden_view>` for more information.
+
+.. versionadded:: 1.4
+    ``handler403`` is new in Django 1.4.
+
 handler404
 handler404
 ----------
 ----------
 
 
@@ -355,7 +378,7 @@ code duplication.
 
 
 Here's the example URLconf from the :doc:`Django overview </intro/overview>`::
 Here's the example URLconf from the :doc:`Django overview </intro/overview>`::
 
 
-    from django.conf.urls.defaults import *
+    from django.conf.urls import patterns, url, include
 
 
     urlpatterns = patterns('',
     urlpatterns = patterns('',
         (r'^articles/(\d{4})/$', 'news.views.year_archive'),
         (r'^articles/(\d{4})/$', 'news.views.year_archive'),
@@ -370,7 +393,7 @@ each view function.
 
 
 With this in mind, the above example can be written more concisely as::
 With this in mind, the above example can be written more concisely as::
 
 
-    from django.conf.urls.defaults import *
+    from django.conf.urls import patterns, url, include
 
 
     urlpatterns = patterns('news.views',
     urlpatterns = patterns('news.views',
         (r'^articles/(\d{4})/$', 'year_archive'),
         (r'^articles/(\d{4})/$', 'year_archive'),
@@ -391,7 +414,7 @@ Just add multiple ``patterns()`` objects together, like this:
 
 
 Old::
 Old::
 
 
-    from django.conf.urls.defaults import *
+    from django.conf.urls import patterns, url, include
 
 
     urlpatterns = patterns('',
     urlpatterns = patterns('',
         (r'^$', 'django.views.generic.date_based.archive_index'),
         (r'^$', 'django.views.generic.date_based.archive_index'),
@@ -401,7 +424,7 @@ Old::
 
 
 New::
 New::
 
 
-    from django.conf.urls.defaults import *
+    from django.conf.urls import patterns, url, include
 
 
     urlpatterns = patterns('django.views.generic.date_based',
     urlpatterns = patterns('django.views.generic.date_based',
         (r'^$', 'archive_index'),
         (r'^$', 'archive_index'),
@@ -421,7 +444,7 @@ essentially "roots" a set of URLs below other ones.
 For example, here's the URLconf for the `Django Web site`_ itself. It includes a
 For example, here's the URLconf for the `Django Web site`_ itself. It includes a
 number of other URLconfs::
 number of other URLconfs::
 
 
-    from django.conf.urls.defaults import *
+    from django.conf.urls import patterns, url, include
 
 
     urlpatterns = patterns('',
     urlpatterns = patterns('',
         (r'^weblog/',        include('django_website.apps.blog.urls.blog')),
         (r'^weblog/',        include('django_website.apps.blog.urls.blog')),
@@ -439,7 +462,7 @@ Another possibility is to include additional URL patterns not by specifying the
 URLconf Python module defining them as the `include`_ argument but by using
 URLconf Python module defining them as the `include`_ argument but by using
 directly the pattern list as returned by `patterns`_ instead. For example::
 directly the pattern list as returned by `patterns`_ instead. For example::
 
 
-    from django.conf.urls.defaults import *
+    from django.conf.urls import patterns, url, include
 
 
     extra_patterns = patterns('',
     extra_patterns = patterns('',
         url(r'reports/(?P<id>\d+)/$', 'credit.views.report', name='credit-reports'),
         url(r'reports/(?P<id>\d+)/$', 'credit.views.report', name='credit-reports'),
@@ -784,8 +807,8 @@ following would happen:
     * ``foo:index`` will again resolve to the index page of the instance ``foo``.
     * ``foo:index`` will again resolve to the index page of the instance ``foo``.
 
 
 
 
-Utility methods
+``django.core.urlresolvers`` utility functions
-===============
+==============================================
 
 
 .. currentmodule:: django.core.urlresolvers
 .. currentmodule:: django.core.urlresolvers
 
 
@@ -793,7 +816,7 @@ reverse()
 ---------
 ---------
 
 
 If you need to use something similar to the :ttag:`url` template tag in
 If you need to use something similar to the :ttag:`url` template tag in
-your code, Django provides the following method (in the
+your code, Django provides the following function (in the
 :mod:`django.core.urlresolvers` module):
 :mod:`django.core.urlresolvers` module):
 
 
 .. function:: reverse(viewname, [urlconf=None, args=None, kwargs=None, current_app=None])
 .. function:: reverse(viewname, [urlconf=None, args=None, kwargs=None, current_app=None])
@@ -859,7 +882,7 @@ reverse_lazy()
 A lazily evaluated version of `reverse()`_.
 A lazily evaluated version of `reverse()`_.
 
 
 It is useful for when you need to use a URL reversal before your project's
 It is useful for when you need to use a URL reversal before your project's
-URLConf is loaded. Some common cases where this method is necessary are:
+URLConf is loaded. Some common cases where this function is necessary are:
 
 
 * providing a reversed URL as the ``url`` attribute of a generic class-based
 * providing a reversed URL as the ``url`` attribute of a generic class-based
   view.
   view.

+ 3 - 3
docs/topics/i18n/internationalization.txt

@@ -819,11 +819,11 @@ Language prefix in URL patterns
 .. function:: i18n_patterns(prefix, pattern_description, ...)
 .. function:: i18n_patterns(prefix, pattern_description, ...)
 
 
 This function can be used in your root URLconf as a replacement for the normal
 This function can be used in your root URLconf as a replacement for the normal
-:func:`django.conf.urls.defaults.patterns` function. Django will automatically
+:func:`django.conf.urls.patterns` function. Django will automatically
 prepend the current active language code to all url patterns defined within
 prepend the current active language code to all url patterns defined within
 :func:`~django.conf.urls.i18n.i18n_patterns`. Example URL patterns::
 :func:`~django.conf.urls.i18n.i18n_patterns`. Example URL patterns::
 
 
-    from django.conf.urls.defaults import patterns, include, url
+    from django.conf.urls import patterns, include, url
     from django.conf.urls.i18n import i18n_patterns
     from django.conf.urls.i18n import i18n_patterns
 
 
     urlpatterns = patterns(''
     urlpatterns = patterns(''
@@ -877,7 +877,7 @@ Translating URL patterns
 URL patterns can also be marked translatable using the
 URL patterns can also be marked translatable using the
 :func:`~django.utils.translation.ugettext_lazy` function. Example::
 :func:`~django.utils.translation.ugettext_lazy` function. Example::
 
 
-    from django.conf.urls.defaults import patterns, include, url
+    from django.conf.urls import patterns, include, url
     from django.conf.urls.i18n import i18n_patterns
     from django.conf.urls.i18n import i18n_patterns
     from django.utils.translation import ugettext_lazy as _
     from django.utils.translation import ugettext_lazy as _
 
 

+ 1 - 1
tests/modeltests/test_client/urls.py

@@ -1,4 +1,4 @@
-from django.conf.urls.defaults import *
+from django.conf.urls import patterns
 from django.views.generic import RedirectView
 from django.views.generic import RedirectView
 import views
 import views
 
 

+ 1 - 1
tests/regressiontests/admin_views/customadmin.py

@@ -1,7 +1,7 @@
 """
 """
 A second, custom AdminSite -- see tests.CustomAdminSiteTests.
 A second, custom AdminSite -- see tests.CustomAdminSiteTests.
 """
 """
-from django.conf.urls.defaults import patterns
+from django.conf.urls import patterns
 from django.contrib import admin
 from django.contrib import admin
 from django.http import HttpResponse
 from django.http import HttpResponse
 
 

+ 1 - 1
tests/regressiontests/admin_views/urls.py

@@ -1,4 +1,4 @@
-from django.conf.urls.defaults import *
+from django.conf.urls import patterns, include
 from django.contrib import admin
 from django.contrib import admin
 import views
 import views
 import customadmin
 import customadmin

+ 1 - 2
tests/regressiontests/admin_widgets/urls.py

@@ -1,5 +1,4 @@
-
+from django.conf.urls import patterns, include
-from django.conf.urls.defaults import *
 import widgetadmin
 import widgetadmin
 
 
 urlpatterns = patterns('',
 urlpatterns = patterns('',

+ 1 - 1
tests/regressiontests/comment_tests/urls.py

@@ -1,4 +1,4 @@
-from django.conf.urls.defaults import *
+from django.conf.urls import patterns, url
 from django.contrib.comments.feeds import LatestCommentFeed
 from django.contrib.comments.feeds import LatestCommentFeed
 
 
 feeds = {
 feeds = {

+ 1 - 1
tests/regressiontests/comment_tests/urls_admin.py

@@ -1,4 +1,4 @@
-from django.conf.urls.defaults import *
+from django.conf.urls import patterns, include
 from django.contrib import admin
 from django.contrib import admin
 from django.contrib.comments.admin import CommentsAdmin
 from django.contrib.comments.admin import CommentsAdmin
 from django.contrib.comments.models import Comment
 from django.contrib.comments.models import Comment

+ 1 - 1
tests/regressiontests/conditional_processing/urls.py

@@ -1,4 +1,4 @@
-from django.conf.urls.defaults import *
+from django.conf.urls import patterns
 import views
 import views
 
 
 urlpatterns = patterns('',
 urlpatterns = patterns('',

+ 1 - 1
tests/regressiontests/context_processors/urls.py

@@ -1,4 +1,4 @@
-from django.conf.urls.defaults import *
+from django.conf.urls import patterns, url
 
 
 import views
 import views
 
 

+ 1 - 1
tests/regressiontests/file_uploads/urls.py

@@ -1,4 +1,4 @@
-from django.conf.urls.defaults import *
+from django.conf.urls import patterns
 import views
 import views
 
 
 urlpatterns = patterns('',
 urlpatterns = patterns('',

+ 1 - 1
tests/regressiontests/generic_inline_admin/urls.py

@@ -1,4 +1,4 @@
-from django.conf.urls.defaults import *
+from django.conf.urls import patterns, include
 from django.contrib import admin
 from django.contrib import admin
 
 
 urlpatterns = patterns('',
 urlpatterns = patterns('',

+ 1 - 1
tests/regressiontests/generic_views/urls.py

@@ -1,4 +1,4 @@
-from django.conf.urls.defaults import *
+from django.conf.urls import patterns, url
 from django.views.generic import TemplateView
 from django.views.generic import TemplateView
 from django.views.decorators.cache import cache_page
 from django.views.decorators.cache import cache_page
 
 

+ 1 - 1
tests/regressiontests/i18n/patterns/urls/default.py

@@ -1,4 +1,4 @@
-from django.conf.urls.defaults import patterns, include, url
+from django.conf.urls import patterns, include, url
 from django.conf.urls.i18n import i18n_patterns
 from django.conf.urls.i18n import i18n_patterns
 from django.utils.translation import ugettext_lazy as _
 from django.utils.translation import ugettext_lazy as _
 from django.views.generic import TemplateView
 from django.views.generic import TemplateView

+ 1 - 1
tests/regressiontests/i18n/patterns/urls/disabled.py

@@ -1,4 +1,4 @@
-from django.conf.urls.defaults import url
+from django.conf.urls import url
 from django.conf.urls.i18n import i18n_patterns
 from django.conf.urls.i18n import i18n_patterns
 from django.views.generic import TemplateView
 from django.views.generic import TemplateView
 
 

+ 1 - 1
tests/regressiontests/i18n/patterns/urls/namespace.py

@@ -1,4 +1,4 @@
-from django.conf.urls.defaults import patterns, url
+from django.conf.urls import patterns, url
 from django.utils.translation import ugettext_lazy as _
 from django.utils.translation import ugettext_lazy as _
 from django.views.generic import TemplateView
 from django.views.generic import TemplateView
 
 

+ 1 - 1
tests/regressiontests/i18n/patterns/urls/wrong.py

@@ -1,4 +1,4 @@
-from django.conf.urls.defaults import include, url
+from django.conf.urls import include, url
 from django.conf.urls.i18n import i18n_patterns
 from django.conf.urls.i18n import i18n_patterns
 from django.utils.translation import ugettext_lazy as _
 from django.utils.translation import ugettext_lazy as _
 
 

+ 1 - 1
tests/regressiontests/i18n/patterns/urls/wrong_namespace.py

@@ -1,4 +1,4 @@
-from django.conf.urls.defaults import url
+from django.conf.urls import url
 from django.conf.urls.i18n import i18n_patterns
 from django.conf.urls.i18n import i18n_patterns
 from django.utils.translation import ugettext_lazy as _
 from django.utils.translation import ugettext_lazy as _
 from django.views.generic import TemplateView
 from django.views.generic import TemplateView

+ 1 - 1
tests/regressiontests/middleware/cond_get_urls.py

@@ -1,4 +1,4 @@
-from django.conf.urls.defaults import patterns
+from django.conf.urls import patterns
 from django.http import HttpResponse
 from django.http import HttpResponse
 
 
 urlpatterns = patterns('',
 urlpatterns = patterns('',

+ 1 - 1
tests/regressiontests/middleware/extra_urls.py

@@ -1,4 +1,4 @@
-from django.conf.urls.defaults import patterns
+from django.conf.urls import patterns
 
 
 urlpatterns = patterns('',
 urlpatterns = patterns('',
     (r'^middleware/customurlconf/noslash$', 'view'),
     (r'^middleware/customurlconf/noslash$', 'view'),

+ 1 - 1
tests/regressiontests/middleware/urls.py

@@ -1,4 +1,4 @@
-from django.conf.urls.defaults import patterns
+from django.conf.urls import patterns
 
 
 urlpatterns = patterns('',
 urlpatterns = patterns('',
     (r'^noslash$', 'view'),
     (r'^noslash$', 'view'),

+ 1 - 1
tests/regressiontests/middleware_exceptions/urls.py

@@ -1,5 +1,5 @@
 # coding: utf-8
 # coding: utf-8
-from django.conf.urls.defaults import *
+from django.conf.urls import patterns
 
 
 import views
 import views
 
 

+ 1 - 1
tests/regressiontests/model_permalink/urls.py

@@ -1,4 +1,4 @@
-from django.conf.urls.defaults import *
+from django.conf.urls import patterns, url
 
 
 urlpatterns = patterns('',
 urlpatterns = patterns('',
     url(r'^guitarists/(\w{1,50})/$', 'unimplemented_view_placeholder', name='guitarist_detail'),
     url(r'^guitarists/(\w{1,50})/$', 'unimplemented_view_placeholder', name='guitarist_detail'),

+ 1 - 1
tests/regressiontests/special_headers/urls.py

@@ -1,5 +1,5 @@
 # coding: utf-8
 # coding: utf-8
-from django.conf.urls.defaults import *
+from django.conf.urls import patterns
 from django.views.generic.list_detail import object_detail
 from django.views.generic.list_detail import object_detail
 from models import Article
 from models import Article
 import views
 import views

+ 1 - 1
tests/regressiontests/staticfiles_tests/urls/default.py

@@ -1,4 +1,4 @@
-from django.conf.urls.defaults import patterns, url
+from django.conf.urls import patterns, url
 
 
 urlpatterns = patterns('',
 urlpatterns = patterns('',
     url(r'^static/(?P<path>.*)$', 'django.contrib.staticfiles.views.serve'),
     url(r'^static/(?P<path>.*)$', 'django.contrib.staticfiles.views.serve'),

+ 1 - 1
tests/regressiontests/syndication/urls.py

@@ -1,4 +1,4 @@
-from django.conf.urls.defaults import *
+from django.conf.urls import patterns
 
 
 import feeds
 import feeds
 
 

+ 1 - 1
tests/regressiontests/templates/alternate_urls.py

@@ -1,5 +1,5 @@
 # coding: utf-8
 # coding: utf-8
-from django.conf.urls.defaults import *
+from django.conf.urls import patterns, url
 
 
 from regressiontests.templates import views
 from regressiontests.templates import views
 
 

+ 1 - 1
tests/regressiontests/templates/urls.py

@@ -1,5 +1,5 @@
 # coding: utf-8
 # coding: utf-8
-from django.conf.urls.defaults import *
+from django.conf.urls import patterns, url
 from regressiontests.templates import views
 from regressiontests.templates import views
 
 
 urlpatterns = patterns('',
 urlpatterns = patterns('',

+ 1 - 1
tests/regressiontests/test_client_regress/urls.py

@@ -1,4 +1,4 @@
-from django.conf.urls.defaults import *
+from django.conf.urls import patterns, url
 from django.views.generic import RedirectView
 from django.views.generic import RedirectView
 import views
 import views
 
 

+ 1 - 1
tests/regressiontests/test_utils/urls.py

@@ -1,4 +1,4 @@
-from django.conf.urls.defaults import patterns
+from django.conf.urls import patterns
 
 
 import views
 import views
 
 

+ 1 - 1
tests/regressiontests/urlpatterns_reverse/erroneous_urls.py

@@ -1,4 +1,4 @@
-from django.conf.urls.defaults import patterns, url
+from django.conf.urls import patterns, url
 
 
 urlpatterns = patterns('',
 urlpatterns = patterns('',
     # View has erroneous import
     # View has erroneous import

+ 1 - 1
tests/regressiontests/urlpatterns_reverse/extra_urls.py

@@ -2,7 +2,7 @@
 Some extra URL patterns that are included at the top level.
 Some extra URL patterns that are included at the top level.
 """
 """
 
 
-from django.conf.urls.defaults import *
+from django.conf.urls import patterns, url, include
 from views import empty_view
 from views import empty_view
 
 
 urlpatterns = patterns('',
 urlpatterns = patterns('',

+ 1 - 1
tests/regressiontests/urlpatterns_reverse/included_named_urls.py

@@ -1,4 +1,4 @@
-from django.conf.urls.defaults import *
+from django.conf.urls import patterns, url, include
 from views import empty_view
 from views import empty_view
 
 
 urlpatterns = patterns('',
 urlpatterns = patterns('',

+ 1 - 1
tests/regressiontests/urlpatterns_reverse/included_named_urls2.py

@@ -1,4 +1,4 @@
-from django.conf.urls.defaults import *
+from django.conf.urls import patterns, url
 from views import empty_view
 from views import empty_view
 
 
 urlpatterns = patterns('',
 urlpatterns = patterns('',

+ 1 - 1
tests/regressiontests/urlpatterns_reverse/included_namespace_urls.py

@@ -1,4 +1,4 @@
-from django.conf.urls.defaults import *
+from django.conf.urls import patterns, url, include
 from namespace_urls import URLObject
 from namespace_urls import URLObject
 from views import view_class_instance
 from views import view_class_instance
 
 

+ 1 - 1
tests/regressiontests/urlpatterns_reverse/included_urls.py

@@ -1,4 +1,4 @@
-from django.conf.urls.defaults import *
+from django.conf.urls import patterns, url
 from views import empty_view
 from views import empty_view
 
 
 urlpatterns = patterns('',
 urlpatterns = patterns('',

+ 1 - 1
tests/regressiontests/urlpatterns_reverse/included_urls2.py

@@ -5,7 +5,7 @@ each name to resolve and Django must distinguish the possibilities based on the
 argument list.
 argument list.
 """
 """
 
 
-from django.conf.urls.defaults import *
+from django.conf.urls import patterns, url
 from views import empty_view
 from views import empty_view
 
 
 urlpatterns = patterns('',
 urlpatterns = patterns('',

+ 1 - 1
tests/regressiontests/urlpatterns_reverse/named_urls.py

@@ -1,4 +1,4 @@
-from django.conf.urls.defaults import *
+from django.conf.urls import patterns, url, include
 from views import empty_view
 from views import empty_view
 
 
 urlpatterns = patterns('',
 urlpatterns = patterns('',

+ 1 - 1
tests/regressiontests/urlpatterns_reverse/namespace_urls.py

@@ -1,4 +1,4 @@
-from django.conf.urls.defaults import *
+from django.conf.urls import patterns, url, include
 from views import view_class_instance
 from views import view_class_instance
 
 
 class URLObject(object):
 class URLObject(object):

+ 1 - 1
tests/regressiontests/urlpatterns_reverse/no_urls.py

@@ -1,2 +1,2 @@
-#from django.conf.urls.defaults import *
+#from django.conf.urls import patterns, url, include
 
 

+ 1 - 1
tests/regressiontests/urlpatterns_reverse/reverse_lazy_urls.py

@@ -1,4 +1,4 @@
-from django.conf.urls.defaults import *
+from django.conf.urls import patterns, url
 
 
 from views import empty_view, LazyRedirectView, login_required_view
 from views import empty_view, LazyRedirectView, login_required_view
 
 

+ 1 - 1
tests/regressiontests/urlpatterns_reverse/urlconf_inner.py

@@ -1,4 +1,4 @@
-from django.conf.urls.defaults import *
+from django.conf.urls import patterns, url
 from django.template import Template, Context
 from django.template import Template, Context
 from django.http import HttpResponse
 from django.http import HttpResponse
 
 

+ 1 - 1
tests/regressiontests/urlpatterns_reverse/urlconf_outer.py

@@ -1,4 +1,4 @@
-from django.conf.urls.defaults import *
+from django.conf.urls import patterns, url, include
 
 
 import urlconf_inner
 import urlconf_inner
 
 

+ 1 - 1
tests/regressiontests/urlpatterns_reverse/urls.py

@@ -1,4 +1,4 @@
-from django.conf.urls.defaults import *
+from django.conf.urls import patterns, url, include
 from views import empty_view, absolute_kwargs_view
 from views import empty_view, absolute_kwargs_view
 
 
 other_patterns = patterns('',
 other_patterns = patterns('',

+ 1 - 1
tests/regressiontests/urlpatterns_reverse/urls_error_handlers.py

@@ -1,6 +1,6 @@
 # Used by the ErrorHandlerResolutionTests test case.
 # Used by the ErrorHandlerResolutionTests test case.
 
 
-from django.conf.urls.defaults import patterns
+from django.conf.urls import patterns
 
 
 urlpatterns = patterns('')
 urlpatterns = patterns('')
 
 

+ 1 - 1
tests/regressiontests/urlpatterns_reverse/urls_error_handlers_callables.py

@@ -1,6 +1,6 @@
 # Used by the ErrorHandlerResolutionTests test case.
 # Used by the ErrorHandlerResolutionTests test case.
 
 
-from django.conf.urls.defaults import patterns
+from django.conf.urls import patterns
 from views import empty_view
 from views import empty_view
 
 
 urlpatterns = patterns('')
 urlpatterns = patterns('')

+ 2 - 2
tests/regressiontests/urlpatterns_reverse/urls_without_full_import.py

@@ -1,7 +1,7 @@
 # A URLs file that doesn't use the default
 # A URLs file that doesn't use the default
-# from django.conf.urls.defaults import *
+# from django.conf.urls import *
 # import pattern.
 # import pattern.
-from django.conf.urls.defaults import patterns, url
+from django.conf.urls import patterns, url
 from views import empty_view, bad_view
 from views import empty_view, bad_view
 
 
 urlpatterns = patterns('',
 urlpatterns = patterns('',

+ 1 - 1
tests/regressiontests/views/generic_urls.py

@@ -1,5 +1,5 @@
 # -*- coding:utf-8 -*-
 # -*- coding:utf-8 -*-
-from django.conf.urls.defaults import patterns, url
+from django.conf.urls import patterns, url
 
 
 from models import *
 from models import *
 
 

+ 1 - 1
tests/regressiontests/views/urls.py

@@ -1,7 +1,7 @@
 # coding: utf-8
 # coding: utf-8
 from os import path
 from os import path
 
 
-from django.conf.urls.defaults import *
+from django.conf.urls import patterns, url, include
 
 
 import views
 import views
 
 

+ 1 - 1
tests/urls.py

@@ -1,4 +1,4 @@
-from django.conf.urls.defaults import *
+from django.conf.urls import patterns, include
 
 
 
 
 urlpatterns = patterns('',
 urlpatterns = patterns('',