Removed versionadded/changed annotations for 4.0.

This commit is contained in:
Carlton Gibson 2022-05-10 15:07:11 +02:00 committed by Carlton Gibson
parent d10e569ea5
commit ca1c3151c3
44 changed files with 0 additions and 316 deletions

View File

@ -239,8 +239,6 @@ All attributes can be set in your derived class and can be used in
.. attribute:: BaseCommand.suppressed_base_arguments .. attribute:: BaseCommand.suppressed_base_arguments
.. versionadded:: 4.0
The default command options to suppress in the help output. This should be The default command options to suppress in the help output. This should be
a set of option names (e.g. ``'--verbosity'``). The default values for the a set of option names (e.g. ``'--verbosity'``). The default values for the
suppressed options are still passed. suppressed options are still passed.

View File

@ -127,10 +127,6 @@ Python style
""" """
... ...
.. versionchanged:: 4.0.3
All Python code in Django was reformatted with `black`_.
.. _coding-style-imports: .. _coding-style-imports:
Imports Imports

View File

@ -94,10 +94,6 @@ Django's system checks are organized using the following tags:
Some checks may be registered with multiple tags. Some checks may be registered with multiple tags.
.. versionchanged:: 4.0
The ``files`` tag was added.
Core system checks Core system checks
================== ==================
@ -157,8 +153,6 @@ If you're using MySQL or MariaDB, the following checks will be performed:
Managing files Managing files
-------------- --------------
.. versionadded:: 4.0
The following checks verify your setup for :doc:`/topics/files`: The following checks verify your setup for :doc:`/topics/files`:
* **files.E001**: The :setting:`FILE_UPLOAD_TEMP_DIR` setting refers to the * **files.E001**: The :setting:`FILE_UPLOAD_TEMP_DIR` setting refers to the

View File

@ -285,8 +285,6 @@ editing content:
.. attribute:: form_class .. attribute:: form_class
.. versionadded:: 4.0
Inherited from :class:`~django.views.generic.edit.BaseDeleteView`. The Inherited from :class:`~django.views.generic.edit.BaseDeleteView`. The
form class that will be used to confirm the request. By default form class that will be used to confirm the request. By default
:class:`django.forms.Form`, resulting in an empty form that is always :class:`django.forms.Form`, resulting in an empty form that is always
@ -336,8 +334,3 @@ editing content:
* :class:`django.views.generic.edit.DeletionMixin` * :class:`django.views.generic.edit.DeletionMixin`
* :class:`django.views.generic.edit.FormMixin` * :class:`django.views.generic.edit.FormMixin`
* :class:`django.views.generic.detail.BaseDetailView` * :class:`django.views.generic.detail.BaseDetailView`
.. versionchanged:: 4.0
In older versions, ``BaseDeleteView`` does not inherit from
``FormMixin``.

View File

@ -55,10 +55,6 @@ system along with all the fields, properties, and methods available on it.
Relationships to other models appear as hyperlinks. Descriptions are pulled Relationships to other models appear as hyperlinks. Descriptions are pulled
from ``help_text`` attributes on fields or from docstrings on model methods. from ``help_text`` attributes on fields or from docstrings on model methods.
.. versionchanged:: 4.0
Older versions don't display model cached properties.
A model with useful documentation might look like this:: A model with useful documentation might look like this::
class BlogEntry(models.Model): class BlogEntry(models.Model):

View File

@ -1203,8 +1203,6 @@ subclass::
.. attribute:: ModelAdmin.search_help_text .. attribute:: ModelAdmin.search_help_text
.. versionadded:: 4.0
Set ``search_help_text`` to specify a descriptive text for the search box Set ``search_help_text`` to specify a descriptive text for the search box
which will be displayed below it. which will be displayed below it.
@ -1938,8 +1936,6 @@ templates used by the :class:`ModelAdmin` views:
.. method:: ModelAdmin.get_formset_kwargs(request, obj, inline, prefix) .. method:: ModelAdmin.get_formset_kwargs(request, obj, inline, prefix)
.. versionadded:: 4.0
A hook for customizing the keyword arguments passed to the constructor of a A hook for customizing the keyword arguments passed to the constructor of a
formset. For example, to pass ``request`` to formset forms:: formset. For example, to pass ``request`` to formset forms::
@ -2091,10 +2087,6 @@ forms or widgets depending on ``django.jQuery`` must specify
``js=['admin/js/jquery.init.js', …]`` when :ref:`declaring form media assets ``js=['admin/js/jquery.init.js', …]`` when :ref:`declaring form media assets
<assets-as-a-static-definition>`. <assets-as-a-static-definition>`.
.. versionchanged:: 4.0
jQuery was upgraded from 3.5.1 to 3.6.0.
The :class:`ModelAdmin` class requires jQuery by default, so there is no need The :class:`ModelAdmin` class requires jQuery by default, so there is no need
to add jQuery to your ``ModelAdmin``s list of media resources unless you have to add jQuery to your ``ModelAdmin``s list of media resources unless you have
a specific need. For example, if you require the jQuery library to be in the a specific need. For example, if you require the jQuery library to be in the
@ -2310,10 +2302,6 @@ The ``InlineModelAdmin`` class adds or customizes:
:attr:`.InlineModelAdmin.verbose_name` is defined, Django will use :attr:`.InlineModelAdmin.verbose_name` is defined, Django will use
:attr:`.InlineModelAdmin.verbose_name` + ``'s'``. :attr:`.InlineModelAdmin.verbose_name` + ``'s'``.
.. versionchanged:: 4.0
The fallback to :attr:`.InlineModelAdmin.verbose_name` was added.
.. attribute:: InlineModelAdmin.can_delete .. attribute:: InlineModelAdmin.can_delete
Specifies whether or not inline objects can be deleted in the inline. Specifies whether or not inline objects can be deleted in the inline.
@ -2895,10 +2883,6 @@ Templates can override or extend base admin templates as described in
* ``admin_url``: admin changelist URL for the model * ``admin_url``: admin changelist URL for the model
* ``add_url``: admin URL to add a new model instance * ``add_url``: admin URL to add a new model instance
.. versionchanged:: 4.0
The ``model`` variable for each model was added.
.. method:: AdminSite.get_app_list(request, app_label=None) .. method:: AdminSite.get_app_list(request, app_label=None)
Returns a list of applications from the :doc:`application registry Returns a list of applications from the :doc:`application registry

