4 de agosto de 2020
Bienvenido a Django 3.1!
Estas notas de lanzamiento cubren las nuevas características, así como algunos cambios que no son compatibles con la versión anterior (Cambios incompatibles con versiones anteriores en 3.1) que deseas estar al tanto cuando actualices desde Django 3.0 o una versión anterior. Hemos eliminado algunas características que han llegado a su fin de ciclo de deprecación, y hemos comenzado el proceso de deprecación para algunas características (Características obsoletas en 3.1).
Consulte la guía Cómo actualizar Django a una versión más reciente si estás actualizando un proyecto existente.
Django 3.1 admite Python 3.6, 3.7, 3.8 y 3.9 (a partir de 3.1.3). Muy recomendamos y solo oficialmente apoyamos la última versión de cada serie.
Django ahora admite un camino de solicitud completamente asíncrono, incluyendo:
Para empezar con vistas asíncronas, debes declarar una vista utilizando async def:
async def my_view(request):
await asyncio.sleep(0.5)
return HttpResponse("Hello, async world!")
Todas las características asíncronas están soportadas ya sea que estés ejecutando bajo modo WSGI o ASGI. Sin embargo, habrá penalizaciones de rendimiento al utilizar código asíncrono en modo WSGI. Puedes leer más sobre los detalles en la documentación Soporte asíncrono.
Estás libre para mezclar vistas, middleware y pruebas asíncronos con sincrónicas tanto como desees. Django asegurará que siempre termines con el contexto de ejecución correcto. Esperamos que la mayoría de los proyectos mantengan la mayoría de sus vistas sincrónicas y solo tengan un selecto grupo en modo asíncrono, pero es completamente tu elección.
La capa ORM, la capa de caché y otras piezas de código que realizan llamadas a red de larga duración no admiten aún el acceso asíncrono. Esperamos agregar soporte para ellas en próximas versiones. Las vistas asíncronas son ideales si estás haciendo muchas llamadas API o HTTP dentro de tu vista, ahora puedes realizar todas esas llamadas HTTP de manera nativa y paralela para acelerar considerablemente la ejecución de tu vista.
Los textos traducidos son:
Django incluye ahora el campo models.JSONField y el campo de formulario forms.JSONField que se pueden utilizar en todos los backends de base de datos admitidos. Ambos campos admiten el uso de codificadores y descodificadores JSON personalizados. El campo del modelo admite la introspección, consultas y transformaciones que anteriormente eran solo para PostgreSQL:
from django.db import models
class ContactInfo(models.Model):
data = models.JSONField()
ContactInfo.objects.create(
data={
"name": "John",
"cities": ["London", "Cambridge"],
"pets": {"dogs": ["Rufus", "Meg"]},
}
)
ContactInfo.objects.filter(
data__name="John",
data__pets__has_key="dogs",
data__cities__contains="London",
).delete()
Si tu proyecto utiliza django.contrib.postgres.fields.JSONField, así como el campo de formulario relacionado y las transformaciones, debes ajustar a utilizar los nuevos campos y generar y aplicar una migración de base de datos. Por ahora, los antiguos campos y transformaciones se dejan como referencia para los nuevos y están descontinuados desde esta versión.
DEFAULT_HASHING_ALGORITHM¶La nueva configuración transitoria DEFAULT_HASHING_ALGORITHM permite especificar el algoritmo de hashing por defecto para codificar cookies, tokens de restablecimiento de contraseña en la interfaz administrativa, sesiones de usuario y firmas creadas por django.core.signing.Signer y django.core.signing.dumps().
Se agregó soporte para SHA-256 en Django 3.1. Si estás actualizando varias instancias del mismo proyecto a Django 3.1, debes establecer DEFAULT_HASHING_ALGORITHM en 'sha1' durante la transición, para permitir compatibilidad con las versiones antiguas de Django. Ten en cuenta que esto requiere Django 3.1.1+. Una vez completada la transición a 3.1 puedes dejar de sobreescribir DEFAULT_HASHING_ALGORITHM.
Esta configuración está descontinuada desde esta versión, porque el soporte para tokens, cookies, sesiones y firmas que utilizan el algoritmo SHA-1 se eliminará en Django 4.0.
django.contrib.admin¶La nueva django.contrib.admin.EmptyFieldListFilter para ModelAdmin.list_filter permite filtrar por valores vacíos (cadenas vacías y nulos) en la vista de lista del administrador.
Los filtros en el lateral derecho de la vista de lista del administrador ahora contienen un enlace para borrar todos los filtros.
El admin ahora tiene un menú lateral en pantallas más grandes para una navegación más fácil. Está habilitado por defecto pero se puede deshabilitar utilizando un AdminSite personalizado y estableciendo AdminSite.enable_nav_sidebar a False.
La renderización del menú lateral requiere acceso al request actual para establecer las ventajas de CSS y el rol ARIA. Esto requiere utilizar 'django.template.context_processors.request' en la opción 'context_processors' de OPTIONS.
Los inlines vacíos extra pueden ahora ser eliminados, del mismo modo que los creados dinámicamente.
XRegExp se ha actualizado desde la versión 2.0.0 a la versión 3.2.0.
jQuery se ha actualizado desde la versión 3.4.1 a la versión 3.5.1.
La biblioteca Select2 se ha actualizado desde la versión 4.0.7 a la versión 4.0.13.
django.contrib.auth¶El recuento de iteraciones por defecto para el algoritmo de hash de contraseña PBKDF2 se ha aumentado de 180,000 a 216,000.
La nueva configuración PASSWORD_RESET_TIMEOUT permite definir el número de segundos que es válido un enlace de restablecimiento de contraseña. Se recomienda utilizar esta configuración en lugar de la descontinuada PASSWORD_RESET_TIMEOUT_DAYS, que se eliminará en Django 4.0.
El mecanismo de restablecimiento de contraseña ahora utiliza el algoritmo de hash SHA-256. El soporte para tokens que utilizan el antiguo algoritmo de hash permanece hasta Django 4.0.
La función AbstractBaseUser.get_session_auth_hash() ahora utiliza el algoritmo de hash SHA-256. El soporte para sesiones de usuario que utilizan el antiguo algoritmo de hash permanece hasta Django 4.0.
django.contrib.contenttypes¶La traducción de los textos es la siguiente:
django.contrib.gis¶Ahora se admite el lookup relate en MariaDB.
Se ha agregado la propiedad LinearRing.is_counterclockwise.
La clase AsGeoJSON ahora está soportada en Oracle.
Se ha agregado el soporte para PostGIS 3 y GDAL 3.
django.contrib.humanize¶El filtro de plantilla intword ahora admite números enteros negativos.
django.contrib.postgres¶La nueva clase BloomIndex permite crear índices bloom en la base de datos. La nueva operación de migración BloomExtension instala la extensión bloom para agregar soporte a este índice.
La función get_FOO_display() ahora admite ArrayField y RangeField.
Los nuevos rangefield.lower_inc, rangefield.lower_inf, rangefield.upper_inc, y rangefield.upper_inf lookups permiten consultar RangeField por un tipo de límite.
rangefield.contained_by ahora admite SmallAutoField, AutoField, BigAutoField, SmallIntegerField, y DecimalField.
SearchQuery ahora admite el tipo de búsqueda 'websearch' en PostgreSQL 11+.
SearchQuery.value ahora admite expresiones de consulta.
El nuevo SearchHeadline permite destacar los resultados de búsqueda.
search lookup ahora admite expresiones de consulta.
El nuevo parámetro cover_density de SearchRank permite ordenar por densidad de cubierta.
El nuevo parámetro normalization de SearchRank permite normalizar el rango.
El nuevo atributo ExclusionConstraint.deferrable permite crear exclusiones deferrables.
django.contrib.sesiones¶La configuración SESSION_COOKIE_SAMESITE ahora admite el valor 'None' (cadena) para expresar explícitamente que la cookie se envía con todas las solicitudes de mismo sitio y cruzadas.
django.contrib.archivos_estáticos¶La traducción de los textos es la siguiente:
El decorador cache_control() y el método patch_cache_control() ahora admiten múltiples nombres de campo en la directiva no-cache para el encabezado Cache-Control, según RFC 7234 Section 5.2.2.2.
La función delete() ahora devuelve True si se eliminó correctamente la clave, y False en caso contrario.
El parámetro CSRF_COOKIE_SAMESITE ahora permite el valor explícito de cadena 'None' para indicar que el cookie se envía con todas las solicitudes del mismo sitio y de sitios cruzados.
El parámetro RUTA_ARCHIVO_EMAIL utilizado por la referencia al backend de correo electrónico <topic-email-file-backend>, ahora admite pathlib.Path.
La clase django.views.debug.SafeExceptionReporterFilter ahora filtra valores sensibles desde request.META en informes de excepciones.
Las nuevas atributos SafeExceptionReporterFilter.cleansed_substitute y SafeExceptionReporterFilter.hidden_settings permiten la personalización de configuraciones sensibles y filtrado de request.META en informes de excepciones.
La vista técnica 404 de depuración ahora respeta el parámetro FILTRO_EXCEPCIONES_DEFECTO al aplicar el filtrado de configuraciones.
El nuevo parámetro EXCEPCION_REPORTER_DEFECTO permite proporcionar una clase heredada de django.views.debug.ExceptionReporter para personalizar la generación de informes de excepciones. Consulte <custom-error-reports> para obtener más detalles.
FileField y ImageField ahora aceptan una función llamable para storage. Esto te permite modificar el almacenamiento utilizado en tiempo de ejecución, seleccionando diferentes almacenamientos para diferentes entornos, por ejemplo.
La clase FileSystemStorage.save() ahora admite pathlib.Path.
La clase ModelChoiceIterator, utilizada por ModelChoiceField y ModelMultipleChoiceField, ahora utiliza ModelChoiceIteratorValue que se puede utilizar por widgets para acceder a instancias de modelos. Consulta la sección Iteración de opciones de relación para obtener más detalles.
La clase django.forms.DateTimeField ahora acepta fechas en un subconjunto de formatos de fecha y hora ISO 8601, incluyendo la zona horaria opcional, por ejemplo 2019-10-10T06:47, 2019-10-10T06:47:23+04:00 o 2019-10-10T06:47:23Z. La zona horaria siempre se retiene si se proporciona, con fechas y horas conscientes de la zona horaria devueltas incluso cuando USE_TZ es False.
Además, DateTimeField ahora utiliza DATE_INPUT_FORMATS además de DATETIME_INPUT_FORMATS al convertir una entrada de campo a un valor datetime.
La propiedad MultiWidget.widgets ahora acepta un diccionario que permite personalizar los atributos name de subwidgets.
La nueva propiedad BoundField.widget_type se puede utilizar para ajustar dinámicamente la renderización del formulario según el tipo de widget.
El parámetro de configuración LANGUAGE_COOKIE_SAMESITE ahora permite el valor 'None' (cadena) para expresar explícitamente que el cookie se envía con todas las solicitudes de mismo sitio y cruzadas entre sitios.
Se ha agregado soporte y traducciones para los idiomas árabe algerino, ibo, kirguís, tajiko y turcomano.
La nueva opción check --database permite especificar alias de bases de datos para ejecutar las comprobaciones del sistema de base de datos. Anteriormente estas comprobaciones estaban habilitadas para todas las configuraciones de DATABASES pasando la etiqueta database al comando.
La traducción de los textos es la siguiente:
El nuevo argumento returncode para CommandError permite personalizar el estado de salida para comandos de gestión.
El nuevo parámetro dbshell – ARGUMENTS <dbshell –> permite pasar argumentos adicionales al cliente de línea de comandos para la base de datos.
Los comandos flush y sqlflush ahora incluyen SQL para resetear secuencias en SQLite.
La nueva función ExtractIsoWeekDay extrae días de la semana ISO-8601 de DateField y DateTimeField, y el nuevo parámetro iso_week_day permite consultar por un día de la semana ISO-8601.
La función QuerySet.explain() ahora admite:
El formato TREE en MySQL 8.0.16+,
La opción analyze en MySQL 8.0.18+ y MariaDB.
Se ha agregado la clase PositiveBigIntegerField que actúa de manera similar a la clase PositiveIntegerField, excepto que solo permite valores bajo un límite (dependiente del motor de base de datos) determinado. Los valores desde 0 hasta 9223372036854775807 son seguros en todas las bases de datos admitidas por Django.
El nuevo parámetro RESTRICT para el argumento on_delete de la clase ForeignKey y OneToOneField emula el comportamiento del constraint SQL ON DELETE RESTRICT.
Ahora te dejo las traducciones de los textos originales.
Los métodos RelatedManager.add(), create() y set() ahora aceptan llamables como valores en el argumento through_defaults.
El nuevo parámetro is_dst de la QuerySet.datetimes() determina el tratamiento de las fechas inexistentes y ambiguas.
La nueva expresión bitxor() del objeto F permite realizar operaciones bitwise XOR <using-f-expressions-in-filters>.
El método QuerySet.bulk_create() ahora establece la clave primaria en los objetos cuando se utiliza MariaDB 10.5+.
El método DatabaseOperations.sql_flush() ahora genera SQL más eficiente en MySQL utilizando declaraciones DELETE en lugar de TRUNCATE para tablas que no requieren reiniciar secuencias.
Las funciones de SQLite están marcadas como deterministic en Python 3.8+. Esto permite utilizarlas en restricciones de verificación y índices parciales.
La nueva atributo deferrable del objeto UniqueConstraint permite crear restricciones únicas diferibles.
El objeto Paginator ahora puede ser iterado para producir sus páginas.
Si la configuración ALLOWED_HOSTS está vacía y DEBUG=True, se permiten subdominios de localhost en el encabezado Host, por ejemplo, static.localhost.
HttpResponse.set_cookie() y HttpResponse.set_signed_cookie() ahora permiten utilizar samesite='None' (cadena) para expresar explícitamente que el cookie se envía con todas las solicitudes de mismo sitio y cruzadas.
La nueva HttpRequest.accepts() método devuelve si la solicitud acepta el tipo MIME dado según el encabezado Accept HTTP.
La configuración SECURE_REFERRER_POLICY ahora tiene como valor por defecto 'same-origin'. Con esta configurada, SecurityMiddleware establece el encabezado de política de referenciador a same-origin en todas las respuestas que no ya lo tienen. Esto previene que se envíe el encabezado Referer a otros orígenes. Si necesitas el comportamiento anterior, configura explícitamente SECURE_REFERRER_POLICY a None.
El algoritmo por defecto de django.core.signing.Signer, django.core.signing.loads(), y django.core.signing.dumps() se cambia a SHA-256. El soporte para firmas hechas con el antiguo algoritmo SHA-1 sigue hasta Django 4.0.
También, el nuevo parámetro algorithm de la clase Signer permite personalizar el algoritmo de hash.
Los nuevos etiquetas de plantilla translate y blocktranslate se introducen para internacionalización en código de plantillas. Las antiguas etiquetas de plantilla trans y blocktrans siguen funcionando, y seguirán siendo compatibles durante un futuro predecible.
La etiqueta de plantilla include ahora acepta iterables de nombres de plantillas.
La clase SimpleTestCase ahora implementa el método debug() para permitir ejecutar una prueba sin recopilar el resultado y atrapar excepciones. Esto se puede utilizar para apoyar la ejecución de pruebas bajo un depurador.
La configuración MIGRATE del test database permite deshabilitar las migraciones durante la creación de un test database.
La clase DiscoverRunner puede descartar el resultado para pruebas pasadas utilizando la opción test --buffer.
DiscoverRunner ahora omite ejecutar las comprobaciones del sistema en bases de datos que no están referenciadas por pruebas.
La desmontaje de TransactionTestCase es ahora más rápida en MySQL debido a mejoras en el comando flush. Como efecto secundario, este último ya no resetea automáticamente las secuencias al desmontar. Habilita la propiedad TransactionTestCase.reset_sequences si tus pruebas requieren esta función.
Los conversores de ruta Path converters pueden ahora levantar ValueError en to_url() para indicar que no hay coincidencia al revertir URLs.
La función filepath_to_uri() ahora admite pathlib.Path.
La función parse_duration() ahora admite separadores de coma para fracciones decimales en el formato ISO 8601.
Las funciones parse_datetime(), parse_duration() y parse_time() ahora admiten separadores de coma para milisegundos.
El backend SQLite ahora admite pathlib.Path para la configuración NAME.
La generada por el comando startproject ahora utiliza pathlib.Path en lugar de os.path para construir rutas del sistema de archivos.
La configuración TIME_ZONE ahora está permitida en bases de datos que admiten zonas horarias.
Esta es la traducción de los textos:
Ahora los textos traducidos:
La propiedad connection.timezone ahora es 'UTC' por defecto, o la TIME_ZONE cuando USE_TZ es True en bases de datos que admiten zonas horarias. Anteriormente era None en bases de datos que admiten zonas horarias.
La propiedad connection._nodb_connection ha cambiado a la método connection._nodb_cursor() y ahora devuelve un administrador de contexto que produce una cursor y cierra automáticamente el cursor y la conexión al salir del bloque with.
DatabaseClient.runshell() ahora requiere un argumento adicional parameters como lista de argumentos adicionales para pasar a la cliente de línea de comandos.
El argumento posicional sequences de DatabaseOperations.sql_flush() se reemplaza por el argumento booleano solo palabra clave reset_sequences. Si es True, las secuencias de las tablas truncadas se resetearán.
El argumento allow_cascade de DatabaseOperations.sql_flush() ahora es un argumento solo palabra clave.
Se ha eliminado el argumento posicional using de DatabaseOperations.execute_sql_flush(). El método utiliza ahora la base de datos del objeto instanciado.
Las bases de datos de terceros deben implementar soporte para JSONField o establecer DatabaseFeatures.supports_json_field en False. Si no se admite el almacenamiento de primitivos, establezca DatabaseFeatures.supports_primitives_in_json_field en False. Si hay un verdadero tipo de campo JSON, establezca DatabaseFeatures.has_native_json_field en True. Si jsonfield.contains y jsonfield.contained_by no se admiten, establezca DatabaseFeatures.supports_json_field_contains en False.
Las bases de datos de terceros deben implementar introspección para JSONField o establecer can_introspect_json_field en False.
La compatibilidad de upstream con MariaDB 10.1 termina en octubre de 2020. Django 3.1 admite MariaDB 10.2 y superior.
contrib.admin¶El administrador ya no admite el navegador legado Internet Explorer. Consulte la FAQ del administrador para obtener detalles sobre los navegadores admitidos.
AbstractUser.first_name max_length aumentada a 150¶Se incluye una migración para django.contrib.auth.models.User.first_name. Si tienes un modelo de usuario personalizado que hereda de AbstractUser, necesitarás generar y aplicar una migración de base de datos para tu modelo de usuario.
Si deseas preservar la limitación de 30 caracteres para los nombres, utiliza un formulario personalizado:
from django import forms
from django.contrib.auth.forms import UserChangeForm
class MyUserChangeForm(UserChangeForm):
first_name = forms.CharField(max_length=30, required=False)
Si deseas mantener esta restricción en el administrador al editar usuarios, establece UserAdmin.form para usar este formulario:
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User
class MyUserAdmin(UserAdmin):
form = MyUserChangeForm
admin.site.unregister(User)
admin.site.register(User, MyUserAdmin)
Las claves de caché utilizadas por cache y generadas por make_template_fragment_key() son diferentes a las generadas por versiones anteriores de Django. Después de actualizar a Django 3.1, la primera solicitud a cualquier fragmento de plantilla previamente cacheado será un error de caché.
La lógica detrás de la decisión de devolver una respuesta de redirección o un código HTTP 204 desde la vista set_language() ahora se basa en el encabezado Accept HTTP en lugar de la presencia del encabezado X-Requested-With HTTP.
Se eliminan las importaciones de compatibilidad de django.core.exceptions.EmptyResultSet en django.db.models.query, django.db.models.sql y django.db.models.sql.datastructures.
Se elimina la importación de compatibilidad de django.core.exceptions.FieldDoesNotExist en django.db.models.fields.
Se eliminan las importaciones de compatibilidad de django.forms.utils.pretty_name() y django.forms.boundfield.BoundField en django.forms.forms.
Los cambios de compatibilidad en Context, ContextPopException y RequestContext en django.template.base se han eliminado.
La importación de compatibilidad de django.contrib.admin.helpers.ACTION_CHECKBOX_NAME en django.contrib.admin se ha eliminado.
Las configuraciones STATIC_URL y MEDIA_URL establecidas en rutas relativas ahora están prefijadas con el valor proporcionado por el servidor de SCRIPT_NAME (o / si no está definido). Este cambio no debería afectar las configuraciones establecidas en URLs válidas o caminos absolutos.
ConditionalGetMiddleware ya no agrega la cabecera ETag a las respuestas con un contenido vacío content.
El decorador de clase django.utils.decorators.classproperty() se ha hecho público y se ha movido a django.utils.functional.classproperty().
La plantilla de filtro floatformat ahora produce (positivos) 0 para números negativos que redondean a cero.
Las opciones Meta.ordering y Meta.unique_together en los modelos de módulos de django.contrib que eran tuplas ahora son listas.
El widget del calendario administrativo ahora maneja años de dos dígitos según la especificación de Open Group, es decir, valores entre 69 y 99 se mapean al siglo anterior y valores entre 0 y 68 se mapean al siglo actual.
Los formatos de fecha solo se han eliminado de la lista predeterminada para DATETIME_INPUT_FORMATS.
El widget FileInput ya no renderiza con el atributo HTML required cuando existen datos iniciales.
La traducción de los textos es la siguiente:
El tiempo de espera de caché establecido por el decorador cache_page ahora tiene prioridad sobre la directiva max-age del encabezado Cache-Control.
Proporcionar un campo remoto no local en el argumento ForeignKey.to_field ahora lanza una FieldError.
SECURE_REFERRER_POLICY ahora tiene como valor por defecto 'same-origin'. Consulte la sección Nuevas características de seguridad <whats-new-security-3.1> anterior para obtener más detalles.
El comando de administración check ahora ejecuta solo las comprobaciones del sistema de base de datos para los alias de bases de datos especificados mediante la opción check --database.
El comando de administración migrate ahora ejecuta solo las comprobaciones del sistema de base de datos para una base de datos a migrar.
Las clases CSS de administración row1 y row2 se han eliminado en favor de las pseudo-clases :nth-child(odd) y :nth-child(even).
La función make_password() ahora requiere que su argumento sea una cadena o bytes. Los demás tipos deben ser explícitamente convertidos a uno de estos.
El parámetro version no documentado de la clase AsKML se ha eliminado.
Los serializadores de JSON y YAML <serialización de formatos>, utilizados por dumpdata, ahora dumpan todos los datos con Unicode por defecto. Si necesita el comportamiento anterior, pase ensure_ascii=True al serializador de JSON o allow_unicode=False al serializador de YAML.
El auto-reloader ya no monitorea cambios en archivos de traducción Django integrados.
La versión mínima soportada de mysqlclient se incrementa desde 1.3.13 a 1.4.0.
Las clases no documentadas django.contrib.postgres.forms.InvalidJSONInput y django.contrib.postgres.forms.JSONString se mueven a django.forms.fields.
La clase no documentada django.contrib.postgres.fields.jsonb.JsonAdapter se elimina.
El etiquetado {% localize off %} y el filtro de texto unlocalize ya no respetan la configuración DECIMAL_SEPARATOR.
La versión mínima soportada de asgiref se incrementa desde 3.2 a 3.2.10.
La clase Media ahora renderiza etiquetas <script> sin la atributo type para seguir las recomendaciones del WHATWG <https://html.spec.whatwg.org/multipage/scripting.html#the-script-element>.
ModelChoiceIterator, utilizado por ModelChoiceField y ModelMultipleChoiceField, ahora devuelve opciones de 2-tuplas que contienen instancias de ModelChoiceIteratorValue como el primer elemento value en cada opción. En la mayoría de los casos esto se traduce de manera transparente, pero si necesitas el valor del campo field mismo, utiliza el atributo ModelChoiceIteratorValue.value en su lugar.
Los textos traducidos son:
La utilización no documentada de django.contrib.postgres.fields.jsonb.KeyTransform y django.contrib.postgres.fields.jsonb.KeyTextTransform también están descontinuados en favor de las transformaciones en django.db.models.fields.json.
Los nuevos campos JSONField, KeyTransform y KeyTextTransform se pueden utilizar en todos los backends de base de datos admitidos.
La configuración PASSWORD_RESET_TIMEOUT_DAYS está descontinuada en favor de PASSWORD_RESET_TIMEOUT.
El uso no documentado de la búsqueda con la expresión regular isnull con valores no booleanos como lado derecho está descontinuado, utiliza True o False en su lugar.
La clase de excepción django.db.models.query_utils.InvalidQuery es descontinuada en favor de FieldDoesNotExist y FieldError.
El punto de entrada django-admin.py está descontinuado en favor de django-admin.
El método HttpRequest.is_ajax() está descontinuado ya que se basaba en una forma específica de jQuery para indicar llamadas AJAX, mientras que la actualización utiliza la API JavaScript Fetch. Dependiendo de tu caso de uso, puedes escribir tu propio método de detección AJAX o utilizar el nuevo método HttpRequest.accepts() si tu código depende del encabezado HTTP Accept del cliente.
Si estás escribiendo tu propio método de detección AJAX, request.is_ajax() se puede reproducir exactamente como request.headers.get('x-requested-with') == 'XMLHttpRequest'.
Pasando None como primer argumento a django.utils.deprecation.MiddlewareMixin.__init__() está descontinuado.
El formato de codificación de los valores de las cookies utilizados por CookieStorage es diferente del formato generado por versiones antiguas de Django. El soporte para el formato antiguo permanece hasta Django 4.0.
El formato de codificación de las sesiones es diferente del formato generado por versiones antiguas de Django. El soporte para el formato antiguo permanece hasta Django 4.0.
La argumento providing_args puramente documental para Signal está descontinuado. Si dependes de este argumento como documentación, puedes mover el texto a un comentario o docstring de código.
Llamar a django.utils.crypto.get_random_string() sin un argumento length es descontinuado.
El mensaje list para ModelMultipleChoiceField está descontinuado en favor de invalid_list.
Pasando alias de columnas crudas a QuerySet.order_by() está descontinuado. El mismo resultado se puede lograr pasando aliases en un RawSQL en su lugar antes.
El campo de modelo NullBooleanField está descontinuado en favor de BooleanField(null=True, blank=True).
La alias django.conf.urls.url() de django.urls.re_path() está descontinuada.
Los marcadores de plantilla {% ifequal %} y {% ifnotequal %} están descontinuados en favor de {% if %}. {% if %} cubre todos los casos de uso, pero si necesitas seguir utilizando estos marcadores, pueden ser extraídos de Django a un módulo y incluidos como un marcador incorporado en la opción 'builtins' en OPTIONS.
La configuración transicional DEFAULT_HASHING_ALGORITHM está descontinuada.
Estas características han llegado al final de su ciclo de deprecación y se eliminan en Django 3.1.
Consulte Características deprecadas en 2.2 para obtener detalles sobre estas modificaciones, incluyendo cómo eliminar el uso de estas características.
django.utils.timezone.FixedOffset está eliminado.
django.core.paginator.QuerySetPaginator está eliminado.
La ordenación de un modelo Meta.ordering no afecta a las consultas GROUP BY.
django.contrib.postgres.fields.FloatRangeField y django.contrib.postgres.forms.FloatRangeField están eliminados.
La configuración del carácter de codificación FILE_CHARSET está eliminada.
django.contrib.staticfiles.storage.CachedStaticFilesStorage está eliminado.
El método RemoteUserBackend.configure_user() requiere request como primer argumento posicional.
Los textos traducidos son:
may 31, 2026