我希望我的表单具有class='form-control'
属性。
与添加:
相反def __init__(self, *args, **kwargs):
super(<form name>, self).__init__(*args, **kwargs)
self.auto_id = False
for key in self.fields:
self.fields[key].widget.attrs.update(
{'class' : 'form-control',
'placeholder':self.fields[key].label
})
对于每种形式,都会更容易:
class BootstrapForm(object):
def __init__(self, *args, **kwargs):
super(BootstrapForm, self).__init__(*args, **kwargs)
self.auto_id = False
for key in self.fields:
self.fields[key].widget.attrs.update(
{'class' : 'form-control',
'placeholder':self.fields[key].label
})
class LoginForm(forms.Form, BootstrapForm):
#.... stuff ....
但这不起作用。
有没有用DRY原则解决这个问题?
答案 0 :(得分:1)
不是应用mixin,而是定义一个基类Form
类,在每个字段小部件上设置form-control
类:
class BootstrapForm(forms.Form):
def __init__(self, *args, **kwargs):
super(BootstrapForm, self).__init__(*args, **kwargs)
self.auto_id = False
for key in self.fields:
self.fields[key].widget.attrs.update(
{'class' : 'form-control',
'placeholder':self.fields[key].label
})
然后,您的表单将继承自BootstrapForm
:
class LoginForm(BootstrapForm):
# stuff
仅供参考,django-forms-bootstrap
包采用另一种方法 - 它通过引入自定义on the fly模板过滤器添加form-control
类|as_bootstrap
:
<form>
<legend>My Form</legend>
{% csrf_token %}
{{ form|as_bootstrap }}
<div class="form-actions">
<a href="#back" class="btn">Go back</a>
<button type="submit" class="btn btn-primary">Save changes</button>
</div>
</form>
另一方面,django-bootstrap3
定义custom Field renderers,负责设置form-control
class。