【问题标题】:How to add attributes to all instances of a django form widget?如何为 django 表单小部件的所有实例添加属性?
【发布时间】:2015-10-19 13:33:36
【问题描述】:

所以我正在使用引导程序构建 Django 表单,并且我知道我可以使用以下方法为表单添加属性(例如类):

username = forms.CharField(max_length=24, widget=forms.TextInput(attrs={'class':'form-control', 'placeholder': 'Your desired username.'}))

但我无法找到将类属性应用于所有 TextInput(或任何其他小部件类)的任何方法。 This 没有帮助我,因为它看起来只允许您设置整个样式表而不仅仅是属性。

我不想违反 DRY,那么如何将某个属性应用于所有 TextInput(或其他小部件)实例?

【问题讨论】:

    标签: django django-forms


    【解决方案1】:

    只需创建您自己的 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 子句,但那是您尝试的。

    【讨论】:

    • 没有办法覆盖实际的 CharField 类,还是只是不好的做法?
    • 你的意思是来自django.forms的CharField?不......那不是你的代码。但是您可以有一个 formfields.py 文件并将其导入到您的 forms.py 中,并且什么都不会注意到。
    • 好的。我要把这个类放在forms.py中吗?
    • 这取决于你把它放在哪里。它需要在 forms.py 中可用,因此将它放在 forms.py 中会更容易,但也会更混乱。如前所述,您也可以将其放在单独的文件中。这正在进入python导入的工作方式。这在网络上已经回答了很多次了。
    【解决方案2】:

    简单的方法:

    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

    【讨论】:

      猜你喜欢
      • 2020-01-12
      • 2015-01-10
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-24
      • 2011-04-30
      相关资源
      最近更新 更多