From 2522559d1a612a4e8885de4780ff2b7aa7b8d375 Mon Sep 17 00:00:00 2001 From: David Smith Date: Mon, 4 May 2020 19:33:35 +0100 Subject: [PATCH] Fixed #31534 -- Deprecated django.conf.urls.url(). --- django/conf/urls/__init__.py | 8 ++++++++ django/views/i18n.py | 4 ++-- docs/internals/deprecation.txt | 2 ++ docs/ref/urls.txt | 7 +++++-- docs/releases/1.6.txt | 2 +- docs/releases/1.8.1.txt | 2 +- docs/releases/1.8.txt | 8 ++++---- docs/releases/1.9.txt | 2 +- docs/releases/3.1.txt | 3 +++ tests/urlpatterns/tests.py | 12 ++++++++++++ 10 files changed, 39 insertions(+), 11 deletions(-) diff --git a/django/conf/urls/__init__.py b/django/conf/urls/__init__.py index 7bda34516b..311cd70b84 100644 --- a/django/conf/urls/__init__.py +++ b/django/conf/urls/__init__.py @@ -1,4 +1,7 @@ +import warnings + from django.urls import include, re_path +from django.utils.deprecation import RemovedInDjango40Warning from django.views import defaults __all__ = ['handler400', 'handler403', 'handler404', 'handler500', 'include', 'url'] @@ -10,4 +13,9 @@ handler500 = defaults.server_error def url(regex, view, kwargs=None, name=None): + warnings.warn( + 'django.conf.urls.url() is deprecated in favor of ' + 'django.urls.re_path().', + RemovedInDjango40Warning, + ) return re_path(regex, view, kwargs, name) diff --git a/django/views/i18n.py b/django/views/i18n.py index 23656a24db..9644565f46 100644 --- a/django/views/i18n.py +++ b/django/views/i18n.py @@ -196,8 +196,8 @@ class JavaScriptCatalog(View): Return the selected language catalog as a JavaScript library. Receive the list of packages to check for translations in the `packages` - kwarg either from the extra dictionary passed to the url() function or as a - plus-sign delimited string from the request. Default is 'django.conf'. + kwarg either from the extra dictionary passed to the path() function or as + a plus-sign delimited string from the request. Default is 'django.conf'. You can override the gettext domain for this view, but usually you don't want to do that as JavaScript messages go to the djangojs domain. This diff --git a/docs/internals/deprecation.txt b/docs/internals/deprecation.txt index 95b0c5a3a1..1d89238ede 100644 --- a/docs/internals/deprecation.txt +++ b/docs/internals/deprecation.txt @@ -81,6 +81,8 @@ details on these changes. * The model ``NullBooleanField`` will be removed. A stub field will remain for compatibility with historical migrations. +* ``django.conf.urls.url()`` will be removed. + See the :ref:`Django 3.1 release notes ` for more details on these changes. diff --git a/docs/ref/urls.txt b/docs/ref/urls.txt index 1527a34720..ce14817c22 100644 --- a/docs/ref/urls.txt +++ b/docs/ref/urls.txt @@ -141,8 +141,11 @@ Helper function to return a URL pattern for serving files in debug mode:: .. function:: url(regex, view, kwargs=None, name=None) -This function is an alias to :func:`django.urls.re_path()`. It's likely to be -deprecated in a future release. +This function is an alias to :func:`django.urls.re_path()`. + +.. deprecated:: 3.1 + + Alias of :func:`django.urls.re_path` for backwards compatibility. ``handler400`` ============== diff --git a/docs/releases/1.6.txt b/docs/releases/1.6.txt index 7dc57ee11b..71457f15f6 100644 --- a/docs/releases/1.6.txt +++ b/docs/releases/1.6.txt @@ -916,7 +916,7 @@ Miscellaneous * :ref:`Authentication views ` are now reversed by name, not their locations in ``django.contrib.auth.views``. If you are using the views without a ``name``, you should update your ``urlpatterns`` to use - :meth:`~django.conf.urls.url` with the ``name`` parameter. For example:: + ``django.conf.urls.url()`` with the ``name`` parameter. For example:: (r'^reset/done/$', 'django.contrib.auth.views.password_reset_complete') diff --git a/docs/releases/1.8.1.txt b/docs/releases/1.8.1.txt index 085bfe3ace..709a478d9e 100644 --- a/docs/releases/1.8.1.txt +++ b/docs/releases/1.8.1.txt @@ -48,7 +48,7 @@ Bugfixes * Updated ``urlpatterns`` examples generated by :djadmin:`startproject` to remove usage of referencing views by dotted path in - :func:`~django.conf.urls.url` which is deprecated in Django 1.8 + ``django.conf.urls.url()`` which is deprecated in Django 1.8 (:ticket:`24635`). * Fixed queries where an expression was referenced in ``order_by()``, but wasn't diff --git a/docs/releases/1.8.txt b/docs/releases/1.8.txt index fab2fe9187..3845176827 100644 --- a/docs/releases/1.8.txt +++ b/docs/releases/1.8.txt @@ -1270,7 +1270,7 @@ Thus ``patterns()`` serves little purpose and is a burden when teaching new user (answering the newbie's question "why do I need this empty string as the first argument to ``patterns()``?"). For these reasons, we are deprecating it. Updating your code is as simple as ensuring that ``urlpatterns`` is a list of -:func:`django.conf.urls.url` instances. For example:: +``django.conf.urls.url()`` instances. For example:: from django.conf.urls import url from myapp import views @@ -1280,8 +1280,8 @@ Updating your code is as simple as ensuring that ``urlpatterns`` is a list of url('^other/$', views.otherview), ] -Passing a string as ``view`` to :func:`~django.conf.urls.url` -------------------------------------------------------------- +Passing a string as ``view`` to ``django.conf.urls.url()`` +---------------------------------------------------------- Related to the previous item, referencing views as strings in the ``url()`` function is deprecated. Pass the callable view as described in the previous @@ -1319,7 +1319,7 @@ instead. Related to the previous item, the ``prefix`` argument to :func:`django.conf.urls.i18n.i18n_patterns` has been deprecated. Simply pass a -list of :func:`django.conf.urls.url` instances instead. +list of ``django.conf.urls.url()`` instances instead. Using an incorrect count of unpacked values in the :ttag:`for` template tag --------------------------------------------------------------------------- diff --git a/docs/releases/1.9.txt b/docs/releases/1.9.txt index 171d427619..69b41f1c08 100644 --- a/docs/releases/1.9.txt +++ b/docs/releases/1.9.txt @@ -1289,7 +1289,7 @@ to: This change also means that the old way of including an ``AdminSite`` instance is deprecated. Instead, pass ``admin.site.urls`` directly to -:func:`~django.conf.urls.url()`: +``django.conf.urls.url()``: .. code-block:: python :caption: urls.py diff --git a/docs/releases/3.1.txt b/docs/releases/3.1.txt index c4863a3ab4..e3f0353d2d 100644 --- a/docs/releases/3.1.txt +++ b/docs/releases/3.1.txt @@ -754,6 +754,9 @@ Miscellaneous * The ``NullBooleanField`` model field is deprecated in favor of ``BooleanField(null=True)``. +* ``django.conf.urls.url()`` alias of :func:`django.urls.re_path` is + deprecated. + .. _removed-features-3.1: Features removed in 3.1 diff --git a/tests/urlpatterns/tests.py b/tests/urlpatterns/tests.py index b6353873ae..54b7e09813 100644 --- a/tests/urlpatterns/tests.py +++ b/tests/urlpatterns/tests.py @@ -1,9 +1,11 @@ import uuid +from django.conf.urls import url as conf_url from django.core.exceptions import ImproperlyConfigured from django.test import SimpleTestCase from django.test.utils import override_settings from django.urls import NoReverseMatch, Resolver404, path, resolve, reverse +from django.utils.deprecation import RemovedInDjango40Warning from .converters import DynamicConverter from .views import empty_view @@ -303,3 +305,13 @@ class ConversionExceptionTests(SimpleTestCase): raise TypeError('This type error propagates.') with self.assertRaisesMessage(TypeError, 'This type error propagates.'): reverse('dynamic', kwargs={'value': object()}) + + +class DeprecationTests(SimpleTestCase): + def test_url_warning(self): + msg = ( + 'django.conf.urls.url() is deprecated in favor of ' + 'django.urls.re_path().' + ) + with self.assertRaisesMessage(RemovedInDjango40Warning, msg): + conf_url(r'^regex/(?P[0-9]+)/$', empty_view, name='regex')