Comme un exercice, je suis en train de créer un widget personnalisé django pour une horloge de 24 heures. Le widget sera un MultiWidget - une boîte de sélection pour chaque champ. J'essaie de suivre docs en ligne (un peu sparse) et en regardant le livre Pro Django, mais je n'arrive pas à le comprendre. Suis-je sur la bonne voie? Je peux enregistrer mes données à partir du formulaire, mais lorsque je préremplis le formulaire, le formulaire n'a pas les valeurs précédentes.Personnalisé django widget - decompress() arg pas rempli
Il semble que le problème est que l'argument 'valeur' des méthodes decompress() est toujours vide, donc je n'ai rien à interpréter.
from django.forms import widgets
import datetime
class MilitaryTimeWidget(widgets.MultiWidget):
"""
A widget that displays 24 hours time selection.
"""
def __init__(self, attrs=None):
hours = [ (i, "%02d" %(i)) for i in range(0, 24) ]
minutes = [ (i, "%02d" %(i)) for i in range(0, 60) ]
_widgets = (
widgets.Select(attrs=attrs, choices=hours),
widgets.Select(attrs=attrs, choices=minutes),
)
super(MilitaryTimeWidget, self).__init__(_widgets, attrs)
def decompress(self, value):
print "******** %s" %value
if value:
return [int(value.hour), int(value.minute)]
return [None, None]
def value_from_datadict(self, data, files, name):
hour = data.get("%s_0" %name, None)
minute = data.get("%s_1" %name, None)
if hour and minute:
hour = int(hour)
minute = int(minute)
return datetime.time(hour=hour, minute=minute)
return None
Dans ma forme, j'appelle le widget comme:
arrival_time = forms.TimeField(label="Arrival Time", required=False, widget=MilitaryTimeWidget())
Je ne vais pas mettre cela comme une réponse, car il est orthogonal à votre question: mais je ne peux pas imaginer pourquoi vous voudriez cette interface utilisateur. En quoi cela est-il meilleur/plus rapide/plus facile qu'une boîte de saisie de texte que vous avez correctement analysée/validée dans votre formulaire? –