for - datetimefield django model
Django: ¿Cómo formatear la representación de fecha de DateField? (4)
Tengo un formulario con un DateField. El valor de la fecha existente se formatea para representarse así:
2009-10-03
¿Cómo puedo formatear eso para que se vea así?
03.10.2009
Encontré un widget que lo muestra así, pero la validación no permite los valores que ingresé en ese momento.
Método 1: procesamiento manual del formato pero falla la validación del formato del campo de fecha
Así que la mejor solución de formateo para ti sería "."
{{field.value.day|stringformat:"02d"}}.{{field.value.month|stringformat:"02d"}}.{{field.value.year}}
para obtener 24.05.2010
Agregué stringformat: "02d" para no obtener 25.5.2010 como valor de salida.
Publico el código completo de un campo para tener una idea:
<input class="form-control" data-inputmask="''mask'':''99.99.9999''" data-toggle="masked" name="{{field.html_name}}" placeholder="{{ field.label }}" {% if field.field.required %}required=""{% endif%} type="text" value="{{field.value.day|stringformat:"02d"}}.{{field.value.month|stringformat:"02d"}}.{{field.value.year}}" " >
Principalmente utilicé este formato para el valor de fecha en una instancia existente de un formulario de actualización (modelo) (clase UpdateView).
Esta solución puede fallar al enviar el formulario de actualización si no satisface el formato
Método 2: (Mejor) automatice el formato del valor del campo + validación correcta usando la configuración
Se hace agregando configuraciones locales personalizadas al archivo settings.py: la parte más importante es la tupla DATE_INPUT_FORMATS
..
..
USE_L10N = True
..
DATE_INPUT_FORMATS = (
''%d.%m.%Y'', ''%d.%m.%Y'', ''%d.%m.%y'', # ''25.10.2006'', ''25.10.2006'', ''25.10.06''
''%d-%m-%Y'', ''%d/%m/%Y'', ''%d/%m/%y'', # ''25-10-2006'', ''25/10/2006'', ''25/10/06''
''%d %b %Y'', # ''25 Oct 2006'',
''%d %B %Y'', # ''25 October 2006'',
)
DATE_FORMAT = ''j F Y''
TIME_FORMAT = ''H:i''
DATETIME_FORMAT = ''j F Y H:i''
YEAR_MONTH_FORMAT = ''F Y''
MONTH_DAY_FORMAT = ''j F''
SHORT_DATE_FORMAT = ''j N Y''
SHORT_DATETIME_FORMAT = ''j N Y H:i''
FIRST_DAY_OF_WEEK = 1
El más importante:
- La validación de los campos de fecha se realiza al insertar y actualizar con todos los formatos presentes en la tupla DATE_INPUT_FORMATS
- En updateView, el campo de fecha se procesará utilizando el primer formato de la tupla DATE_INPUT_FORMATS (me refiero a usar DATE_INPUT_FORMATS [0] == ''% d.% M.% Y'')
Por lo tanto, la elección del primer elemento es importante en esta tupla, ya que define el formato del valor existente del campo de fecha en los formularios de actualización.
Puede aplicar la validación de javascript en UpdateViews utilizando este primer formato también.
Probado en django 1.6 y 1.7 , no sé para versiones anteriores
Para mostrar el valor del campo inicial correctamente formateado, use el widget DateInput
. Para personalizar la validación, use el argumento de palabra clave DateField
de DateField
.
¿Por qué necesitas tanto format
como input_formats
?
format
: el formato en el que se mostrará el valor inicial de este campo. Ver here
input_formats
: una lista de formatos utilizados para intentar convertir una cadena en un objeto datetime.date válido. Ver here
Puedes mostrar la fecha en plantilla mediante
{{ your_object.date_field.day }}.{{ your_object.date_field.month }}.{{ your_object.date_field.year }}
Subclase de campo personalizado como este:
class CustomDateField(forms.DateField):
def __init__(self, *args, **kwargs):
kwargs.setdefault(''input_formats'', ("%d.%m.%Y",))
super(CustomDateField, self).__init__(*args, **kwargs)