View File

@ -8,8 +8,6 @@ GeoDjango's admin site
``GISModelAdmin`` ``GISModelAdmin``
================= =================
.. versionadded:: 4.0
.. class:: GISModelAdmin .. class:: GISModelAdmin
.. attribute:: gis_widget .. attribute:: gis_widget

View File

@ -1160,10 +1160,6 @@ blue.
>>> rst.name # Stored in a random path in the vsimem filesystem. >>> rst.name # Stored in a random path in the vsimem filesystem.
'/vsimem/da300bdb-129d-49a8-b336-e410a9428dad' '/vsimem/da300bdb-129d-49a8-b336-e410a9428dad'
.. versionchanged:: 4.0
Creating rasters in any GDAL virtual filesystem was allowed.
.. attribute:: name .. attribute:: name
The name of the source which is equivalent to the input file path or the name The name of the source which is equivalent to the input file path or the name
@ -1822,8 +1818,6 @@ Here's how to create a raster and return it as a file in an
Using other Virtual Filesystems Using other Virtual Filesystems
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. versionadded:: 4.0
Depending on the local build of GDAL other virtual filesystems may be Depending on the local build of GDAL other virtual filesystems may be
supported. You can use them by prepending the provided path with the supported. You can use them by prepending the provided path with the
appropriate ``/vsi*/`` prefix. See the `GDAL Virtual Filesystems appropriate ``/vsi*/`` prefix. See the `GDAL Virtual Filesystems

View File

@ -13,8 +13,6 @@ These expressions are available from the
.. class:: ArraySubquery(queryset) .. class:: ArraySubquery(queryset)
.. versionadded:: 4.0
``ArraySubquery`` is a :class:`~django.db.models.Subquery` that uses the ``ArraySubquery`` is a :class:`~django.db.models.Subquery` that uses the
PostgreSQL ``ARRAY`` constructor to build a list of values from the queryset, PostgreSQL ``ARRAY`` constructor to build a list of values from the queryset,
which must use :meth:`.QuerySet.values` to return only a single column. which must use :meth:`.QuerySet.values` to return only a single column.

View File

@ -178,10 +178,6 @@ available from the ``django.contrib.postgres.indexes`` module.
creates an exclusion constraint on ``circle`` using ``circle_ops``. creates an exclusion constraint on ``circle`` using ``circle_ops``.
.. versionchanged:: 4.0
Support for functional unique constraints was added.
.. versionchanged:: 4.1 .. versionchanged:: 4.1
Support for exclusion constraints was added. Support for exclusion constraints was added.

View File

@ -27,8 +27,6 @@ The ``trigram_similar`` lookup can be used on
.. fieldlookup:: trigram_word_similar .. fieldlookup:: trigram_word_similar
.. versionadded:: 4.0
The ``trigram_word_similar`` lookup allows you to perform trigram word The ``trigram_word_similar`` lookup allows you to perform trigram word
similarity lookups using a dedicated PostgreSQL extension. It can be similarity lookups using a dedicated PostgreSQL extension. It can be
approximately understood as measuring the greatest number of trigrams shared approximately understood as measuring the greatest number of trigrams shared

View File

@ -186,8 +186,6 @@ database.
Adding constraints without enforcing validation Adding constraints without enforcing validation
=============================================== ===============================================
.. versionadded:: 4.0
PostgreSQL supports the ``NOT VALID`` option with the ``ADD CONSTRAINT`` PostgreSQL supports the ``NOT VALID`` option with the ``ADD CONSTRAINT``
statement to add check constraints without enforcing validation on existing statement to add check constraints without enforcing validation on existing
rows. This option is useful if you want to skip the potentially lengthy scan of rows. This option is useful if you want to skip the potentially lengthy scan of

View File

@ -318,8 +318,6 @@ Usage example::
``TrigramWordSimilarity`` ``TrigramWordSimilarity``
------------------------- -------------------------
.. versionadded:: 4.0
.. class:: TrigramWordSimilarity(string, expression, **extra) .. class:: TrigramWordSimilarity(string, expression, **extra)
Accepts a string or expression, and a field name or expression. Returns the Accepts a string or expression, and a field name or expression. Returns the
@ -358,8 +356,6 @@ Usage example::
``TrigramWordDistance`` ``TrigramWordDistance``
----------------------- -----------------------
.. versionadded:: 4.0
.. class:: TrigramWordDistance(string, expression, **extra) .. class:: TrigramWordDistance(string, expression, **extra)
Accepts a string or expression, and a field name or expression. Returns the Accepts a string or expression, and a field name or expression. Returns the

View File

@ -325,12 +325,6 @@ argument. For example::
manifest_storage = StaticFilesStorage(location=settings.BASE_DIR) manifest_storage = StaticFilesStorage(location=settings.BASE_DIR)
super().__init__(*args, manifest_storage=manifest_storage, **kwargs) super().__init__(*args, manifest_storage=manifest_storage, **kwargs)
.. versionchanged:: 4.0
Support for finding paths in JavaScript source map comments was added.
The ``manifest_storage`` argument was added.
.. versionchanged:: 4.1 .. versionchanged:: 4.1
Support for finding paths in CSS source map comments was added. Support for finding paths in CSS source map comments was added.
@ -397,10 +391,6 @@ hashing algorithm.
Use this mixin with a custom storage to append the MD5 hash of the file's Use this mixin with a custom storage to append the MD5 hash of the file's
content to the filename as :class:`~storage.ManifestStaticFilesStorage` does. content to the filename as :class:`~storage.ManifestStaticFilesStorage` does.
.. versionchanged:: 4.0
The ``manifest_storage`` argument was added.
Finders Module Finders Module
============== ==============

View File

@ -82,10 +82,6 @@ The CSRF protection is based on the following things:
Expanding the accepted referers beyond the current host or cookie domain can Expanding the accepted referers beyond the current host or cookie domain can
be done with the :setting:`CSRF_TRUSTED_ORIGINS` setting. be done with the :setting:`CSRF_TRUSTED_ORIGINS` setting.
.. versionadded:: 4.0
``Origin`` checking was added, as described above.
.. versionchanged:: 4.1 .. versionchanged:: 4.1
In older versions, the CSRF cookie value was masked. In older versions, the CSRF cookie value was masked.

