django-如何从自定义小部件内部访问表单字段
下面的类继承自Textarea小部件,并使用javascript代码显示用户在Textarea中可以输入的字符数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
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