如何向django表单字段添加其他类

mis*_*bah 4 css forms django django-templates

我刚刚了解到:

Form.error_css_class
Form.required_css_class
Run Code Online (Sandbox Code Playgroud)

文档:https://docs.djangoproject.com/en/dev/ref/forms/api/#django.forms.Form.error_css_class

因此,通过在表单中​​定义'error_css_class'和'required_css_class'

class MyForm(forms.Form):
    error_css_class = 'error'
    required_css_class = 'required'

    name = forms.CharField(...)
Run Code Online (Sandbox Code Playgroud)

我可以:

<div class="field-wrapper {{ form.name.css_classes }}">
...
</div>
Run Code Online (Sandbox Code Playgroud)

这将输出:

<div class="field-wrapper required">
...
</div>
Run Code Online (Sandbox Code Playgroud)

但是我想在字段中添加其他类,例如我想为"name"字段添加"text name"css类.阅读文档,我认为它是可能的.

https://docs.djangoproject.com/en/dev/ref/forms/api/#django.forms.BoundField.css_classes

看完上面后我试着去做

self.fields['name'].css_classes('name text')
Run Code Online (Sandbox Code Playgroud)

这不起作用.我明白了

'CharField' object has no attribute 'css_classes'
Run Code Online (Sandbox Code Playgroud)

我也试过了

name = forms.CharField(css_classes='name text')
Run Code Online (Sandbox Code Playgroud)

类型错误

__init__() got an unexpected keyword argument 'css_classes'
Run Code Online (Sandbox Code Playgroud)

我知道我可以在字段小部件中添加额外的attr

self.fields['name'].widget.attrs['class'] = 'name text'
Run Code Online (Sandbox Code Playgroud)

但我想将css类添加到字段包装器中.

我可以编写一个自定义模板标签...来检查字段名称/类型并返回适当的css类...但如果有内置的东西..我希望保持我的模板清洁:-).

每个字段的硬编码css类也不是一个选项..因为表单字段是动态的.

任何帮助将不胜感激.

mis*_*bah 6

我想出了如何使用自定义BoundField来做到这一点

from django.forms import forms

class CustomBoundField(forms.BoundField):

    def css_classes(self, extra_classes=None):
        # logic for determining css_classes has been omitted 
        extra_classes = ['name', 'text']
        return super(CustomBoundField, self).css_classes(extra_classes=extra_classes)
Run Code Online (Sandbox Code Playgroud)

在我的表格中,我覆盖了getitem

def __getitem__(self, name):
    try:
        field = self.fields[name]
    except KeyError:
        raise KeyError('Key %r not found in Form' % name)
    return CustomBoundField(self, field, name)
Run Code Online (Sandbox Code Playgroud)