2016-11-28 69 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

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

相关问题