2016-11-28 74 views
2

我使用的是Django Built-in forms,更確切地說是PasswordChangeForm。如何將CSS類添加到Django內置表單

它完美的工作,直到我希望它看起來像網站的其餘部分(Bootstrap)。 我跟着這個answer被繼承類的方法,並通過建立自己的一個新問題:

class PasswordChangeCustomForm(PasswordChangeForm): 
    old_password = CharField(required=True, 
        widget=PasswordInput(attrs={ 
        'class': 'form-control'})) 

    new_password1 = CharField(required=True, 
        widget=PasswordInput(attrs={ 
        'class': 'form-control'})) 

    new_password2 = CharField(required=True, 
        widget=PasswordInput(attrs={ 
        'class': 'form-control'})) 

但它讓我很煩,重複所有這些代碼。 是否有另外一種方法可以實現同樣的功能(將類form-control添加到每個字段中)而不重寫每個字段?

回答

4

隨着不重寫領域的目標,我發現我可以簡單地更新了Widget:

class PasswordChangeCustomForm(PasswordChangeForm): 
    def __init__(self, user, *args, **kwargs): 
     super(PasswordChangeCustomForm, self).__init__(user, *args, **kwargs) 
     self.fields['old_password'].widget.attrs.update({'class': 'form-control'}) 
     self.fields['new_password1'].widget.attrs.update({'class': 'form-control'}) 
     self.fields['new_password2'].widget.attrs.update({'class': 'form-control'}) 

自舉(所有領域所需要的類form-control)特別有用的是answer從@丹尼爾 - 羅斯曼:

class PasswordChangeCustomForm(PasswordChangeForm): 
    def __init__(self, user, *args, **kwargs): 
     super(PasswordChangeCustomForm, self).__init__(user,*args, **kwargs) 
     for field in self.fields: 
      self.fields[field].widget.attrs['class'] = 'form-control' 
3

你可以把你的代碼一步,並自動更新所有的部件:

super(PasswordChangeCustomForm, self).__init__(*args, **kwargs) 
for field in self.fields.values(): 
    field.widget.attrs['class'] = 'form-control' 
+0

你的代碼給出了一個AttributeError''str'對象沒有屬性'widget'。我解決了它。 – NBajanca

+0

是的,很抱歉,已更新。 –