django-如何从自定义小部件内部访问表单字段

django-如何从自定义小部件内部访问表单字段,django,django-forms,Django,Django Forms,下面的类继承自Textarea小部件,并使用javascript代码显示用户在Textarea中可以输入的字符数 class TextAreaWithCharCounter(forms.Textarea): class Media: js = ('js/jquery.charcounter.js',) def render(self, name, value, attrs = None): id = attrs['id'] ma

下面的类继承自Textarea小部件,并使用javascript代码显示用户在Textarea中可以输入的字符数

class TextAreaWithCharCounter(forms.Textarea):

    class Media:
        js = ('js/jquery.charcounter.js',)

    def render(self, name, value, attrs = None):
        id = attrs['id']
        max_length = self.attrs.get('max_length', 200)
        output = super(TextAreaWithCharCounter, self).render(name, value, attrs)
        output += mark_safe(u'''
                        <script type="text/javascript">
                        $("#%s").charCounter(%d, {classname:"charcounter"});
                        </script>'''%(id, max_length))        
        return output

您可以看到,我将
max_length
参数传递了两次,一次用于字段,另一次用于小部件。更好的方法可能是从小部件内部访问表单字段并获取其max_length属性,这样小部件就不需要max_length参数。我怎样才能做到这一点呢?

从技术上讲,小部件不必与字段有直接关系,所以您不需要这样做

查看,您可以看到它有一个
widget\u attrs
方法,该方法自动将
maxlength
属性添加到
TextInput
/
密码输入
字段

我建议您使用一个自定义字段来覆盖此方法,并为您的自定义小部件添加一个属性


另外,我不确定将其保留在
attrs
中是否是一个好主意,因为
将使用无效的
max_length
参数呈现。也许您应该将其关闭。

虽然解决问题不需要它,但访问表单或表单字段有时确实很有用。请参阅的完整答案,但简而言之,您可以在表单
\uuuu init\uuu
中手动将表单或字段绑定到小部件:

class MyForm(forms.ModelForm):
    foo = forms.ModelChoiceField(Foo.objects, widget=CustomWidget())

    class Meta:
        model = Bar

    def __init__(self, *args, **kwargs):
        super(MyForm, self).__init__(*args, **kwargs)
        self.fields['foo'].widget.form_instance = self

从表单类内部,您可以通过
self.instance
访问模型实例。请记住,在添加/创建新对象时,实例将相当空白。在最新版本中,您可以通过
value.instance
render(self,name,value,attrs=None)中访问实例。
class MyForm(forms.ModelForm):
    foo = forms.ModelChoiceField(Foo.objects, widget=CustomWidget())

    class Meta:
        model = Bar

    def __init__(self, *args, **kwargs):
        super(MyForm, self).__init__(*args, **kwargs)
        self.fields['foo'].widget.form_instance = self