I have a custom field called HourField, which lets you enter “1:30” to represent one and a half hours. The clean() method turns it into 1.5 for the FloatField in the model. This all works fine. Now I’m having a problem where when I want to create a formset, that field gets rendered as “1.5” instead of “1:30” which is what I want.
Is there some kind of method similar to clean() but works the other way around?
edit: using another type of storage method is out of the question. I have a few other custom fields I have made which are stored as one type of object, but are entered by the user as a string. I used the example above because it was the most straight forward.
To customize the way a field renders, you need to define a widget as well.
The following code shows some responsibilities of widgets in django :
there’s an gotcha here : the value’s class may vary, since you may render cleaned values coming from the field, or uncleaned data coming from a form POST. Hence the test if we have a numeric value in _format_value ; if it’s a string, just leave it as-is.
Please note that the widget’s code is inspired by widgets.TimeInput from the sourcecode of django, which helps being consistent.
Please note that 1:20 becomes 1:19, which is due to the loss of precision induced by the use of a float. You might want to change the data type if you don’t want to lose some precision.