Qué hay de nuevo en Django v4.0

Django

En diciembre de 2021, el equipo de Django lanzó Django v4, que contiene varias actualizaciones del marco, como una personalización mejorada y el uso del motor de plantillas para formularios, Formsets y ErrorList.

Sin embargo, se anunció que solo las versiones 3.8, 3.9 y 3.10 de Python admitirán Django v4.0. Además, la serie Django v3.2.x es la última que admite Python v3.6 y 3.7.

En este artículo, repasaremos algunas de las nuevas características de Django v4.0, así como algunas de las versiones de terceros más antiguas que se han eliminado de Django v4.0. ¡Empecemos!

Puedes aprende DJANGO en nuestro curso

 

Actualización a Django v4.0

Antes de actualizar a Django v4.0, asegúrese de resolver cualquier advertencia de obsolescencia reportada por su proyecto cuando use su versión actual de Django. De forma predeterminada, las advertencias de obsolescencia están desactivadas. Para habilitar las advertencias de obsolescencia, use el comando de prueba a continuación:

python -Wa manage.py test

 

Instalación

Una vez que corrija las advertencias de obsolescencia, puede continuar e instalar Django v4.0. Si instaló Django con pip, puede usar el indicador o :--upgrade-U

python -m pip install -U Django

 

Soporte eliminado de Django v4.0

Con la introducción de Django v4.0, se reveló que algunas versiones inferiores de paquetes de terceros ya no serán compatibles. A continuación, encontrará una lista y una descripción de cada uno.

 

PostgreSQL v9.6

PostgreSQL v9.6 y versiones anteriores no son compatibles con Django v4.0. Django v4.0 solo admitirá PostgreSQL ≥v10.

 

Oracle v12.2 y 18c

Django v4.0 solo admitirá Oracle ≥v19. El equipo de Django ha eliminado oficialmente el soporte para las versiones 18c de Oracle y anteriores. Según el anuncio, a partir de abril de 2024, Django v3.2 ya no admitirá Oracle ≤v18c.

 

Paquetes y funciones adicionales eliminados en Django v4.0

Las siguientes funciones y paquetes de terceros no serán compatibles con Django v4.0:

  • PostGIS 2.3
  • GDAL 2.0 y GEOS 3.5
  • cx_ORACLE 7.0
  • La función ha quedado obsoleta django.utils.text.unescape_entities()
  • La función ha quedado obsoleta django.utils.http.is_safe url(

 

¿Qué hay de nuevo en Django v4.0?

zoneinfo zona horaria predeterminada

En Django v4.0, se ha migrado la zona horaria predeterminada pytzazoneinfo. El soporte para la pytz zona horaria ahora está obsoleto y no será compatible en la próxima versión de Django v5.0 y versiones posteriores.

La migración a zoneinfo es bastante sencilla. Puede seleccionar la zona horaria actual y convertir datetime instancias en formularios y plantillas a la zona horaria actual. Las operaciones en datetime instancias conscientes en UTC no se ven afectadas.

 

Representación de formularios basada en plantillas

Formularios, Conjuntos de formularios y ErrorList ahora se renderizan utilizando el motor de plantillas para mejorar la personalización.

El equipo de Django hizo cambios en la forma, y se usan en Django v4.0. Las opciones ahora son opcionales, siendo el valor predeterminado para todas ellas. render() get_context() template_name render() None

Cuando se usa el siguiente código:

render(template_name=None, context=None, renderer=None)

Si no se pasan los valores de los parámetros, los parámetros se establecerán de forma predeterminada en los siguientes valores:

  • template_name: template_name()
  • Context: Contiene un valor devuelto por get_context()
  • renderer: Valor devuelto por default_renderer

Para mayor flexibilidad, la formset renderización se ha trasladado al motor de plantillas en Django v4.0.

Cuando use un formset vista dentro de una, usará el management formulario dentro de la plantilla. Echemos un vistazo a un ejemplo de view:

from django.forms import formset_factory
from django.shortcuts import render
from myapp.forms import ArticleForm
def manage_articles(request):
    ArticleFormSet = formset_factory(ArticleForm)
    if request.method == 'POST':
        formset = ArticleFormSet(request.POST, request.FILES)
        if formset.is_valid():
            # do something with the formset.cleaned_data
            pass
    else:
        formset = ArticleFormSet()
    return render(request, 'manage_articles.html', {'formset': formset})

La plantilla se verá como el siguiente código: manage_articles.html

<form method="post">
    <table>
        {{ formset }}
    </table>
</form>

 

Puedes aprende DJANGO en nuestro curso

Internacionalización

Django v4.0 ahora habilita las traducciones al malayo, que no estaban disponibles en versiones anteriores de Django. Los desarrolladores ahora pueden convertir contenido desde o hacia el idioma malayo en sus proyectos.

 

Localización

El valor predeterminado del USE_L10N parámetro se cambió de False a True en Django v4.0 para seguir las mejores prácticas.

Con el lanzamiento de Dango v4.0, USE_L10N ha quedado obsoleto. También se señaló que en Django v5.x, cualquier fecha o número presentado se localizará de forma predeterminada.

CSRF_TRUSTED_ORIGINS

Al establecer la CSRF_TRUSTED_ORIGINS configuración, Django v4.0 no habilita el uso solo del hostname valor; en su lugar, los valores deben contener el esquema, por ejemplo, o http:// https://

Además, los valores que comienzan con un punto ahora deben ir precedidos de un asterisco. Por ejemplo, lo reemplazaría por .example.com https://*.example.com

 

Cifrar contraseña hasher

La contraseña de scrypt hasher se ha agregado a Django v4.0 para proporcionar seguridad adicional, y se recomienda que use scrypt en lugar de PBKDF2 para limitar la cantidad de paralelismo que puede utilizar un atacante.

El scrypt está diseñado para utilizar más memoria que otras técnicas de derivación de claves basadas en contraseñas.

 

Restricciones funcionales únicas

UniqueConstraint() ahora tiene una nueva opción posicional que permite a los programadores implementar restricciones funcionales únicas con las mismas restricciones de base de datos que, como lo demuestra el siguiente código: *expressions Index.expressions

from django.db import models
from django.db.models import UniqueConstraint
from django.db.models.functions import Lower

class MyModel(models.Model):
    first_name = models.CharField(max_length=255)
    last_name = models.CharField(max_length=255)
    class Meta:
        constraints = [
            UniqueConstraint(
                Lower('first_name'),
                Lower('last_name').desc(),
                name='first_last_name_unique',
            ),
        ]

La opción se utiliza para aplicar restricciones funcionalmente únicas a los modelos. Meta.restrictions

 

Conclusión

En este artículo, repasamos algunas de las nuevas características de Django v4.0, algunos de los paquetes de terceros que Django v4.0 ya no admite y los pasos necesarios para actualizar su versión existente a Django v4.0.

Las nuevas funciones de Django v4.0 no se limitan a las que se tratan en esta publicación. Para obtener una lista completa de las nuevas funciones, consulte el anuncio oficial de Django. ¡Espero que disfrutes este tutorial!