2

我正在为日期时间字段创建自定义小部件:

class MySplitDateTimeWidget(forms.SplitDateTimeWidget):
    def format_output(self, rendered_widgets):
        mytimeid = self.widgets[1].attrs['id']  #####NEED HELP HERE
        temp = "javascript:$('%s').val(new Date().getHours());" % mytimeid
        temp1 = '<a href="%s">Now</a>' % temp
        return mark_safe(u'%s %s<br />%s %s %s' % \
            (_('Date:'), rendered_widgets[0], _('Time:'), rendered_widgets[1],
            temp1
        ))

我需要小部件的“id”属性,但是 self.widgets 不包括 attrs 中的“id”属性。它包括所有其他属性。我不确定这个属性来自哪里?

4

2 回答 2

1

我只是在努力解决完全相同的事情;希望这对其他人有用。“id”属性通过以下方式设置:

  1. 表单被要求呈现自己
  2. 表单遍历其字段
  3. 对于每个字段,表单调用其自定义__getitem__(),将字段包装为 BoundField
  4. as_widget()方法中的 BoundField 是实际设置“id”属性的内容(另请参见auto_id()方法)
  5. MultiWidget 然后执行它的render()方法,该方法呈现它的每个子小部件,然后将它们与format_output()

因此,要回答您的问题,您需要获取方法中的 IDrender()而不是format_output()方法:

class MySplitDateTimeWidget(forms.SplitDateTimeWidget):
    def render(self, name, value, attrs=None):
        widgets_html = super(MySplitDateTimeWidget, self).render(name, value, attrs)

        # attrs['id'] is the ID of the entire widget, append the prefix to chose the sub-widget
        mytimeid = attrs['id'] + '_0' 
        temp = "javascript:$('%s').val(new Date().getHours());" % mytimeid
        temp1 = '<a href="%s">Now</a>' % temp

        return mark_safe(widgets_html + ' ' + temp1)

    def format_output(self, rendered_widgets):
        return mark_safe(u'%s %s<br />%s %s' % (_('Date:'), rendered_widgets[0], _('Time:'), rendered_widgets[1]))
于 2014-11-07T06:11:20.737 回答
0

除非您已将其覆盖,否则ID应为:

id_[名称]

所以试试:

mytimeid = 'id_'+self.widgets[1].attrs['name']
于 2012-11-09T04:12:25.113 回答