ModelForm和BootStrap实现BootStrap父类

145 阅读1分钟
  • ModelForm可以帮助我们生成HTML标签,但是只会生成普通的input框
class UserModelForm(forms.ModelForm):
    # 验证name长度最小为3
    name = forms.CharField(min_length=2, label='姓名')

    class Meta:
        model = models.UserInfo
        fields = ['name', 'password']
 form = UserModelForm()
{{form.name}}      普通的input框
{{form.password}}  普通的input

重新定义init方法,批量设置

class UserModelForm(forms.ModelForm):
    class Meta:
        model = models.UserInfo
        fields = ['name', 'password']

    # 给输入框加上自定义样式,循环找到所有插件,添加了class
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        #循环ModelForm中的所有字段,给每个字段的插件设置
        for name, field in self.fields.items():
            #字段中有属性,就保留原来的属性,没有属性就增加
            if field.widget.attrs:
                field.widget.attrs['class'] = 'form-control'
                field.widget.attrs['placeholder'] = field.label
            else:
                field.widget.attrs = {
                'class': 'form-control', 
                'placeholder': field.label
                }

每一个form都需要添加一遍比较麻烦,可以自定义一个类,

class BootStrapModelForm(forms.ModelForm):
    
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        for name, field in self.fields.items():
            if field.widget.attrs:
                field.widget.attrs['class'] = 'form-control'
                field.widget.attrs['placeholder'] = field.label
            else:
                field.widget.attrs = {
                'class': 'form-control', 
                'placeholder': field.label
                }

使用的时候继承

class UserModelForm(BootStrapModelForm):
    class Meta:
        model = models.UserInfo
        fields = ['name', 'password']

使用

然后把这个类拆出来,成为一个公共类 在utills中新建一个bootstrap.py文件,写入以下代码

image.png

然后使所有的modelform继承BootStrapModelForm