Ir al contenido principal

Solución Definitiva para Inputs de Fecha en Django

El Problema

Los campos de fecha en Django pueden comportarse inconsistentemente: a veces devuelven objetos datetime, a veces strings en formato localizado, y cuando hay errores de validación, no siempre se muestran correctamente en el template.

Solución Completa

1. Configuración Global (settings.py)

# settings.py
DATE_INPUT_FORMATS = ['%Y-%m-%d']  # Formato para parsear inputs
USE_L10N = False                   # Desactiva localización
DATE_FORMAT = 'Y-m-d'              # Formato de visualización

2. Filtro Personalizado (templatetags/filters.py)

from django import template
import datetime

register = template.Library()

@register.filter
def to_date_input(value):
    """
    Convierte cualquier valor a formato YYYY-MM-DD para inputs type="date"
    """
    if not value:
        return ''
    
    # Si ya está en formato YYYY-MM-DD
    if isinstance(value, str) and len(value) == 10 and value[4] == '-' and value[7] == '-':
        return value
    
    # Si es objeto date/datetime
    if isinstance(value, (datetime.date, datetime.datetime)):
        return value.strftime('%Y-%m-%d')
    
    # Para cualquier otro caso
    try:
        return value.strftime('%Y-%m-%d')
    except AttributeError:
        return str(value)

3. Uso en el Template

{% load filters %}

<input type="date" 
    name="fecha_ingreso"  
    class="form-control" 
    value="{{ form.fecha_ingreso.value|to_date_input }}">

<!-- Debug opcional -->
<div style="background: #f0f0f0; padding: 10px; margin: 10px 0;">
    <strong>DEBUG:</strong><br>
    Valor original: "{{ form.fecha_ingreso.value }}"<br>
    Valor convertido: "{{ form.fecha_ingreso.value|to_date_input }}"
</div>

¿Por qué esta solución funciona?

✅ Maneja todos los casos:

  • Valores None o vacíos
  • Strings en formato YYYY-MM-DD
  • Objetos datetime/date
  • Strings en otros formatos

✅ Mantiene la separación de concerns:

  • La lógica de formato en el filtro
  • La presentación en el template
  • Configuración global en settings

⚠️ Importante: Recuerda reiniciar el servidor de Django después de crear o modificar los templatetags.

Estructura de Archivos

tu_app/
├── templatetags/
│   ├── __init__.py
│   └── filters.py      # Filtros personalizados
├── templates/
│   └── tu_template.html
└── settings.py         # Configuración global

Comentarios

Entradas populares de este blog

Instalación y Configuración de MySQL 5.7 en Ubuntu 24.04 LTS

Instalar MySQL 5.7 en Ubuntu 24.04 1. Descargar e instalar MySQL Copiar mkdir ~/mysql57 cd ~/mysql57 wget https://cdn.mysql.com/archives/mysql-5.7/mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz tar -zxvf mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz sudo mv mysql-5.7.44-linux-glibc2.12-x86_64 /usr/local/mysql sudo ln -s /usr/local/mysql/bin/mysql /usr/local/bin/mysql 2. Instalar dependencias necesarias IMPORTANTE: Se descargan las versiones nuevas de las librerías y se las vincula con las librerías que necesita MySQL. Copiar sudo apt update # Reemplazo de libaio sudo apt install libaio1t64 # Reemplazo de libtinfo y ncurses sudo apt install libtinfo6 libncurses6 Copiar # Crear los enlaces simbólicos sudo ln -sf /usr/lib/x86_64-linux-gnu/libaio.so.1t64 /usr/lib/libaio.so.1 sudo ln -sf /usr/lib/x86_64-linux-gnu/libtinfo.so.6 /usr/lib/x86_64-linux-gnu/libtinfo.so.5 sudo ln -sf /usr/lib/x86_64-linux-gnu/libncurses.so.6 /usr/lib/x86_64...

Instalar DeepSeek R1 1.5B en Ubuntu 24.04 sin GPU

Instalar DeepSeek en tu sistema sin GPU, pasos: Especificaciones del Entorno de Pruebas Componente Detalle SO Ubuntu Cinnamon 24.04 LTS x86_64 Kernel 6.8.0-51-generic CPU Intel i7-6820HQ (8 núcleos) @ 3.600GHz GPUs AMD ATI Radeon HD 8830M / R7 250 / R7 M465X Intel HD Graphics 530 RAM 15.882 GB (3.716 GB en uso) Resolución 1440x810 Escritorio Cinnamon 6.0.4 1. Instalar Git LFS sudo apt-get install git-lfs git lfs install 2. Clonar el repositorio cd /opt sudo mkdir deepseek && sudo chown $USER:$USER deepseek cd deepseek git clone https://huggingface.co/deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B 3. Crear y activar un entorno virtual python -m ve...

Instalar Jasper Studio 6.21 para Ubuntu 24.04

Instalar js-studiocomm_6.21.3 en Ubuntu 24.4 Para instalar Jaspersoft Studio en Ubuntu 24.4, sigue estos pasos: 1. Descargar Jasper Studio Descarga la versión js-studiocomm_6.21.3 desde el siguiente enlace: Jaspersoft Studio 6.21.3 2. Crear el directorio de instalación mkdir /opt/jasperstudio 3. Mover el archivo descargado mv /dir_descarga/js-studiocomm_6.21.3_linux_x86_64.tgz /opt/jasperstudio/ cd /opt/jasperstudio 4. Extraer el archivo tar -xvzf js-studiocomm_6.21.3_linux_x86_64.tgz cd js-studiocomm_6.21.3 5. Ejecutar Jaspersoft Studio ./Jaspersoft\ Studio 6. Crear acceso directo en el escritorio Para facilitar el acceso, crea un archivo .desktop en el escritorio: gedit ~/Escritorio/jaspersoft-studio.desktop En el archivo jaspersoft-studio.desktop , agrega lo siguiente: [Desktop Entry] Version=1.0 Ty...