2

DateTimePickerウィジェットを実装しようとしています。

ウィジェット

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'}

class SessionForm(forms.ModelForm):
  class Meta:
    model = Event
    widgets = {'start_time': DateTimeWidget(),
               'end_time': DateTimeWidget()}

レンプレート

{{ 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>

DateTimePickerは適切にレンダリングされますが、形式はデフォルトです%Y-%m-%d%H:%M:%S

秒を削除するにはどうすればよいですか(%Y-%m-%d%H:%Mにするため)?


編集

私は取得しようとしています

<input type="text" class="datetimepicker" value="2012-04-18 11:01" />

それ以外の

<input type="text" class="datetimepicker" value="2012-04-18 11:01:05" />
4

1 に答える 1

4

インスタンスのformat引数を指定します。DateTimeInput

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'

辞書に指定がない場合、これはデフォルトで目的のformat文字列になります。formatattrs

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" />'

必要に応じて、次のようにフォーマットを上書きできます%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" />'

valueメソッドの内部を操作するには、次の.render()いずれかを使用できます。

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" />'

renderまたは、次のDateTimeWidgetようにオーバーライドできます。

  def render(self, name, value, attrs=None):
    value = value.strftime(self.attrs['format'])
    return super(forms.DateTimeInput, self).render(name, value, attrs)

これにより、次の出力が得られます(を呼び出す必要はありません.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" />'

お役に立てば幸いです。

于 2012-04-19T14:57:20.663 に答える