View File

@ -160,11 +160,6 @@ password from the `password file`_, you must specify them in the
.. _connection service file: https://www.postgresql.org/docs/current/libpq-pgservice.html .. _connection service file: https://www.postgresql.org/docs/current/libpq-pgservice.html
.. _password file: https://www.postgresql.org/docs/current/libpq-pgpass.html .. _password file: https://www.postgresql.org/docs/current/libpq-pgpass.html
.. versionchanged:: 4.0
Support for connecting by a service name, and specifying a password file
was added.
.. warning:: .. warning::
Using a service name for testing purposes is not supported. This Using a service name for testing purposes is not supported. This

View File

@ -1027,10 +1027,6 @@ multithreaded by default.
Uses IPv6 for the development server. This changes the default IP address from Uses IPv6 for the development server. This changes the default IP address from
``127.0.0.1`` to ``::1``. ``127.0.0.1`` to ``::1``.
.. versionchanged:: 4.0
Support for the ``--skip-checks`` option was added.
Examples of using different ports and addresses Examples of using different ports and addresses
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@ -1326,8 +1322,6 @@ empty list.
.. django-admin-option:: --exclude DIRECTORIES, -x DIRECTORIES .. django-admin-option:: --exclude DIRECTORIES, -x DIRECTORIES
.. versionadded:: 4.0
Specifies which directories in the app template should be excluded, in addition Specifies which directories in the app template should be excluded, in addition
to ``.git`` and ``__pycache__``. If this option is not provided, directories to ``.git`` and ``__pycache__``. If this option is not provided, directories
named ``__pycache__`` or starting with ``.`` will be excluded. named ``__pycache__`` or starting with ``.`` will be excluded.
@ -1403,8 +1397,6 @@ empty list.
.. django-admin-option:: --exclude DIRECTORIES, -x DIRECTORIES .. django-admin-option:: --exclude DIRECTORIES, -x DIRECTORIES
.. versionadded:: 4.0
Specifies which directories in the project template should be excluded, in Specifies which directories in the project template should be excluded, in
addition to ``.git`` and ``__pycache__``. If this option is not provided, addition to ``.git`` and ``__pycache__``. If this option is not provided,
directories named ``__pycache__`` or starting with ``.`` will be excluded. directories named ``__pycache__`` or starting with ``.`` will be excluded.
@ -1463,8 +1455,6 @@ before running the test suite.
.. django-admin-option:: --shuffle [SEED] .. django-admin-option:: --shuffle [SEED]
.. versionadded:: 4.0
Randomizes the order of tests before running them. This can help detect tests Randomizes the order of tests before running them. This can help detect tests
that aren't properly isolated. The test order generated by this option is a that aren't properly isolated. The test order generated by this option is a
deterministic function of the integer seed given. When no seed is passed, a deterministic function of the integer seed given. When no seed is passed, a
@ -1548,10 +1538,6 @@ don't.
in order to exchange them between processes. See in order to exchange them between processes. See
:ref:`python:pickle-picklable` for details. :ref:`python:pickle-picklable` for details.
.. versionchanged:: 4.0
Support for the value ``auto`` was added.
.. option:: --tag TAGS .. option:: --tag TAGS
Runs only tests :ref:`marked with the specified tags <topics-tagging-tests>`. Runs only tests :ref:`marked with the specified tags <topics-tagging-tests>`.
@ -1559,10 +1545,6 @@ May be specified multiple times and combined with :option:`test --exclude-tag`.
Tests that fail to load are always considered matching. Tests that fail to load are always considered matching.
.. versionchanged:: 4.0
In older versions, tests that failed to load did not match tags.
.. option:: --exclude-tag EXCLUDE_TAGS .. option:: --exclude-tag EXCLUDE_TAGS
Excludes tests :ref:`marked with the specified tags <topics-tagging-tests>`. Excludes tests :ref:`marked with the specified tags <topics-tagging-tests>`.

View File

@ -529,8 +529,6 @@ attributes.
``template_name`` ``template_name``
~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~
.. versionadded:: 4.0
.. attribute:: Form.template_name .. attribute:: Form.template_name
The name of the template rendered if the form is cast into a string, e.g. via The name of the template rendered if the form is cast into a string, e.g. via
@ -549,8 +547,6 @@ class.
``render()`` ``render()``
~~~~~~~~~~~~ ~~~~~~~~~~~~
.. versionadded:: 4.0
.. method:: Form.render(template_name=None, context=None, renderer=None) .. method:: Form.render(template_name=None, context=None, renderer=None)
The render method is called by ``__str__`` as well as the The render method is called by ``__str__`` as well as the
@ -567,8 +563,6 @@ single call.
``get_context()`` ``get_context()``
~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~
.. versionadded:: 4.0
.. method:: Form.get_context() .. method:: Form.get_context()
Return the template context for rendering the form. Return the template context for rendering the form.
@ -583,8 +577,6 @@ The available context is:
``template_name_label`` ``template_name_label``
~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~
.. versionadded:: 4.0
.. attribute:: Form.template_name_label .. attribute:: Form.template_name_label
The template used to render a field's ``<label>``, used when calling The template used to render a field's ``<label>``, used when calling
@ -998,16 +990,12 @@ Customizing the error list format
.. attribute:: renderer .. attribute:: renderer
.. versionadded:: 4.0
Specifies the :doc:`renderer <renderers>` to use for ``ErrorList``. Specifies the :doc:`renderer <renderers>` to use for ``ErrorList``.
Defaults to ``None`` which means to use the default renderer Defaults to ``None`` which means to use the default renderer
specified by the :setting:`FORM_RENDERER` setting. specified by the :setting:`FORM_RENDERER` setting.
.. attribute:: template_name .. attribute:: template_name
.. versionadded:: 4.0
The name of the template used when calling ``__str__`` or The name of the template used when calling ``__str__`` or
:meth:`render`. By default this is :meth:`render`. By default this is
``'django/forms/errors/list/default.html'`` which is a proxy for the ``'django/forms/errors/list/default.html'`` which is a proxy for the
@ -1015,16 +1003,12 @@ Customizing the error list format
.. attribute:: template_name_text .. attribute:: template_name_text
.. versionadded:: 4.0
The name of the template used when calling :meth:`.as_text`. By default The name of the template used when calling :meth:`.as_text`. By default
this is ``'django/forms/errors/list/text.html'``. This template renders this is ``'django/forms/errors/list/text.html'``. This template renders
the errors as a list of bullet points. the errors as a list of bullet points.
.. attribute:: template_name_ul .. attribute:: template_name_ul
.. versionadded:: 4.0
The name of the template used when calling :meth:`.as_ul`. By default The name of the template used when calling :meth:`.as_ul`. By default
this is ``'django/forms/errors/list/ul.html'``. This template renders this is ``'django/forms/errors/list/ul.html'``. This template renders
the errors in ``<li>`` tags with a wrapping ``<ul>`` with the CSS the errors in ``<li>`` tags with a wrapping ``<ul>`` with the CSS
@ -1032,8 +1016,6 @@ Customizing the error list format
.. method:: get_context() .. method:: get_context()
.. versionadded:: 4.0
Return context for rendering of errors in a template. Return context for rendering of errors in a template.
The available context is: The available context is:
@ -1043,8 +1025,6 @@ Customizing the error list format
.. method:: render(template_name=None, context=None, renderer=None) .. method:: render(template_name=None, context=None, renderer=None)
.. versionadded:: 4.0
The render method is called by ``__str__`` as well as by the The render method is called by ``__str__`` as well as by the
:meth:`.as_ul` method. :meth:`.as_ul` method.
@ -1069,10 +1049,6 @@ Customizing the error list format
overriding the default template, see also overriding the default template, see also
:ref:`overriding-built-in-form-templates`. :ref:`overriding-built-in-form-templates`.
.. versionchanged:: 4.0
Rendering of :class:`ErrorList` was moved to the template engine.
.. deprecated:: 4.0 .. deprecated:: 4.0
The ability to return a ``str`` when calling the ``__str__`` method is The ability to return a ``str`` when calling the ``__str__`` method is
@ -1341,10 +1317,6 @@ Methods of ``BoundField``
overriding the default template, see also overriding the default template, see also
:ref:`overriding-built-in-form-templates`. :ref:`overriding-built-in-form-templates`.
.. versionchanged:: 4.0
The label is now rendered using the template engine.
.. versionchanged:: 4.1 .. versionchanged:: 4.1
The ``tag`` argument was added. The ``tag`` argument was added.

