En esta entrada vamos a crear un formulario en Django, lo cual es un elemento fundamental ya cuando sabemos dar los primeros pasos en Django, conocer como crear un proyecto, el manejo de las rutas y dar los primeros pasos con nuestro MTV; antes de comenzar, vamos a hablar sobre los formularios:
¿Qué es un formulario de Django?
Django proporciona una clase Form que se utiliza para crear formularios HTML, o mejor dicho, sus campos, ya que con los mismos podemos describir cuales son los campos, de qué tipo (enteros, flotantes, campos de textos, listados...) y cómo funciona y aparece. Es similar a la clase ModelForm que crea un formulario utilizando el modelo, pero no requiere el modelo, por lo tanto, son más manuales y flexibles que estos últimos.
¿Para que se utilizan los formularios en Django?
Los formularios se utilizan básicamente para recibir información del usuario de alguna manera y utilizar esa información para operaciones lógicas en bases de datos. Por ejemplo, registrar un usuario tomando como entrada su nombre, correo electrónico, contraseña, etc. Django mapea los campos definidos en los formularios de Django en campos de entrada HTML.
De tal manera que con una sola definición (formularios en Django) tenemos tanto el render en HTML de los campos como el manejo en las vistas/controladores y por supuesto, validaciones en ambos lados.
¿Cómo crear un formulario en Django?
Los datos del formulario se almacenan en el archivo llamado como forms.py por convención, es decir, que el archivo puede tener cualquier otro nombre, pero generalmente lo llamamos cono forms; este formulario se almacena a nivel de una aplicación (dentro del directorio de la aplicación); por lo tanto, cada aplicación puede definir sus propios formularios según el esquema que quieras darle.
¿Cómo envía Django los datos del formulario?
En Django, el objeto de solicitud que se pasa como parámetro a su vista tiene un atributo llamado "método" donde se establece el tipo de solicitud y se puede acceder a todos los datos pasados a través de POST a través de la solicitud en forma de un diccionario.
¿Qué es Django crispy forms?
Este también es una duda común, django-crispy-forms no es más que un filtro | crispy y una etiqueta {% crispy %} que le permitirá controlar el comportamiento de renderizado de sus formularios Django de una manera muy elegante y SECA. Para tener el control total sin escribir plantillas de formulario personalizadas y con esto, podemos por ejemplo definir clases que queramos que tenga nuestro formulario, por ejemplo, las de Bootstrap o las de Tailwind o las propias.
¿Tengo que usar formularios de Django?
Finalmente, la pregunta del millón; La recomendación es que uses los formularios de Django, ya que son bastante fáciles de usar y manejan toda la validación por usted (use required = True en cada campo, y ya está listo para la simple verificación 'no en blanco' que mencionó), son fáciles de obtener los datos, sanearlos, verificar estado y TODO esto lo perderías si NO los empleamos.
Crear un formulario en Django
Como mencionamos al inicio de este bloque, vamos a crear un formulario en Django, para eso, como comentamos, creamos un archivo llamado forms.py en el cual vamos a definir formularios a nivel de clases:
from django import forms
from .models import Category
class ProductsForm(forms.Form):
title = forms.CharField(label="Nombre", required=True, max_length=255, min_length=3)
description = forms.CharField(label="Descripción",widget=forms.Textarea(attrs={"rows":5, "cols":20}))
price = forms.FloatField(required=True, min_value=0.1)
category = forms.ModelChoiceField(label="Categoría", queryset=Category.objects.all())
Explicación del código anterior
Como puedes ver, definiendo una clase que herede de forms.Form (donde forms es un módulo que importamos desde Django) podemos definir una clase en base a formulario, en donde cada propiedad de la clase es un campo de formulario... así de simple.
Campos de formulario
Tenemos TODO tipo de campos, de tipo texto, números, seleccionables, archivos... en este caso estamos empleando algunos de tipo texto (titulo y descripción) uno de tipo numero (precio) y otro de tipo seleccionable, indicando un modelo (categoría)
- En la misma definición de los campos, indicamos algunas validaciones como tamaño máximo, mínimo y si es requerido.
- También indicamos el label, por lo tanto, con una sola propiedad, podemos definir tanto label como campo.
Vamos a crear una función de creación, para el formulario, aunque perfectamente puedes adaptar el formulario para el proceso de edición o actualización de registros en Django:
def create(request):
form = ProductsForm()
return render(request, 'create.html', { 'form' : form })
Como puedes ver, creamos una instancia del formulario y se lo pasamos a un template:
Render del formulario
Para renderizarlo en una vista/template, podemos usar el formulario que pasamos como parámetros desde el views.py:
{% block content %}
{{form}}
{% endblock %}
Inclusive preguntar por campos en particulares:
{{form.price}}
O el Label
{{form.price.label}}
Por si quieres construir los campos uno por uno.
Conclusiones
Los formularios son un mecanismo que tenemos para trabajar de una manera efectiva con los datos del usuario, los podemos emplear en distintos propósitos y Django nos da todo la flexibilidad y sencillez que lo caracteriza para trabajar con los formularios de una manera efectiva y extensible.
Modelos para los formularios
Los modelos para los formularios son clases que definen la estructura en base a una clase en Python con sus atributos correspondientes; dichas clases permiten:
- Definir la estructura del formulario.
- Aplicar validaciones del lado del servidor y del cliente.
- Poder reutilizar los formularios fácilmente.
Caso práctico
Para usar los formularios, los podemos definir en un archivo aparte a nivel de la aplicación; que por convención se llama cómo forms.py.
Con esto en mente, vamos a crear la siguiente clase:
comments/forms.py
from django.forms import ModelForm, Textarea
from .models import Comment
class CommentForm(ModelForm):
class Meta:
model = Comment
fields = ('text',)
Explicación del código anterior
Los formularios de tipo ModelForm nos ofrecen un esquema sencillo para definir campos del formulario; como puedes ver, es una clase en Python que hereda de la mencionada clase.
Luego, tenemos que definir dentro de esta clase formulario, una clase llamada Meta, para definir la estructura de los formularios; es decir, a qué modelos está relacionado este formulario, y cuáles son los campos; los campos no son más que una tupla de Python.
Estas clases son muy personalizables y puedes definir procesos de guardados, inicialización a nivel de clases, definir atributos, personalizar campos de formularios, validaciones, entre otros; aunque de momento, tenemos un ejemplo mínimo.
Para las clases modelos, viene siendo lo usual, crear una instancia y en este caso, pasar al template.
Vamos a ir a la función de add(), y lo pasamos como segundo parámetro, el formulario:
from .forms import CommentForm
// ***
form = CommentForm()
return render(request,'comments/add.html',{'form':form})
Desde nuestro template, podemos imprimir el formulario completo:
{{ form }}
Y con esto, aparecen todos los campos que hayas definido junto con el LABEL:
O por campos, de manera independiente:
{{ form.text }}
Usa el que mejor te parezca y convenga.
Procesar formularios
Desde el request, podemos obtener los datos del formulario que estamos enviando vía POST o GET tal cual vimos anteriormente; así que, para establecer los datos que van vía POST en el formulario anterior:
form = Formulario(request.POST)
Se lo pasamos como inicialización al formulario.
Caso práctico
La función de add() va a quedar de la siguiente manera:
def add(request):
if request.method == 'POST':
form = CommentForm(request.POST)
if form.is_valid():
comment = form.save()
else:
form = CommentForm()
return render(request,'comments/add.html',{'form':form})
Como puedes ver en el código anterior, desde el mismo modelo, podemos hacer uso de la función de save() para crear un comentario.
Con esto, puedes realizar algunas pruebas y enviar datos desde el formulario del template:
Y verás en tu base de datos:
Si colocas datos inválidos, es decir un formulario sin valores, verás que salta una validación del lado del cliente:
- Andrés Cruz
![Andrés Cruz Andrés Cruz](/public/images/perfil.jpg)
Desarrollo con Laravel, Django, Flask, CodeIgniter, HTML5, CSS3, MySQL, JavaScript, Vue, Android, iOS, Flutter