Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

1.1K
Views
Django Form DateInput con widget en actualización: perder el valor inicial

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)

La cuestión

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

Mi código

modelo.py

 class TimesheetItem(models.Model): date = models.DateField() description = models.CharField(max_length=100) # many other fields here

formulario.py

 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 }), }

ver.py

 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.

over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

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' }), }
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!