View File

@ -1350,11 +1350,6 @@ generating choices. See :ref:`iterating-relationship-choices` for details.
def label_from_instance(self, obj): def label_from_instance(self, obj):
return "My Object #%i" % obj.id return "My Object #%i" % obj.id
.. versionchanged:: 4.0
Support for containing ``%(value)s`` in the ``invalid_choice`` error
message was added.
``ModelMultipleChoiceField`` ``ModelMultipleChoiceField``
---------------------------- ----------------------------

View File

@ -16,7 +16,3 @@ Formset API reference. For introductory material about formsets, see the
Returns a ``FormSet`` class for the given ``form`` class. Returns a ``FormSet`` class for the given ``form`` class.
See :doc:`formsets </topics/forms/formsets>` for example usage. See :doc:`formsets </topics/forms/formsets>` for example usage.
.. versionchanged:: 4.0
The ``renderer`` argument was added.

View File

@ -72,10 +72,6 @@ Model Form API reference. For introductory material about model forms, see the
See :ref:`model-formsets` for example usage. See :ref:`model-formsets` for example usage.
.. versionchanged:: 4.0
The ``renderer`` argument was added.
.. versionchanged:: 4.1 .. versionchanged:: 4.1
The ``edit_only`` argument was added. The ``edit_only`` argument was added.
@ -94,10 +90,6 @@ Model Form API reference. For introductory material about model forms, see the
See :ref:`inline-formsets` for example usage. See :ref:`inline-formsets` for example usage.
.. versionchanged:: 4.0
The ``renderer`` argument was added.
.. versionchanged:: 4.1 .. versionchanged:: 4.1
The ``edit_only`` argument was added. The ``edit_only`` argument was added.

View File

