Necesito un campo DateInput en un ModelForm con el selector de fechas HTML predeterminado (no estoy usando bibliotecas de terceros).
Dado que DateInput se representa con <input type = "text"> de forma predeterminada, falta el selector de fecha (viene gratis con <input type = "date"> )
Encontré algunos ejemplos que explican cómo cambiar el tipo de entrada manejando los parámetros del widget (debajo del código que he hecho hasta ahora)
Tengo el selector de fecha funcionando correctamente pero en "modo de actualización" al pasar el valor de fecha inicial al formulario (ver parte de vista), la fecha permanece vacía en el HTML.
He intentado encontrar la causa y parece que la parte 'type': 'date' en la personalización del widget está borrando el valor inicial de alguna manera; de hecho, al eliminarlo, se vuelve a mostrar la fecha de valor inicial, pero, por supuesto, pierdo el selector de fechas.
En la vista se pasa la fecha con un valor válido
También encontré otrapregunta similar sin respuesta donde el campo se declaró como
class DateInput(forms.DateInput): input_type = 'date' date_effet = forms.DateField(widget=forms.DateInput(format='%d-%m-%Y'), label='Date effet')el problema sigue siendo
class TimesheetItem(models.Model): date = models.DateField() description = models.CharField(max_length=100) # many other fields here class TimesheetItemForm(forms.ModelForm): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) # init is used for other fields initialization and crispy forms class Meta: model = TimesheetItem fields = ['date', 'description'] widgets = { 'date': forms.DateInput( format=('%d/%m/%Y'), attrs={'class': 'form-control', 'placeholder': 'Select a date', 'type': 'date' # <--- IF I REMOVE THIS LINE, THE INITIAL VALUE IS DISPLAYED }), } def edit(request, uuid): try: timesheet_entry_item = TimesheetItem.objects.get(uuid=uuid) if request.method == 'POST': form = TimesheetItemForm( data=request.POST, instance=timesheet_entry_item ) if form.is_valid(): pass # save the form else: form = TimesheetItemForm(initial={ 'date': timesheet_entry_item.date, # <--- the date here has a valid value 'description': timesheet_entry_item.description }) return render(request, 'template.html', {'form': form}) except ObjectDoesNotExist: raise Http404("error")Gracias por cualquier ayuda
METRO.
Logré hacerlo funcionar. Siguiendo la causa del problema, espero que pueda ser útil para otros.
El elemento HTML <input type='date'> quiere una fecha en el formato YYYY-mm-dd ; de hecho, un ejemplo de trabajo HTML debe ser así:
<input type="date" name="date" value="2020-03-31" class="form-control dateinput form-control" placeholder="Select a date" required="" id="id_date"> Como por defecto form.DateInput produce el elemento <input type='text'> , espera una fecha en el formato local: digamos '31/03/2020'.
Forzar el 'type': 'date' y el formato local format format=('%d/%m/%Y') o no pasar ningún formato, ignora el valor pasado ya que <input type='date'> quiere format=('%Y-%m-%d')
Por fin la instrucción correcta fue:
widgets = { 'date': forms.DateInput( format=('%Y-%m-%d'), attrs={'class': 'form-control', 'placeholder': 'Select a date', 'type': 'date' }), }