2014-05-18 77 views
4

我剛剛瞭解到:如何添加其他的類Django的表單字段

Form.error_css_class 
Form.required_css_class 

文件:所以通過定義形式 'error_css_class' 和 'required_css_class' https://docs.djangoproject.com/en/dev/ref/forms/api/#django.forms.Form.error_css_class

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

    name = forms.CharField(...) 

我可以做的:

<div class="field-wrapper {{ form.name.css_classes }}"> 
... 
</div> 

這將輸出:

<div class="field-wrapper required"> 
... 
</div> 

不過,我想其他類添加到字段,e.g我想補充「文本名稱」的CSS類的「姓名」字段。閱讀文檔,我認爲它是可能的。

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

看完上面我試圖做

self.fields['name'].css_classes('name text') 

這是行不通的。我得到

'CharField' object has no attribute 'css_classes' 

我也試過

name = forms.CharField(css_classes='name text') 

類型錯誤

__init__() got an unexpected keyword argument 'css_classes' 

我知道我可以添加額外的ATTR到字段部件

self.fields['name'].widget.attrs['class'] = 'name text' 

但我想添加CSS類到字段包裝器。

我可以編寫一個自定義模板標籤來檢查字段名稱/類型並返回相應的CSS類...但如果有內置的東西..我很想保持我的模板清潔:-)。

也硬編碼每個字段的css類不是一個選項..因爲表單字段是動態的。

任何幫助將不勝感激。

回答

5

我想出如何利用一個自定義的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) 

在我的形式做到這一點,我在此改變的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) 
+0

大,避免硬編碼將屬性添加到CustomBoundField類:並在css_classes中調用self.extra_classes – aiho

相關問題