@ -182,8 +182,6 @@ needs can be located.
Context available in formset templates Context available in formset templates
====================================== ======================================
.. versionadded:: 4.0
Formset templates receive a context from :meth:`.BaseFormSet.get_context`. By Formset templates receive a context from :meth:`.BaseFormSet.get_context`. By
default, formsets receive a dictionary with the following values: default, formsets receive a dictionary with the following values:
@ -192,8 +190,6 @@ default, formsets receive a dictionary with the following values:
Context available in form templates Context available in form templates
=================================== ===================================
.. versionadded:: 4.0
Form templates receive a context from :meth:`.Form.get_context`. By default, Form templates receive a context from :meth:`.Form.get_context`. By default,
forms receive a dictionary with the following values: forms receive a dictionary with the following values:
@ -224,8 +220,6 @@ defines ``widget['subwidgets']`` for looping purposes.
Overriding built-in formset templates Overriding built-in formset templates
===================================== =====================================
.. versionadded:: 4.0
:attr:`.BaseFormSet.template_name` :attr:`.BaseFormSet.template_name`
To override formset templates, you must use the :class:`TemplatesSetting` To override formset templates, you must use the :class:`TemplatesSetting`
@ -237,8 +231,6 @@ renderer. Then overriding widget templates works :doc:`the same as
Overriding built-in form templates Overriding built-in form templates
================================== ==================================
.. versionadded:: 4.0
:attr:`.Form.template_name` :attr:`.Form.template_name`
To override form templates, you must use the :class:`TemplatesSetting` To override form templates, you must use the :class:`TemplatesSetting`

View File

@ -725,11 +725,6 @@ that specifies the template used to render each choice. For example, for the
... ...
</div> </div>
.. versionchanged:: 4.0
So they are announced more concisely by screen readers, radio buttons
were changed to render in ``<div>`` tags.
For more granular control over the generated markup, you can loop over the For more granular control over the generated markup, you can loop over the
radio buttons in the template. Assuming a form ``myform`` with a field radio buttons in the template. Assuming a form ``myform`` with a field
``beatles`` that uses a ``RadioSelect`` as its widget: ``beatles`` that uses a ``RadioSelect`` as its widget:
@ -836,11 +831,6 @@ that specifies the template used to render each choice. For example, for the
The outer ``<div>`` container receives the ``id`` attribute of the widget, The outer ``<div>`` container receives the ``id`` attribute of the widget,
if defined, or :attr:`BoundField.auto_id` otherwise. if defined, or :attr:`BoundField.auto_id` otherwise.
.. versionchanged:: 4.0
So they are announced more concisely by screen readers, checkboxes were
changed to render in ``<div>`` tags.
Like :class:`RadioSelect`, you can loop over the individual checkboxes for the Like :class:`RadioSelect`, you can loop over the individual checkboxes for the
widget's choices. Unlike :class:`RadioSelect`, the checkboxes won't include the widget's choices. Unlike :class:`RadioSelect`, the checkboxes won't include the
``required`` HTML attribute if the field is required because browser validation ``required`` HTML attribute if the field is required because browser validation

View File

@ -200,10 +200,6 @@ This logging does not include framework-level initialization (e.g.
``COMMIT``, and ``ROLLBACK``). Turn on query logging in your database if you ``COMMIT``, and ``ROLLBACK``). Turn on query logging in your database if you
wish to view all database queries. wish to view all database queries.
.. versionchanged:: 4.0
The database ``alias`` was added to log messages.
.. _django-security-logger: .. _django-security-logger:
``django.security.*`` ``django.security.*``

View File

@ -355,8 +355,6 @@ this setting are:
Cross-Origin Opener Policy Cross-Origin Opener Policy
~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~
.. versionadded:: 4.0
Some browsers have the ability to isolate top-level windows from other Some browsers have the ability to isolate top-level windows from other
documents by putting them in a separate browsing context group based on the documents by putting them in a separate browsing context group based on the
value of the `Cross-Origin Opener Policy`__ (COOP) header. If a document that value of the `Cross-Origin Opener Policy`__ (COOP) header. If a document that

View File

@ -48,10 +48,6 @@ objects that have an ``output_field`` that is a
:class:`~django.db.models.BooleanField`. The result is provided using the :class:`~django.db.models.BooleanField`. The result is provided using the
``then`` keyword. ``then`` keyword.
.. versionchanged:: 4.0
Support for lookup expressions was added.
Some examples:: Some examples::
>>> from django.db.models import F, Q, When >>> from django.db.models import F, Q, When

View File

@ -118,8 +118,6 @@ ensures the age field is never less than 18.
.. attribute:: UniqueConstraint.expressions .. attribute:: UniqueConstraint.expressions
.. versionadded:: 4.0
Positional argument ``*expressions`` allows creating functional unique Positional argument ``*expressions`` allows creating functional unique
constraints on expressions and database functions. constraints on expressions and database functions.

View File

@ -1173,10 +1173,6 @@ It can also be registered as a transform. For example::
>>> # Get vectors whose round() is less than 20 >>> # Get vectors whose round() is less than 20
>>> vectors = Vector.objects.filter(x__round__lt=20, y__round__lt=20) >>> vectors = Vector.objects.filter(x__round__lt=20, y__round__lt=20)
.. versionchanged:: 4.0
The ``precision`` argument was added.
``Sign`` ``Sign``
-------- --------

View File

@ -416,8 +416,6 @@ The ``Aggregate`` API is as follows:
.. attribute:: empty_result_set_value .. attribute:: empty_result_set_value
.. versionadded:: 4.0
Defaults to ``None`` since most aggregate functions result in ``NULL`` Defaults to ``None`` since most aggregate functions result in ``NULL``
when applied to an empty result set. when applied to an empty result set.
@ -455,10 +453,6 @@ grouping) contains no entries.
The ``**extra`` kwargs are ``key=value`` pairs that can be interpolated The ``**extra`` kwargs are ``key=value`` pairs that can be interpolated
into the ``template`` attribute. into the ``template`` attribute.
.. versionchanged:: 4.0
The ``default`` argument was added.
Creating your own Aggregate Functions Creating your own Aggregate Functions
------------------------------------- -------------------------------------
@ -963,8 +957,6 @@ calling the appropriate methods on the wrapped expression.
.. attribute:: empty_result_set_value .. attribute:: empty_result_set_value
.. versionadded:: 4.0
Tells Django which value should be returned when the expression is used Tells Django which value should be returned when the expression is used
to apply a function over an empty result set. Defaults to to apply a function over an empty result set. Defaults to
:py:data:`NotImplemented` which forces the expression to be computed on :py:data:`NotImplemented` which forces the expression to be computed on

View File

@ -218,8 +218,3 @@ following methods:
.. method:: process_rhs(compiler, connection) .. method:: process_rhs(compiler, connection)
Behaves the same way as :meth:`process_lhs`, for the right-hand side. Behaves the same way as :meth:`process_lhs`, for the right-hand side.
.. versionchanged:: 4.0
Support for using lookups in ``QuerySet`` annotations, aggregations,
and directly in filters was added.

View File

@ -1869,10 +1869,6 @@ raised if ``select_for_update()`` is used in autocommit mode.
PostgreSQL doesn't support ``select_for_update()`` with PostgreSQL doesn't support ``select_for_update()`` with
:class:`~django.db.models.expressions.Window` expressions. :class:`~django.db.models.expressions.Window` expressions.
.. versionchanged:: 4.0
The ``skip_locked`` argument was allowed on MariaDB 10.6+.
``raw()`` ``raw()``
~~~~~~~~~ ~~~~~~~~~
@ -2331,10 +2327,6 @@ support it).
.. _MySQL documentation: https://dev.mysql.com/doc/refman/en/sql-mode.html#ignore-strict-comparison .. _MySQL documentation: https://dev.mysql.com/doc/refman/en/sql-mode.html#ignore-strict-comparison
.. _MariaDB documentation: https://mariadb.com/kb/en/ignore/ .. _MariaDB documentation: https://mariadb.com/kb/en/ignore/
.. versionchanged:: 4.0
Support for the fetching primary key attributes on SQLite 3.35+ was added.
.. versionchanged:: 4.1 .. versionchanged:: 4.1
The ``update_conflicts``, ``update_fields``, and ``unique_fields`` The ``update_conflicts``, ``update_fields``, and ``unique_fields``
@ -2364,10 +2356,6 @@ updated::
>>> Entry.objects.bulk_update(objs, ['headline']) >>> Entry.objects.bulk_update(objs, ['headline'])
2 2
.. versionchanged:: 4.0
The return value of the number of objects updated was added.
:meth:`.QuerySet.update` is used to save the changes, so this is more efficient :meth:`.QuerySet.update` is used to save the changes, so this is more efficient
than iterating through the list of models and calling ``save()`` on each of than iterating through the list of models and calling ``save()`` on each of
them, but it has a few caveats: them, but it has a few caveats:
@ -2778,8 +2766,6 @@ results and then checks if any were returned.
*Asynchronous version*: ``acontains()`` *Asynchronous version*: ``acontains()``
.. versionadded:: 4.0
Returns ``True`` if the :class:`.QuerySet` contains ``obj``, and ``False`` if Returns ``True`` if the :class:`.QuerySet` contains ``obj``, and ``False`` if
not. This tries to perform the query in the simplest and fastest way possible. not. This tries to perform the query in the simplest and fastest way possible.
@ -3833,8 +3819,6 @@ example usage.
``default`` ``default``
~~~~~~~~~~~ ~~~~~~~~~~~
.. versionadded:: 4.0
An optional argument that allows specifying a value to use as a default value An optional argument that allows specifying a value to use as a default value
when the queryset (or grouping) contains no entries. when the queryset (or grouping) contains no entries.

View File

@ -159,10 +159,6 @@ You can use a cache backend that doesn't ship with Django by setting
:setting:`BACKEND <CACHES-BACKEND>` to a fully-qualified path of a cache :setting:`BACKEND <CACHES-BACKEND>` to a fully-qualified path of a cache
backend class (i.e. ``mypackage.backends.whatever.WhateverCache``). backend class (i.e. ``mypackage.backends.whatever.WhateverCache``).
.. versionchanged:: 4.0
The ``RedisCache`` backend was added.
.. setting:: CACHES-KEY_FUNCTION .. setting:: CACHES-KEY_FUNCTION
``KEY_FUNCTION`` ``KEY_FUNCTION``
@ -494,13 +490,6 @@ The setting also supports subdomains, so you could add
``'https://*.example.com'``, for example, to allow access from all subdomains ``'https://*.example.com'``, for example, to allow access from all subdomains
of ``example.com``. of ``example.com``.
.. versionchanged:: 4.0
The values in older versions must only include the hostname (possibly with
a leading dot) and not the scheme or an asterisk.
Also, ``Origin`` header checking isn't performed in older versions.
.. setting:: DATABASES .. setting:: DATABASES
``DATABASES`` ``DATABASES``
@ -2355,8 +2344,6 @@ already have it.
``SECURE_CROSS_ORIGIN_OPENER_POLICY`` ``SECURE_CROSS_ORIGIN_OPENER_POLICY``
------------------------------------- -------------------------------------
.. versionadded:: 4.0
Default: ``'same-origin'`` Default: ``'same-origin'``
Unless set to ``None``, the Unless set to ``None``, the
@ -2841,8 +2828,6 @@ the correct environment.
``USE_DEPRECATED_PYTZ`` ``USE_DEPRECATED_PYTZ``
----------------------- -----------------------
.. versionadded:: 4.0
Default: ``False`` Default: ``False``
A boolean that specifies whether to use ``pytz``, rather than :mod:`zoneinfo`, A boolean that specifies whether to use ``pytz``, rather than :mod:`zoneinfo`,
@ -2885,10 +2870,6 @@ dates using the format of the current locale.
See also :setting:`LANGUAGE_CODE`, :setting:`USE_I18N` and :setting:`USE_TZ`. See also :setting:`LANGUAGE_CODE`, :setting:`USE_I18N` and :setting:`USE_TZ`.
.. versionchanged:: 4.0
In older versions, the default value is ``False``.
.. deprecated:: 4.0 .. deprecated:: 4.0
This setting is deprecated. Starting with Django 5.0, localized formatting This setting is deprecated. Starting with Django 5.0, localized formatting

View File

@ -437,8 +437,6 @@ Arguments sent with this signal:
superuser when ``interactive`` is ``True``. superuser when ``interactive`` is ``True``.
``stdout`` ``stdout``
.. versionadded:: 4.0
A stream-like object where verbose output should be redirected. A stream-like object where verbose output should be redirected.
``using`` ``using``
@ -496,8 +494,6 @@ Arguments sent with this signal:
superuser when ``interactive`` is ``True``. superuser when ``interactive`` is ``True``.
``stdout`` ``stdout``
.. versionadded:: 4.0
A stream-like object where verbose output should be redirected. A stream-like object where verbose output should be redirected.
``using`` ``using``

View File

@ -1764,13 +1764,6 @@ locale is ``pl`` (Polish):
Using ``floatformat`` with no argument is equivalent to using ``floatformat`` Using ``floatformat`` with no argument is equivalent to using ``floatformat``
with an argument of ``-1``. with an argument of ``-1``.
.. versionchanged:: 4.0
``floatformat`` template filter no longer depends on the
:setting:`USE_L10N` setting and always returns localized output.
The ``u`` suffix to force disabling localization was added.
.. templatefilter:: force_escape .. templatefilter:: force_escape
``force_escape`` ``force_escape``

View File

@ -1006,8 +1006,6 @@ implementation details see :ref:`using-the-views`.
.. attribute:: next_page .. attribute:: next_page
.. versionadded:: 4.0
The URL to redirect to after login. Defaults to The URL to redirect to after login. Defaults to
:setting:`LOGIN_REDIRECT_URL`. :setting:`LOGIN_REDIRECT_URL`.
@ -1055,8 +1053,6 @@ implementation details see :ref:`using-the-views`.
.. method:: get_default_redirect_url() .. method:: get_default_redirect_url()
.. versionadded:: 4.0
Returns the URL to redirect to after login. The default implementation Returns the URL to redirect to after login. The default implementation
resolves and returns :attr:`next_page` if set, or resolves and returns :attr:`next_page` if set, or
:setting:`LOGIN_REDIRECT_URL` otherwise. :setting:`LOGIN_REDIRECT_URL` otherwise.

View File

@ -149,8 +149,6 @@ algorithm.
Using ``scrypt`` with Django Using ``scrypt`` with Django
---------------------------- ----------------------------
.. versionadded:: 4.0
scrypt_ is similar to PBKDF2 and bcrypt in utilizing a set number of iterations scrypt_ is similar to PBKDF2 and bcrypt in utilizing a set number of iterations
to slow down brute-force attacks. However, because PBKDF2 and bcrypt do not to slow down brute-force attacks. However, because PBKDF2 and bcrypt do not
require a lot of memory, attackers with sufficient resources can launch require a lot of memory, attackers with sufficient resources can launch
@ -279,8 +277,6 @@ follows:
``scrypt`` ``scrypt``
~~~~~~~~~~ ~~~~~~~~~~
.. versionadded:: 4.0
scrypt_ has the following attributes that can be customized: scrypt_ has the following attributes that can be customized:
#. ``work_factor`` controls the number of iterations within the hash. #. ``work_factor`` controls the number of iterations within the hash.

View File

@ -163,8 +163,6 @@ particularly temporary.
Redis Redis
----- -----
.. versionadded:: 4.0
Redis__ is an in-memory database that can be used for caching. To begin you'll Redis__ is an in-memory database that can be used for caching. To begin you'll
need a Redis server running either locally or on a remote machine. need a Redis server running either locally or on a remote machine.
@ -1074,10 +1072,6 @@ the cache backend.
``cache.aadd()`` or ``cache.adelete_many()``. See `Asynchronous support`_ ``cache.aadd()`` or ``cache.adelete_many()``. See `Asynchronous support`_
for more details. for more details.
.. versionchanged:: 4.0
The async variants of methods were added to the ``BaseCache``.
.. _cache_key_prefixing: .. _cache_key_prefixing:
Cache key prefixing Cache key prefixing
@ -1209,8 +1203,6 @@ instance, to do this for the ``locmem`` backend, put this code in a module::
Asynchronous support Asynchronous support
==================== ====================
.. versionadded:: 4.0
Django has developing support for asynchronous cache backends, but does not Django has developing support for asynchronous cache backends, but does not
yet support asynchronous caching. It will be coming in a future release. yet support asynchronous caching. It will be coming in a future release.

View File

@ -378,10 +378,6 @@ help distinguish them from form-specific errors. For example,
<li>Articles in a set must have distinct titles.</li> <li>Articles in a set must have distinct titles.</li>
</ul> </ul>
.. versionchanged:: 4.0
The additional ``nonform`` class was added.
Validating the number of forms in a formset Validating the number of forms in a formset
=========================================== ===========================================
@ -654,8 +650,6 @@ control the widget used with
``deletion_widget`` ``deletion_widget``
^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^
.. versionadded:: 4.0
.. attribute:: BaseFormSet.deletion_widget .. attribute:: BaseFormSet.deletion_widget
Default: :class:`~django.forms.CheckboxInput` Default: :class:`~django.forms.CheckboxInput`
@ -673,8 +667,6 @@ Set ``deletion_widget`` to specify the widget class to be used with
``get_deletion_widget`` ``get_deletion_widget``
^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^
.. versionadded:: 4.0
.. method:: BaseFormSet.get_deletion_widget() .. method:: BaseFormSet.get_deletion_widget()
Override ``get_deletion_widget()`` if you need to provide a widget instance for Override ``get_deletion_widget()`` if you need to provide a widget instance for
@ -791,16 +783,12 @@ Formsets have the following attributes and methods associated with rendering:
.. attribute:: BaseFormSet.renderer .. attribute:: BaseFormSet.renderer
.. versionadded:: 4.0
Specifies the :doc:`renderer </ref/forms/renderers>` to use for the Specifies the :doc:`renderer </ref/forms/renderers>` to use for the
formset. Defaults to the renderer specified by the :setting:`FORM_RENDERER` formset. Defaults to the renderer specified by the :setting:`FORM_RENDERER`
setting. setting.
.. attribute:: BaseFormSet.template_name .. attribute:: BaseFormSet.template_name
.. versionadded:: 4.0
The name of the template rendered if the formset is cast into a string, The name of the template rendered if the formset is cast into a string,
e.g. via ``print(formset)`` or in a template via ``{{ formset }}``. e.g. via ``print(formset)`` or in a template via ``{{ formset }}``.
@ -830,8 +818,6 @@ Formsets have the following attributes and methods associated with rendering:
.. attribute:: BaseFormSet.template_name_p .. attribute:: BaseFormSet.template_name_p
.. versionadded:: 4.0
The name of the template used when calling :meth:`.as_p`. By default this The name of the template used when calling :meth:`.as_p`. By default this
is ``"django/forms/formsets/p.html"``. This template renders the formset's is ``"django/forms/formsets/p.html"``. This template renders the formset's
management form and then each form in the formset as per the form's management form and then each form in the formset as per the form's
@ -839,8 +825,6 @@ Formsets have the following attributes and methods associated with rendering:
.. attribute:: BaseFormSet.template_name_table .. attribute:: BaseFormSet.template_name_table
.. versionadded:: 4.0
The name of the template used when calling :meth:`.as_table`. By default The name of the template used when calling :meth:`.as_table`. By default
this is ``"django/forms/formsets/table.html"``. This template renders the this is ``"django/forms/formsets/table.html"``. This template renders the
formset's management form and then each form in the formset as per the formset's management form and then each form in the formset as per the
@ -848,8 +832,6 @@ Formsets have the following attributes and methods associated with rendering:
.. attribute:: BaseFormSet.template_name_ul .. attribute:: BaseFormSet.template_name_ul
.. versionadded:: 4.0
The name of the template used when calling :meth:`.as_ul`. By default this The name of the template used when calling :meth:`.as_ul`. By default this
is ``"django/forms/formsets/ul.html"``. This template renders the formset's is ``"django/forms/formsets/ul.html"``. This template renders the formset's
management form and then each form in the formset as per the form's management form and then each form in the formset as per the form's
@ -857,8 +839,6 @@ Formsets have the following attributes and methods associated with rendering:
.. method:: BaseFormSet.get_context() .. method:: BaseFormSet.get_context()
.. versionadded:: 4.0
Returns the context for rendering a formset in a template. Returns the context for rendering a formset in a template.
The available context is: The available context is:
@ -867,8 +847,6 @@ Formsets have the following attributes and methods associated with rendering:
.. method:: BaseFormSet.render(template_name=None, context=None, renderer=None) .. method:: BaseFormSet.render(template_name=None, context=None, renderer=None)
.. versionadded:: 4.0
The render method is called by ``__str__`` as well as the :meth:`.as_p`, The render method is called by ``__str__`` as well as the :meth:`.as_p`,
:meth:`.as_ul`, and :meth:`.as_table` methods. All arguments are optional :meth:`.as_ul`, and :meth:`.as_table` methods. All arguments are optional
and will default to: and will default to:
@ -940,10 +918,6 @@ and ``as_ul`` being available. The rendering of the formset can be customized
by specifying the ``template_name`` attribute, or more generally by by specifying the ``template_name`` attribute, or more generally by
:ref:`overriding the default template <overriding-built-in-formset-templates>`. :ref:`overriding the default template <overriding-built-in-formset-templates>`.
.. versionchanged:: 4.0
Rendering of formsets was moved to the template engine.
.. _manually-rendered-can-delete-and-can-order: .. _manually-rendered-can-delete-and-can-order:
Manually rendered ``can_delete`` and ``can_order`` Manually rendered ``can_delete`` and ``can_order``

View File

@ -552,10 +552,6 @@ the :meth:`.Form.render`. Here's an example of this being used in a view::
See :ref:`ref-forms-api-outputting-html` for more details. See :ref:`ref-forms-api-outputting-html` for more details.
.. versionchanged:: 4.0
Template rendering of forms was added.
.. versionchanged:: 4.1 .. versionchanged:: 4.1
The ability to set the default ``form_template_name`` on the form renderer The ability to set the default ``form_template_name`` on the form renderer

View File

@ -35,12 +35,6 @@ Time zone support uses :mod:`zoneinfo`, which is part of the Python standard
library from Python 3.9. The ``backports.zoneinfo`` package is automatically library from Python 3.9. The ``backports.zoneinfo`` package is automatically
installed alongside Django if you are using Python 3.8. installed alongside Django if you are using Python 3.8.
.. versionchanged:: 4.0
:mod:`zoneinfo` was made the default timezone implementation. You may
continue to use `pytz`_ during the 4.x release cycle via the
:setting:`USE_DEPRECATED_PYTZ` setting.
.. note:: .. note::
The default :file:`settings.py` file created by :djadmin:`django-admin The default :file:`settings.py` file created by :djadmin:`django-admin

View File

@ -216,8 +216,6 @@ security middleware reference <referrer-policy>` for details.
Cross-origin opener policy Cross-origin opener policy
========================== ==========================
.. versionadded:: 4.0
The cross-origin opener policy (COOP) header allows browsers to isolate a The cross-origin opener policy (COOP) header allows browsers to isolate a
top-level window from other documents by putting them in a different context top-level window from other documents by putting them in a different context
group so that they cannot directly interact with the top-level window. If a group so that they cannot directly interact with the top-level window. If a

