Pierre de LESPINAY
Pierre de LESPINAY

Reputation: 46188

Django - DateTime Widget format

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

Answers (1)

cfedermann
cfedermann

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

Related Questions