En Django, se ofrecen dos clases principales de formularios: forms.Form
y forms.ModelForm
. En este artículo, explicaré las diferencias entre ambas clases y en qué situaciones deberías elegir cada tipo de formulario.
1. Resumen de forms.Form
y forms.ModelForm

1.1 ¿Qué es forms.Form
?
- Clase de formulario independiente: Funciona sin relación con un modelo de Django y permite definir manualmente los datos necesarios.
- Uso principal: Se utiliza para recibir la entrada del usuario, validarla o manejar datos que no están directamente relacionados con un modelo.
Ejemplo: Formulario de feedback del usuario
from django import forms
class FeedbackForm(forms.Form):
name = forms.CharField(max_length=50, label="Tu Nombre")
email = forms.EmailField(label="Tu Email")
message = forms.CharField(widget=forms.Textarea, label="Tu Feedback")
1.2 ¿Qué es forms.ModelForm
?
- Clase de formulario asociada a un modelo: Está directamente vinculada a un modelo de Django, lo que automatiza la interacción con la base de datos.
- Uso principal: Se utiliza para crear, actualizar instancias de modelos o recibir datos que se almacenarán en la base de datos.
Ejemplo: Formulario para crear un artículo del blog
from django import forms
from .models import Post
class PostForm(forms.ModelForm):
class Meta:
model = Post
fields = ['title', 'content']
2. Comparación de principales diferencias
Criterio | forms.Form | forms.ModelForm |
---|---|---|
Relación con el modelo | Sin relación con un modelo | Directamente relacionado con un modelo |
Manipulación de datos | Validación de datos y almacenamiento manual | Almacenamiento automático de datos (form.save() ) |
Definición de campos | Definición explícita de todos los campos | Transformación automática de los campos del modelo en campos de formulario |
Uso | Formulario para manipular datos de manera independiente o manejar entradas del usuario | Formulario vinculado a operaciones de base de datos |
Flexibilidad | Configuración libre de campos | Dependiente de los campos del modelo |
3. Casos de uso
3.1 Casos de uso de forms.Form
- Manipulación de datos sin relación con el modelo: Ej: formulario de búsqueda, formulario de inicio de sesión, formulario de restablecimiento de contraseña.
Ejemplo de formulario de búsqueda
class SearchForm(forms.Form):
query = forms.CharField(max_length=100, label="Buscar")
- Manipulación compleja de entradas del usuario: Ej: cuando los campos de entrada no se almacenan directamente en el modelo.
Ejemplo de formulario de cambio de contraseña
class PasswordChangeForm(forms.Form):
old_password = forms.CharField(widget=forms.PasswordInput, label="Contraseña Anterior")
new_password = forms.CharField(widget=forms.PasswordInput, label="Nueva Contraseña")
confirm_password = forms.CharField(widget=forms.PasswordInput, label="Confirmar Contraseña")
def clean(self):
cleaned_data = super().clean()
new_password = cleaned_data.get("new_password")
confirm_password = cleaned_data.get("confirm_password")
if new_password != confirm_password:
raise forms.ValidationError("Las contraseñas no coinciden.")
3.2 Casos de uso de forms.ModelForm
- Creación y actualización de objetos de modelo: Ej: creación de artículos del blog, inserción de comentarios, modificación de perfiles de usuario.
Ejemplo de formulario para comentarios
class CommentForm(forms.ModelForm):
class Meta:
model = Comment
fields = ['author', 'text']
- Interacción con datos basados en modelos: Ej: al modificar datos existentes o guardar en la base de datos.
4. Comparación del funcionamiento del formulario
4.1 Validación de datos
forms.Form
: Define manualmente los campos y la lógica de validación.forms.ModelForm
: Usa automáticamente las reglas de validación definidas por los campos del modelo.
Ejemplo: Validación de campos del modelo
class Product(models.Model):
name = models.CharField(max_length=100)
price = models.DecimalField(max_digits=10, decimal_places=2)
class ProductForm(forms.ModelForm):
class Meta:
model = Product
fields = ['name', 'price']
- El campo
price
valida automáticamente las restricciones definidas en el modelo (max_digits
,decimal_places
).
4.2 Almacenamiento de datos
forms.Form
: Procesa los datos usandocleaned_data
.forms.ModelForm
: Almacena datos automáticamente utilizando el métodosave()
.
Ejemplo de almacenamiento de datos con forms.Form
form = FeedbackForm(request.POST)
if form.is_valid():
feedback = Feedback(
name=form.cleaned_data['name'],
email=form.cleaned_data['email'],
message=form.cleaned_data['message']
)
feedback.save()
Ejemplo de almacenamiento de datos con forms.ModelForm
form = PostForm(request.POST)
if form.is_valid():
form.save()
5. ¿Qué formulario debo elegir?
- Trabajo relacionado con un modelo: Si necesitas interactuar directamente con la base de datos, es adecuado usar
forms.ModelForm
. - Trabajo no relacionado con un modelo: Si necesitas validación de datos independiente o manejar la entrada del usuario, usa
forms.Form
.
Conclusión
forms.Form
y forms.ModelForm
son dos potentes herramientas en Django para manejar la entrada y validación de datos. Como ambas clases tienen usos y características diferentes, es importante elegir el formulario adecuado según la situación. En el próximo artículo, examinaremos más a fondo los campos y widgets de los formularios.
Add a New Comment