En esta página:
Apenas algunos desarrolladores están aprendiendo Django 4 y ya ha sido lanzada una nueva versión de Django en Diciembre de 2023. Django 5.0 será compatible con Python 3.10, 3.11 y 3.12 y otras nuevas versiones que sean lanzadas, también habran características que serán eliminadas porque han llegado al final de su ciclo de obsolescencia. En este post te compartiré Las Novedades Que Trae Django 5, vamos con ello.
Partes
- Parte 1
- Parte 2
Antes de continuar te invito a leer los siguientes artículos:
-
- Que es Django, Historia y tu primer Hola Mundo (Corregido: 31-05-2019)
- Conceptos Iniciales para desplegar Django
- Como usar Django y React JS (Método Manual, no Librería)
- Como crear un CRUD con Django 2 y Bootstrap 4 – Parte 1 (Python 3.7)
- 5 Servicios de Hosting VPS ideales para publicar un Proyecto Creado con Django
- Como Integrar Firebase en Django 3.0.7 – Parte 1
- Como Crear Un CRUD con Django 4 (Python 3.11) y Bootstrap 5 – Parte 1
- Como Crear un Enlace de Descarga en Django
- 7 Proyectos que han sido Creados con Django Framework
- Como Crear una API REST con Django 3.1.1 + Consumir Datos en una Aplicación Android – Parte 1
- Puedes leer más en la categoría Django
Asimismo, te invito a escuchar el Podcast: “Razones Por Las Cuales Te Cuesta Aprender A Programar” y “¿ Qué Es NoCode Development ?” (Anchor Podcast):
Spotify: | Sound Cloud: | Apple Podcasts | Anchor Podcasts |
Bien ahora continuemos con el Post: Las Novedades Que Trae Django 5 – Parte 1.
Las Novedades Que Trae Django 5
Es importante mencionar que la serie Django 4.2.x es la última en admitir Python 3.8 y 3.9. Veamos a continuación las novedades que nos traerá Django 5:
Filtros de facetas en el administrador
Los recuentos de facetas ahora se muestran para los filtros aplicados en la lista de cambios del administrador cuando se activa a través de la interfaz de usuario. Este comportamiento se puede cambiar a través del nuevo atributo ModelAdmin.show_facets
Por ejemplo, para mostrar siempre los recuentos de facetas sin necesidad de proporcionar el parámetro de consulta, puedes establecer admin.ShowFacets.ALWAYS en una variable llamada show_facets (puedes ponerle otro nombre que desees a la variable):
1 2 3 4 5 6 7 8 |
from django.contrib import admin class MyModelAdmin(admin.ModelAdmin): ... # Have facets always shown for this model admin. show_facets = admin.ShowFacets.ALWAYS |
Plantillas simplificadas de campos de formulario
En Django 5 se agregará el concepto de grupos de campos y plantillas, para simplificar la carga de elementos de un formuario, como el label_tag, helptext y errors.
Por ejemplo el siguiente formulario:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
<form method="" action=""> ... <div> {{ form.name.label_tag }} {% if form.name.help_text %} <div class="helptext" id="{{ form.name.id_for_label }}_helptext"> {{ form.name.help_text|safe }} </div> {% endif %} {{ form.name.errors }} {{ form.name }} <div class="row"> <div class="col"> {{ form.email.label_tag }} {% if form.email.help_text %} <div class="helptext" id="{{ form.email.id_for_label }}_helptext"> {{ form.email.help_text|safe }} </div> {% endif %} {{ form.email.errors }} {{ form.email }} </div> <div class="col"> {{ form.password.label_tag }} {% if form.password.help_text %} <div class="helptext" id="{{ form.password.id_for_label }}_helptext"> {{ form.password.help_text|safe }} </div> {% endif %} {{ form.password.errors }} {{ form.password }} </div> </div> </div> ... </form> |
Ahora se puede simplificar a:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<form method="" action=""> ... <div> {{ form.name.as_field_group }} <div class="row"> <div class="col">{{ form.email.as_field_group }}</div> <div class="col">{{ form.password.as_field_group }}</div> </div> </div> ... </form> |
El método as_field_group() renderiza los campos con la plantilla “django/forms/field.html” de forma predeterminada y puede ser personalizada para cada proyecto, por campo o solicitud.
Valores predeterminados calculados por la base de datos
El nuevo parámetro Field.db_default establece un valor por defecto que es calculado por la base de datos. Por ejemplo tenemos el siguiente modelo para una tabla productos:
1 2 3 4 5 6 7 8 9 |
from django.db import models from django.db.models.functions import Now, Pi class ProductosModel(models.Model): precio = models.IntegerField(db_default=18) created_at = models.DateTimeField(db_default=Now()) circunferencia = models.FloatField(db_default=2 * Pi()) |
Puedes ver que dentro de cada campo le estamos colocando luego del tipo de dato, entre paréntesis el parámetro db_default con un determinado valor o cálculo que puede retornar un valor y se inserta en la columna de la base de datos.
Por ejemplo el campo circunferencia que es la circunferencia de un producto, en el parámetro db_default se hace el cálculo de 2 * Pi() el cual puede devolver un valor aproximado de 6.28318530718, este valor se inserta en la columna circunferencia de la tabla productos.
Características menores
Veamos algunas características más pequeñas que traerá Django 5:
django.contrib.admin
Esta interface recibirá las siguientes actualizaciones:
- El nuevo método AdminSite.get_log_entries() permite personalizar el conjunto de consultas para los logs o registros del sitio.
- XRegExp que permite ejecutar expresiones regulares, se actualiza de la versión 3.2.0 a la 5.1.1.
- Los filtros admin: django.contrib.admin.AllValuesFieldListFilter, ChoicesFieldListFilter, RelatedFieldListFilter y RelatedOnlyFieldListFilter ahora manejan parámetros de consulta de varios valores.
- El nuevo método AdminSite.get_model_admin() devuelve una clase de administrador para la clase de modelo dada.
django.contrib.auth
El sistema de autenticación de Django recibirá las siguientes actualizaciones:
- El recuento de iteraciones predeterminado para el hasher de contraseñas PBKDF2 se aumentará de 600,000 a 720,000.
- Las nuevas funciones asincrónicas ahora se proporcionan con un prefijo a: django.contrib.auth.aauthenticate(), aget_user(), alogin(), alogout() y aupdate_session_auth_hash().
- El middleware AuthenticationMiddleware ahora añade un método asíncronico llamado HttpRequest.auser() el cual devuelve el usuario que ha iniciado sesión actualmente.
- La nueva función django.contrib.auth.hashers.acheck_password() y el método AbstractBaseUser.acheck_password(), ambos asíncronos, permiten la verificación asíncrona de las contraseñas de los usuarios.
django.contrib.gis
Este módulo que cuenta con varias utilidades para crear aplicaciones web geospaciales recibirá las siguientes actualizaciones:
- Se agregó una nueva función llamada ClosestPoint() que devuelve un punto bidimensional en la geometría que está más cerca de otra geometría.
- Los agregados GIS ahora respaldan el argumento filter.
- Se agregó soporte para GDAL 3.7 (GDAL son las iniciales de Geospatial Data Abstraction Library).
- Se agregó soporte para GEOS 3.12 (GEOS son las iniciales de Geometry Engine – Open Source).
django.contrib.postgres
Este módulo que contiene modelos y campos para tipos de datos en PostgreSQL, contará con el nuevo atributo violation_error_code perteneciente a ExclusionConstraint. Este atributo permitirá personalizar el código o code de un error de Validación o ValidationError obtenido al validar un modelo.
1 2 3 4 |
# Ejemplo de Validación de error con código ValidationError(_("Invalid value"), code="invalid") |
Vistas asíncronas
Ahora los eventos http.disconnect se manejan mediante ASGI (Asynchronous Server Gateway Interface). Esto permite que las vistas lleven a cabo cualquier limpieza que sea necesaria si un cliente como un navegador web se desconecta antes de que genere la respuesta.
Decoradores
Estos decoradores ahora admiten funciones de vista asíncrona envolvente:
- cache_control()
- never_cache()
- no_append_slash()
- csrf_exempt()
- sensitive_variables()
- sensitive_post_parameters()
- condition()
- etag()
- last_modified()
- require_http_methods()
- require_GET()
- require_POST()
- require_safe()
- vary_on_cookie()
- vary_on_headers()
- xframe_options_deny()
- xframe_options_sameorigin()
- xframe_options_exempt()
Puedes presionar sobre los 15 primeros decoradores para concer más sobre ellos. Los 3 últimos están en proceso de creación.
Informe de errores
Los decoradores sensitive_variables() y sensitive_post_parameters() ahora pueden ser usados con funciones asíncronas.
Formularios
Las siguientes características se agregarán a los formularios:
- Ahora el argumento ChoiceField.choices ahora acepta directamente clases Choices en lugar de requerir expansión con el atributo choices.
- Ahora el nuevo argumento assume_scheme para los campos URLField permite establecer un esquema de URL predeterminado.
- Con el fin de mejorar la accesibilidad y permitir que los lectores de pantalla asocien campos de formulario con su texto de ayuda, el campo de formulario ahora incluye el atributo HTML aria-describedby.
- Con la finalidad de mejorar la accesibilidad para los usuarios, el campo de un formulario que sea no válido, ahora incluye el atributo HTML aria-invalid=”true”.
Modelos
Se agregaron las siguientes características a los modelos:
- El nuevo argumento create_defaults de los métodos QuerySet.update_or_create() y QuerySet.aupdate_or_create() permite especificar valores de campo diferentes en una operación de creación.
- El nuevo atributo violation_error_code de BaseConstraint, CheckConstraint y UniqueConstraint permite personalizar el code código de ValidationError generado durante la validación de un modelo.
- El argumento Field.choices ahora acepta clases Choice directamente en lugar de requerir expansión con el atributo choices.
- El argumento force_insert de Model.save() ahora permite especificar una tupla de clases padre que debe forzarse a insertar.
- Los métodos QuerySet.bulk_create() y QuerySet.abulk_create() ahora establecen la clave principal en cada instancia del modelo cuando el parámetro update_conflicts está habilitado (si la base de datos lo admite).
- El nuevo atributo UniqueConstraint.nulls_distinct permite personalizar el tratamiento de valores NULL en PostgreSQL 15+.
- Los nuevos accesos directos asíncronos aget_object_or_404() y aget_list_or_404() permiten obtener objetos de forma asíncrona.
- La nueva función aprefetch_related_objects() permite la captación previa asíncrona de instancias de un modelo.
- El método QuerySet.aiterator() ahora admite llamadas previas al método prefetch_related().
- En la base de datos MariaDB 10.7+, el campo UUIDField ahora se crea como una columna UUID en lugar de una columna CHAR(32). Consulta la guía de migración anterior para obtener más detalles sobre la migración de UUIDField existente en MariaDB 10.7+.
Paginación
El nuevo argumento django.core.paginator.Paginator.error_messages permite personalizar los mensajes de error generados por el método Paginator.page().
Signals (Señales)
Los nuevos métodos Signal.asend() y Signal.asend_robust() permiten el envío de señales asíncronas. Los receptores de señal pueden ser síncronos o asíncronos y se adaptarán automáticamente al estilo de llamada correcto.
Templates (Plantillas)
Las clases Client y AsyncClient ahora proporciona métodos asincrónicos, usando un prefijo a: asession(), alogin(), aforce_login() y alogout().
Validators (Validadores)
El nuevo argumento argumento de la clase StepValueValidator permite especificar un desplazamiento para valores válidos.
Bien hasta aquí llegamos con esta primera Parte en donde hemos visto varias características nuevas que vendrán con Django 5.
Ten Paciencia, lo que quiero es que conozcas bien estas nuevas características de Django 5 y no llenarte el capitulo de mucho contenido porque te puedes marear y no tendrás un óptimo aprendizaje.
Nota (s)
- En la siguiente parte continuaremos viendo nuevas características que traerá Django Framework 5.
- No olvides que debemos usar la Tecnología para hacer cosas Buenas por el Mundo.
Síguenos en nuestras Redes Sociales para que no te pierdas nuestros próximos contenidos.