Django - DateTime 小部件格式

Posted

技术标签:

【中文标题】Django - DateTime 小部件格式【英文标题】:Django - DateTime Widget format 【发布时间】:2012-05-01 02:51:48 【问题描述】:

我正在尝试实现 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" />

【问题讨论】:

【参考方案1】:

为您的 DateTimeInput 实例提供 format 参数:

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'

如果attrs 字典中没有指定format,这将默认为您想要的format 字符串:

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

要在.render() 方法中操作value,您可以使用:

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

或者您可以像这样覆盖DateTimeWidget 中的render

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

希望对您有所帮助。

【讨论】:

用更新后问题的解决方案更新了我的答案:)

以上是关于Django - DateTime 小部件格式的主要内容,如果未能解决你的问题,请参考以下文章

PyQt QTabWidget 多角小部件

Dojo 选择小部件验证

使用 QtDesigner PyQt4 创建自定义小部件

每个选项卡小部件的 PyQt 选项

在 Qt 小部件中的视频顶部绘画

Qt 的鼠标事件