View File

@ -600,10 +600,6 @@ and tear down the test suite.
custom arguments by calling ``parser.add_argument()`` inside the method, so custom arguments by calling ``parser.add_argument()`` inside the method, so
that the :djadmin:`test` command will be able to use those arguments. that the :djadmin:`test` command will be able to use those arguments.
.. versionadded:: 4.0
The ``logger`` and ``shuffle`` arguments were added.
Attributes Attributes
~~~~~~~~~~ ~~~~~~~~~~
@ -725,8 +721,6 @@ Methods
.. method:: DiscoverRunner.log(msg, level=None) .. method:: DiscoverRunner.log(msg, level=None)
.. versionadded:: 4.0
If a ``logger`` is set, logs the message at the given integer If a ``logger`` is set, logs the message at the given integer
`logging level`_ (e.g. ``logging.DEBUG``, ``logging.INFO``, or `logging level`_ (e.g. ``logging.DEBUG``, ``logging.INFO``, or
``logging.WARNING``). Otherwise, the message is printed to the console, ``logging.WARNING``). Otherwise, the message is printed to the console,
@ -779,10 +773,6 @@ utility methods in the ``django.test.utils`` module.
:ref:`serialized_rollback <test-case-serialized-rollback>` feature. If :ref:`serialized_rollback <test-case-serialized-rollback>` feature. If
it's not provided, it defaults to ``aliases``. it's not provided, it defaults to ``aliases``.
.. versionchanged:: 4.0
The ``serialized_aliases`` kwarg was added.
.. function:: teardown_databases(old_config, parallel=0, keepdb=False) .. function:: teardown_databases(old_config, parallel=0, keepdb=False)
Destroys the test databases, restoring pre-test conditions. Destroys the test databases, restoring pre-test conditions.

