Given a set of typical models:
# Application A from django.db import models class TypicalModelA(models.Model): the_date = models.DateField() # Application B from django.db import models class TypicalModelB(models.Model): another_date = models.DateField() ...
How might one change the default widget for all DateFields to a custom MyDateWidget?
I’m asking because I want my application to have a jQueryUI datepicker for inputting dates.
I’ve considered a custom field that extends django.db.models.DateField with my custom widget. Is this the best way to implement this sort of across-the-board change? Such a change will require specifically importing a special MyDateField into every model, which is labour intensive, prone to developer error (i.e. a few models.DateField’s will get through), and in my mind seems like unnecessary duplication of effort. On the other hand, I don’t like modifying what could be considered the canonical version of models.DateField.
Thoughts and input is appreciated.
You can declare an attribute on your
ModelFormclass, calledformfield_callback. This should be a function which takes a Django modelFieldinstance as an argument, and returns a formFieldinstance to represent it in the form.Then all you have to do is look to see if the model field passed in is an instance of
DateFieldand, if so, return your custom field/widget. If not, the model field will have a method namedformfieldthat you can call to return its default form field.So, something like: