我们在django中用form自动创建表单的时候,正常创建是没有任何样式的,我们可以采用以下两种方式去给我们的表单加上bootstrap的样式
from django import forms
class UserAdd(forms.ModelForm):
name = forms.CharField(min_length=3,label='用户名',widget=forms.TextInput(attrs={"class":"form-control"})
class Meta:
model = models.UserInfo
fields = ["name","password","age"]
from django import forms
class UserAdd(forms.ModelForm):
name = forms.CharField(min_length=3)
class Meta:
model = models.UserInfo
fields = ["name","password","age","creat_time","gender","depart"]
widgets = {
"name" : forms.TextInput(attrs={"class":"form-control"}),
}
问题就来了,这样太那麻烦了,我们还可以重新定义一个init方法,循环modelform中的所有字段,给每个字段的插件设置一个属性,但是这样是直接设置了属性,要是原本的字段有属性就会被覆盖。
from django import forms
class UserAdd(forms.ModelForm):
name = forms.CharField(min_length=3)
class Meta:
model = models.UserInfo
fields = ["name","password","age","creat_time","gender","depart"]
# widgets = {
# "name" : forms.TextInput(attrs={"class":"form-control"}),
# }
#循环modelform中的所有字段,给每个字段的插件设置一个属性
def __init__(self,*args,**kwargs):
super().__init__(*args,**kwargs)
for name,field in self.fields.items():
field.widget.attrs = {"class": "form-control"}
改进,加入if else语句,解决上述问题
但是这里考虑到代码重复的问题,利用类和面向对象中的继承,我写一个BootStrapModelForm的大类,让他单独放到一个目录里面然后进行继承,这样我的视图函数里面就只有下面的一点内容
#先自定义类
class BootStrapModelForm(forms.ModelForm):
#循环modelform中的所有字段,给每个字段的插件设置一个属性
def __init__(self,*args,**kwargs):
super().__init__(*args,**kwargs)
for name,field in self.fields.items():
#字段中有属性,保留,没有则添加
if field.widget.attra:
field.widget.attrs['class'] = 'form-control'
field.widget.attrs['placeholder'] = field.label
else:
field.widget.attrs = {
'class' : 'form-control',
'placeholder' : field.label}
#继承
class UserEditModelForm(BootStrapModelForm):
class Meta:
model = model.UserInfo
fields = ['name','password','age']
演示图
view视图函数中的各项包括form都可以再分的,我这里将视图函数中的各个函数、form和继承的bootstrap都分开了