View File

@ -239,11 +239,6 @@ You may randomize and/or reverse the execution order inside groups using the
:option:`test --shuffle` and :option:`--reverse <test --reverse>` options. This :option:`test --shuffle` and :option:`--reverse <test --reverse>` options. This
can help with ensuring your tests are independent from each other. can help with ensuring your tests are independent from each other.
.. versionchanged:: 4.0
In older versions, failures detected when loading tests were not ordered
first.
.. _test-case-serialized-rollback: .. _test-case-serialized-rollback:
Rollback emulation Rollback emulation

View File

@ -906,11 +906,6 @@ It also provides an additional method:
self.assertEqual(mail.outbox[0].subject, 'Contact Form') self.assertEqual(mail.outbox[0].subject, 'Contact Form')
self.assertEqual(mail.outbox[0].body, 'I like your site') self.assertEqual(mail.outbox[0].body, 'I like your site')
.. versionchanged:: 4.0
In older versions, new callbacks added while executing
:func:`.transaction.on_commit` callbacks were not captured.
.. _live-test-server: .. _live-test-server:
``LiveServerTestCase`` ``LiveServerTestCase``
@ -1650,12 +1645,6 @@ your test suite.
Output in case of error can be customized with the ``msg`` argument. Output in case of error can be customized with the ``msg`` argument.
.. versionchanged:: 4.0
In older versions, any attribute (not only boolean attributes) without
a value was considered equal to an attribute with the same name and
value.
.. method:: SimpleTestCase.assertHTMLNotEqual(html1, html2, msg=None) .. method:: SimpleTestCase.assertHTMLNotEqual(html1, html2, msg=None)
Asserts that the strings ``html1`` and ``html2`` are *not* equal. The Asserts that the strings ``html1`` and ``html2`` are *not* equal. The