Reputation: 46188
I'm trying to implement a DateTimePicker Widget.
Widget
class DateTimeWidget(forms.DateTimeInput):
class Media:
js = ('js/jquery-ui-timepicker-addon.js',)
def __init__(self, attrs=None):
if attrs is not None:
self.attrs = attrs.copy()
else:
self.attrs = {'class': 'datetimepicker'}
Form
class SessionForm(forms.ModelForm):
class Meta:
model = Event
widgets = {'start_time': DateTimeWidget(),
'end_time': DateTimeWidget()}
Template
{{ form.media }}
<form action="/event/post" method="post">{% csrf_token %}
{{ form.as_p }}
</form>
<script type="text/javascript">
$('.datetimepicker').datetimepicker({
dateFormat: 'yy-mm-dd'
});
</script>
The DateTimePicker is well rendered but the format is the default one %Y-%m-%d %H:%M:%S
How can I remove the seconds (to have %Y-%m-%d %H:%M) ?
Edit
I'm trying to get
<input type="text" class="datetimepicker" value="2012-04-18 11:01" />
instead of
<input type="text" class="datetimepicker" value="2012-04-18 11:01:05" />
Upvotes: 2
Views: 6843
Reputation: 3284
Supply a format
argument for your DateTimeInput
instances:
class DateTimeWidget(forms.DateTimeInput):
class Media:
js = ('js/jquery-ui-timepicker-addon.js',)
def __init__(self, attrs=None):
if attrs is not None:
self.attrs = attrs.copy()
else:
self.attrs = {'class': 'datetimepicker'}
if not 'format' in self.attrs:
self.attrs['format'] = '%Y-%m-%d %H:%M'
This will default to your desired format
string if no format
specification is given within the attrs
dictionary:
In [1]: dw = DateTimeWidget()
In [2]: dw.render("foo", "bar")
Out[1]: u'<input value="bar" type="text" class="datetimepicker" \
name="foo" format="%Y-%m-%d %H:%M" />'
If need be, you can overwrite the format, say with %Y-%m-%d
:
In [3]: dw = DateTimeWidget({'format': "%Y-%m-%d"})
In [4]: dw.render("foo", "bar")
Out[4]: u'<input type="text" name="foo" value="bar" format="%Y-%m-%d" />'
To manipulate the value
inside the .render()
method, you can either use:
In [5]: dw = DateTimeWidget()
In [6]: now = datetime.now()
In [7]: dw.render("foo", now.strftime('%Y-%m-%d %H:%M'))
Out[7]: u'<input value="2012-04-19 17:17" type="text" class="datetimepicker" \
name="foo" format="%Y-%m-%d %H:%M" />'
Or you can override render
in DateTimeWidget
like this:
def render(self, name, value, attrs=None):
value = value.strftime(self.attrs['format'])
return super(forms.DateTimeInput, self).render(name, value, attrs)
This would give the following output (without the need to call .strftime()
):
In [8]: dw = DateTimeWidget()
In [9]: dw.render("foo", datetime.now())
Out[9]: u'<input value="2012-04-19 17:27" type="text" class="datetimepicker" \
name="foo" format="%Y-%m-%d %H:%M" />'
Hope that helps.
Upvotes: 4