diff --git a/django/forms/formsets.py b/django/forms/formsets.py
index f14e1aae83..235aaf844c 100644
--- a/django/forms/formsets.py
+++ b/django/forms/formsets.py
@@ -32,8 +32,6 @@ class ManagementForm(Form):
as well.
"""
- template_name = "django/forms/div.html" # RemovedInDjango50Warning.
-
TOTAL_FORMS = IntegerField(widget=HiddenInput)
INITIAL_FORMS = IntegerField(widget=HiddenInput)
# MIN_NUM_FORM_COUNT and MAX_NUM_FORM_COUNT are output with the rest of the
diff --git a/django/forms/jinja2/django/forms/default.html b/django/forms/jinja2/django/forms/default.html
deleted file mode 100644
index d034b60d57..0000000000
--- a/django/forms/jinja2/django/forms/default.html
+++ /dev/null
@@ -1 +0,0 @@
-{% include "django/forms/table.html" %}
diff --git a/django/forms/jinja2/django/forms/formsets/default.html b/django/forms/jinja2/django/forms/formsets/default.html
deleted file mode 100644
index d8284c5da1..0000000000
--- a/django/forms/jinja2/django/forms/formsets/default.html
+++ /dev/null
@@ -1 +0,0 @@
-{{ formset.management_form }}{% for form in formset %}{{ form }}{% endfor %}
diff --git a/django/forms/renderers.py b/django/forms/renderers.py
index 43340c6c88..d53a7c633d 100644
--- a/django/forms/renderers.py
+++ b/django/forms/renderers.py
@@ -15,11 +15,8 @@ def get_default_renderer():
class BaseRenderer:
- # RemovedInDjango50Warning: When the deprecation ends, replace with
- # form_template_name = "django/forms/div.html"
- # formset_template_name = "django/forms/formsets/div.html"
- form_template_name = "django/forms/default.html"
- formset_template_name = "django/forms/formsets/default.html"
+ form_template_name = "django/forms/div.html"
+ formset_template_name = "django/forms/formsets/div.html"
def get_template(self, template_name):
raise NotImplementedError("subclasses must implement get_template()")
diff --git a/django/forms/templates/django/forms/default.html b/django/forms/templates/django/forms/default.html
deleted file mode 100644
index d034b60d57..0000000000
--- a/django/forms/templates/django/forms/default.html
+++ /dev/null
@@ -1 +0,0 @@
-{% include "django/forms/table.html" %}
diff --git a/django/forms/templates/django/forms/formsets/default.html b/django/forms/templates/django/forms/formsets/default.html
deleted file mode 100644
index d8284c5da1..0000000000
--- a/django/forms/templates/django/forms/formsets/default.html
+++ /dev/null
@@ -1 +0,0 @@
-{{ formset.management_form }}{% for form in formset %}{{ form }}{% endfor %}
diff --git a/django/forms/utils.py b/django/forms/utils.py
index 7577c0bbda..e0888b6e85 100644
--- a/django/forms/utils.py
+++ b/django/forms/utils.py
@@ -1,16 +1,13 @@
import json
-import warnings
from collections import UserList
from django.conf import settings
from django.core.exceptions import ValidationError
from django.forms.renderers import get_default_renderer
from django.utils import timezone
-from django.utils.deprecation import RemovedInDjango50Warning
from django.utils.html import escape, format_html_join
from django.utils.safestring import mark_safe
from django.utils.translation import gettext_lazy as _
-from django.utils.version import get_docs_version
def pretty_name(name):
@@ -45,16 +42,6 @@ def flatatt(attrs):
)
-DEFAULT_TEMPLATE_DEPRECATION_MSG = (
- 'The "default.html" templates for forms and formsets will be removed. These were '
- 'proxies to the equivalent "table.html" templates, but the new "div.html" '
- "templates will be the default from Django 5.0. Transitional renderers are "
- "provided to allow you to opt-in to the new output style now. See "
- "https://docs.djangoproject.com/en/%s/releases/4.1/ for more details"
- % get_docs_version()
-)
-
-
class RenderableMixin:
def get_context(self):
raise NotImplementedError(
@@ -65,13 +52,6 @@ class RenderableMixin:
renderer = renderer or self.renderer
template = template_name or self.template_name
context = context or self.get_context()
- if (
- template == "django/forms/default.html"
- or template == "django/forms/formsets/default.html"
- ):
- warnings.warn(
- DEFAULT_TEMPLATE_DEPRECATION_MSG, RemovedInDjango50Warning, stacklevel=2
- )
return mark_safe(renderer.render(template, context))
__str__ = render
diff --git a/docs/ref/forms/renderers.txt b/docs/ref/forms/renderers.txt
index 9bb19df1c1..92ec2d68df 100644
--- a/docs/ref/forms/renderers.txt
+++ b/docs/ref/forms/renderers.txt
@@ -51,27 +51,13 @@ should return a rendered templates (as a string) or raise
The default name of the template to use to render a form.
- Defaults to ``"django/forms/default.html"``, which is a proxy for
- ``"django/forms/table.html"``.
-
- .. deprecated:: 4.1
-
- The ``"django/forms/default.html"`` template is deprecated and will be
- removed in Django 5.0. The default will become
- ``"django/forms/div.html"`` at that time.
+ Defaults to ``"django/forms/div.html"`` template.
.. attribute:: formset_template_name
The default name of the template to use to render a formset.
- Defaults to ``"django/forms/formsets/default.html"``, which is a proxy
- for ``"django/forms/formsets/table.html"``.
-
- .. deprecated:: 4.1
-
- The ``"django/forms/formset/default.html"`` template is deprecated and
- will be removed in Django 5.0. The default will become
- ``"django/forms/formset/div.html"`` template.
+ Defaults to ``"django/forms/formsets/div.html"`` template.
.. method:: get_template(template_name)
diff --git a/docs/releases/5.0.txt b/docs/releases/5.0.txt
index f1ab7b2e7f..d8212e69e6 100644
--- a/docs/releases/5.0.txt
+++ b/docs/releases/5.0.txt
@@ -342,3 +342,8 @@ to remove usage of these features.
* The ``django.contrib.gis.admin.OpenLayersWidget`` is removed.
+ The ``django.contrib.auth.hashers.CryptPasswordHasher`` is removed.
+
+* The ``"django/forms/default.html"`` and
+ ``"django/forms/formsets/default.html"`` templates are removed.
+
+* The default form and formset rendering style is changed to the div-based.
diff --git a/tests/forms_tests/tests/__init__.py b/tests/forms_tests/tests/__init__.py
index 1878eaf6e5..193a7149a1 100644
--- a/tests/forms_tests/tests/__init__.py
+++ b/tests/forms_tests/tests/__init__.py
@@ -11,8 +11,6 @@ except ImportError:
def jinja2_tests(test_func):
test_func = skipIf(jinja2 is None, "this test requires jinja2")(test_func)
return override_settings(
- # RemovedInDjango50Warning: When the deprecation ends, revert to
- # FORM_RENDERER="django.forms.renderers.Jinja2",
- FORM_RENDERER="django.forms.renderers.Jinja2DivFormRenderer",
+ FORM_RENDERER="django.forms.renderers.Jinja2",
TEMPLATES={"BACKEND": "django.template.backends.jinja2.Jinja2"},
)(test_func)
diff --git a/tests/forms_tests/tests/test_forms.py b/tests/forms_tests/tests/test_forms.py
index 930a200b14..14e3755b68 100644
--- a/tests/forms_tests/tests/test_forms.py
+++ b/tests/forms_tests/tests/test_forms.py
@@ -42,9 +42,8 @@ from django.forms.utils import ErrorList
from django.http import QueryDict
from django.template import Context, Template
from django.test import SimpleTestCase
-from django.test.utils import isolate_lru_cache, override_settings
+from django.test.utils import override_settings
from django.utils.datastructures import MultiValueDict
-from django.utils.deprecation import RemovedInDjango50Warning
from django.utils.safestring import mark_safe
from . import jinja2_tests
@@ -5084,16 +5083,3 @@ class OverrideTests(SimpleTestCase):
''
'',
)
-
-
-class DeprecationTests(SimpleTestCase):
- def test_warning(self):
- from django.forms.utils import DEFAULT_TEMPLATE_DEPRECATION_MSG
-
- with isolate_lru_cache(get_default_renderer), self.settings(
- FORM_RENDERER="django.forms.renderers.DjangoTemplates"
- ), self.assertRaisesMessage(
- RemovedInDjango50Warning, DEFAULT_TEMPLATE_DEPRECATION_MSG
- ):
- form = Person()
- str(form)
diff --git a/tests/forms_tests/tests/test_formsets.py b/tests/forms_tests/tests/test_formsets.py
index f0e4b154b7..e2c695f0dc 100644
--- a/tests/forms_tests/tests/test_formsets.py
+++ b/tests/forms_tests/tests/test_formsets.py
@@ -23,12 +23,10 @@ from django.forms.formsets import (
all_valid,
formset_factory,
)
-from django.forms.renderers import TemplatesSetting, get_default_renderer
+from django.forms.renderers import TemplatesSetting
from django.forms.utils import ErrorList
from django.forms.widgets import HiddenInput
from django.test import SimpleTestCase
-from django.test.utils import isolate_lru_cache
-from django.utils.deprecation import RemovedInDjango50Warning
from . import jinja2_tests
@@ -1900,28 +1898,3 @@ class AllValidTests(SimpleTestCase):
]
self.assertEqual(formset1._errors, expected_errors)
self.assertEqual(formset2._errors, expected_errors)
-
-
-class DeprecationTests(SimpleTestCase):
- def test_warning(self):
- from django.forms.utils import DEFAULT_TEMPLATE_DEPRECATION_MSG
-
- with isolate_lru_cache(get_default_renderer), self.settings(
- FORM_RENDERER="django.forms.renderers.DjangoTemplates"
- ), self.assertRaisesMessage(
- RemovedInDjango50Warning, DEFAULT_TEMPLATE_DEPRECATION_MSG
- ):
- ChoiceFormSet = formset_factory(Choice)
- formset = ChoiceFormSet()
- str(formset)
-
- def test_no_management_form_warning(self):
- """
- Management forms are already rendered with the new div template.
- """
- with isolate_lru_cache(get_default_renderer), self.settings(
- FORM_RENDERER="django.forms.renderers.DjangoTemplates"
- ):
- ChoiceFormSet = formset_factory(Choice, formset=BaseFormSet)
- formset = ChoiceFormSet()
- str(formset.management_form)
diff --git a/tests/runtests.py b/tests/runtests.py
index b678988391..db873e2c3d 100755
--- a/tests/runtests.py
+++ b/tests/runtests.py
@@ -253,9 +253,6 @@ def setup_collect_tests(start_at, start_after, test_labels=None):
"fields.W907",
]
- # RemovedInDjango50Warning
- settings.FORM_RENDERER = "django.forms.renderers.DjangoDivFormRenderer"
-
# Load all the ALWAYS_INSTALLED_APPS.
django.setup()