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 には属性に「id」属性が含まれていません。ただし、他のすべての属性が含まれます。この属性がどこから来たのかわかりませんか?

4

2 に答える 2

1

私はまったく同じことに取り組んでいました。うまくいけば、これは他の人にも役立ちます。「id」属性は次の方法で設定されます。

  1. フォームはそれ自体をレンダリングするように求められます
  2. フォームはそのフィールドを反復します
  3. フィールドごとに、フォームは__getitem__()フィールドを BoundField としてラップするカスタムを呼び出します。
  4. メソッド内の BoundField は、as_widget()実際に「id」属性を設定するものです (auto_id()メソッドも参照してください) 。
  5. 次に、MultiWidget はそのrender()メソッドを実行します。これにより、子ウィジェットがそれぞれレンダリングされ、次にそれらが結合されます。format_output()

したがって、質問に答えるには、render()メソッドではなくメソッドでID を取得する必要があります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 に答える