Multiwidget de subclases de Django: reconstrucción de la fecha en la publicación usando un widget múltiple personalizado
Así que mi libro de django está de regreso en la universidad y estoy luchando por resolverlo.
He subclasificadodjango.forms.widgets.MultiWidget
al igual que:
class DateSelectorWidget(widgets.MultiWidget):
def __init__(self, attrs=None, dt=None, mode=0):
if dt is not None:
self.datepos = dt
else:
self.datepos = date.today()
# bits of python to create days, months, years
# example below, the rest snipped for neatness.
years = [(year, year) for year in year_digits]
_widgets = (
widgets.Select(attrs=attrs, choices=days),
widgets.Select(attrs=attrs, choices=months),
widgets.Select(attrs=attrs, choices=years),
)
super(DateSelectorWidget, self).__init__(_widgets, attrs)
def decompress(self, value):
if value:
return [value.day, value.month, value.year]
return [None, None, None]
def format_output(self, rendered_widgets):
return u''.join(rendered_widgets)
Lo que me da un campo de selección de fecha ingenioso como este:
Mi queston es muy simple en realidad. Cuando envío dicho formulario a su método de manejo (que utiliza un proceso como este:
forminstance = ModelNameForm(request.POST, instance=modelinstance)
if forminstance.is_valid():
forminstance.save()
Esto falla porque Django no sabe cómo tomar mi widget múltiple y convertirlo de nuevo al tipo de campo subyacente, que se establece enmodels.py
aDateField()
, claramente.
Ahora, los comentarios sobre el MultiWidget en la fuente django me dan esta pista útil:
Probablemente quiera usar esta clase con MultiValueField.
Pero la cosa es que probablemente no. Quiero mantener miDateField()
porque es muy útil y no tiene sentido duplicarlo. Lo que necesito hacer es convertir de alguna manera estos campos múltiples en una sola cadena de fecha válida (yyyy-mm-dd
) para su inserción en la base de datos.
Mi pregunta es entonces:
¿Cómo? ¿Cuál es la mejor manera de lograr esto?