Gestión de Formularios
Sistema de Formularios en Django
Django proporciona un sistema robusto para manejar formularios HTML, validación de datos y renderizado automático con protección CSRF integrada.
Formularios Básicos
Formularios simples con validación automática
ModelForms
Formularios basados en modelos de datos
Formularios Personalizados
Validación y widgets personalizados
Formsets
Múltiples formularios en una sola vista
Formularios Básicos
# forms.py
from django import forms
from django.core.exceptions import ValidationError
class ContactoForm(forms.Form):
nombre = forms.CharField(
max_length=100,
widget=forms.TextInput(attrs={
'class': 'form-control',
'placeholder': 'Tu nombre completo'
})
)
email = forms.EmailField(
widget=forms.EmailInput(attrs={
'class': 'form-control',
'placeholder': 'tu@email.com'
})
)
asunto = forms.CharField(
max_length=200,
widget=forms.TextInput(attrs={'class': 'form-control'})
)
mensaje = forms.CharField(
widget=forms.Textarea(attrs={
'class': 'form-control',
'rows': 5,
'placeholder': 'Escribe tu mensaje aquí...'
})
)
acepta_terminos = forms.BooleanField(
required=True,
error_messages={'required': 'Debes aceptar los términos'}
)
def clean_email(self):
email = self.cleaned_data['email']
if not email.endswith('@empresa.com'):
raise ValidationError('Solo emails corporativos permitidos')
return email
def clean(self):
cleaned_data = super().clean()
nombre = cleaned_data.get('nombre')
mensaje = cleaned_data.get('mensaje')
if nombre and mensaje and nombre.lower() in mensaje.lower():
raise ValidationError('El mensaje no puede contener tu nombre')
return cleaned_data
ModelForms
# forms.py
from django import forms
from .models import Articulo, Categoria
class ArticuloForm(forms.ModelForm):
class Meta:
model = Articulo
fields = ['titulo', 'contenido', 'categoria', 'etiquetas', 'imagen']
widgets = {
'titulo': forms.TextInput(attrs={
'class': 'form-control',
'placeholder': 'Título del artículo'
}),
'contenido': forms.Textarea(attrs={
'class': 'form-control editor',
'rows': 10
}),
'categoria': forms.Select(attrs={'class': 'form-control'}),
'etiquetas': forms.CheckboxSelectMultiple(),
'imagen': forms.FileInput(attrs={
'class': 'form-control',
'accept': 'image/*'
})
}
labels = {
'titulo': 'Título del Artículo',
'contenido': 'Contenido',
'categoria': 'Categoría',
'etiquetas': 'Etiquetas',
'imagen': 'Imagen Destacada'
}
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['categoria'].queryset = Categoria.objects.filter(activa=True)
self.fields['titulo'].help_text = 'Máximo 200 caracteres'
def save(self, commit=True):
articulo = super().save(commit=False)
articulo.slug = self.generate_slug(articulo.titulo)
if commit:
articulo.save()
self.save_m2m()
return articulo
def generate_slug(self, titulo):
from django.utils.text import slugify
return slugify(titulo)