如何将属性添加到 django 表单小部件的所有实例?
How to add attributes to all instances of a django form widget?
所以我正在使用 bootstrap 构建 Django 表单,并且我知道我可以使用以下方式添加属性(例如 class)我的表单:
username = forms.CharField(max_length=24, widget=forms.TextInput(attrs={'class':'form-control', 'placeholder': 'Your desired username.'}))
但我无法找到任何方法将 class 属性应用于所有 TextInput(或任何其他小部件 class)。 This 对我没有帮助,因为它看起来只允许您设置整个样式表而不仅仅是属性。
我不想违反 DRY,那么如何将特定属性应用于所有 TextInput(或其他小部件)实例?
只需创建您自己的 CharField 来实现您自己的 widget_attrs 方法:
原文:
class CharField(Field, forms.CharField):
widget = TextInput
def widget_attrs(self, widget):
attrs = super(CharField, self).widget_attrs(widget)
if attrs is None:
attrs = {}
if self.max_length is not None and isinstance(widget, (TextInput, HiddenInput)):
# The HTML attribute is maxlength, not max_length.
attrs.update({'maxlength': str(self.max_length)})
return attrs
一条建议:
class MyCharField(forms.CharField):
def widget_attrs(self, widget):
attrs = super(MyCharField, self).widget_attrs(widget)
attrs.update({'class':'form-control', 'placeholder': 'Your desired username.'})
if self.max_length is not None and isinstance(widget, (forms.TextInput, forms.HiddenInput)):
# The HTML attribute is maxlength, not max_length.
attrs.update({'maxlength': str(self.max_length)})
return attrs
如果您总是指定一个,您也可以省略 max_length
的 if 子句,但那只是为了让您尝试一下。
简单的方法:
def set_attrs_for_fields(fields, default_attrs):
for field_name in fields:
field = fields[field_name]
try:
default_widget_attr = default_attrs[field.widget.__class__]
for k, v in default_widget_attr.items():
field.widget.attrs[k] = v
except KeyError:
pass
class MyForm(ProjFormBase):
def __init__(self, *args, **kwargs):
super(MyForm, self).__init__(*args, **kwargs)
set_attrs_for_fields(self.fields, self.get_default_attrs())
def get_default_attrs(self):
return {
forms.TextInput: {'class': 'form-control'},
forms.EmailInput: {'class': 'form-control'},
forms.PasswordInput: {'class': 'form-control'},
}
或者,您可以在此处使用自定义过滤器检查:Adding css classes to formfields in Django Templates
所以我正在使用 bootstrap 构建 Django 表单,并且我知道我可以使用以下方式添加属性(例如 class)我的表单:
username = forms.CharField(max_length=24, widget=forms.TextInput(attrs={'class':'form-control', 'placeholder': 'Your desired username.'}))
但我无法找到任何方法将 class 属性应用于所有 TextInput(或任何其他小部件 class)。 This 对我没有帮助,因为它看起来只允许您设置整个样式表而不仅仅是属性。
我不想违反 DRY,那么如何将特定属性应用于所有 TextInput(或其他小部件)实例?
只需创建您自己的 CharField 来实现您自己的 widget_attrs 方法:
原文:
class CharField(Field, forms.CharField):
widget = TextInput
def widget_attrs(self, widget):
attrs = super(CharField, self).widget_attrs(widget)
if attrs is None:
attrs = {}
if self.max_length is not None and isinstance(widget, (TextInput, HiddenInput)):
# The HTML attribute is maxlength, not max_length.
attrs.update({'maxlength': str(self.max_length)})
return attrs
一条建议:
class MyCharField(forms.CharField):
def widget_attrs(self, widget):
attrs = super(MyCharField, self).widget_attrs(widget)
attrs.update({'class':'form-control', 'placeholder': 'Your desired username.'})
if self.max_length is not None and isinstance(widget, (forms.TextInput, forms.HiddenInput)):
# The HTML attribute is maxlength, not max_length.
attrs.update({'maxlength': str(self.max_length)})
return attrs
如果您总是指定一个,您也可以省略 max_length
的 if 子句,但那只是为了让您尝试一下。
简单的方法:
def set_attrs_for_fields(fields, default_attrs):
for field_name in fields:
field = fields[field_name]
try:
default_widget_attr = default_attrs[field.widget.__class__]
for k, v in default_widget_attr.items():
field.widget.attrs[k] = v
except KeyError:
pass
class MyForm(ProjFormBase):
def __init__(self, *args, **kwargs):
super(MyForm, self).__init__(*args, **kwargs)
set_attrs_for_fields(self.fields, self.get_default_attrs())
def get_default_attrs(self):
return {
forms.TextInput: {'class': 'form-control'},
forms.EmailInput: {'class': 'form-control'},
forms.PasswordInput: {'class': 'form-control'},
}
或者,您可以在此处使用自定义过滤器检查:Adding css classes to formfields in Django Templates