如何将属性添加到 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