Flask与Django的表单类(待续)

两者都是定义个form.py脚本文件,然后在views.py中导入到对应的视图函数中

Flask的表单类

from flask_wtf import FlaskForm
Flask表单类写在自定义的form.py文件中,然后再views.py文件中导入该form.py文件,将该文件中的各种表单类加入到对应的视图函数中,然后render_template(xx.html,form=form)渲染html页面时候当作form关键字传入

class LoginForm1(FlaskForm): # 登录表单
    name = StringField('name',validators=[DataRequired()])
    # StringField第二个参数可以不加关键字传入
    password = StringField('password',[DataRequired()])

使用场景

Django的表单类

from django import forms

class VocationForm(forms.Form): # form.Form的字段和models中的字段类似
    job = forms.CharField(max_length=20, label='职位') 
    # 设置字段参数widget、error_messages
    # 参数widwget必须是个forms.widgets对象,而widwget的对象必须和表单字段类型相互对应,对应该则分为4大类,该定义的函数中可以传入css样式的class,id等属性
    title = forms.CharField(max_length=20, label='职称', #下面这句话啥意思
                            # 以修饰的css样式为先,但它这里还能更改html表单的类型,TextInput表述文本框,若是charfield显示下拉框,优先使用文本框
                            widget=forms.widgets.TextInput(attrs={'class': 'c1'}), # 设置表单的css样式,TextInput表示文本输入框,要和charfield输入样式相同
                            error_messages={'required': '职称不能为空'},) # 设置验证失败后的参数信息,字典的键为表单的参数名称,字典的值为错误信息
    # 设置字段参数validators;validators参数一定要列表形式么;该参数是自定义验证函数
    payment = forms.IntegerField(label='薪资',validators=[payment_validate]) # IntegerField字段还可以添加额外验证函数
    # 设置下拉框的值
    # 查询模型PersonInfo的数据
    value = PersonInfo.objects.values('name')
    # 将数据以为列表格式表示,列表元素为元组格式
    choices = [(i+1, v['name']) for i, v in enumerate(value)] # enumerate()生成(索引,值)的列表
    # 表单字段设为ChoiceField类型,用生成下拉框
    person = forms.ChoiceField(choices=choices, label='姓名')

    # 自定义表单字段title的数据清洗(修改该字段的返回值)
    # 最好函数名要与获取的表单字段名一样,方便阅读
    def clean_job(self): # 函数应该是自定义的,并不是,返回值的话会返回给该字段
        # 获取字段title的值
        # 类可以调用方法中的属性,是由于有self么
        # 提取的是表单字段的属性
        data = self.cleaned_data['job'] # cleaned_data是默认的属性
        return '初级' + data  # 通过views.py返回给终端

上方的是普通表单类,需要注意字段类型与数据库模型进行转换
下方的是模型表单

class VocationForm(forms.ModelForm):
    # 添加模型外的表单字段;在模型已有的字段下再添加字段;添加的html位置在表单最下方
    LEVEL = (('L1', '初级'),
             ('L2', '中级'),
             ('L3', '高级'),)
    level = forms.ChoiceField(choices=LEVEL, label='级别') # 看来choices的前缀L1,L2之类的就是索引
    # 模型与表单设置
    class Meta:
        # 绑定模型
        model = Vocation
        # 以下属性都是函数modelform_factory的属性
        # fields属性用于设置转换字段,'__all__'是将全部模型字段转换成表单字段
        # fields = '__all__'
        # fields = ['job', 'title', 'payment', 'person']
        # exclude用于禁止模型字段转换表单字段
        exclude = []
        # labels设置HTML元素控件的label标签
        labels = {
            'job': '职位',
            'title': '职称',
            'payment': '薪资',
            'person': '姓名'
        }
        # 定义widgets,设置表单字段的CSS样式
        widgets = {
            'job': forms.widgets.TextInput(attrs={'class': 'c1'}),
        }
        # 重新定义字段类型
        # 一般情况下模型字段会自动转换成表单字段
        field_classes = {
            'job': forms.CharField
        }
        # 帮助提示信息
        help_texts = {
            'job': '请输入职位名称'
        }
        # 自定义错误信息
        error_messages = {
            # __all__设置全部错误信息
            '__all__': {'required': '请输入内容',
                        'invalid': '请检查输入内容'},
            # 设置某个字段的错误信息
            'title': {'required': '请输入职称',
                      'invalid': '请检查职称是否正确'}
        }
    # 自定义表单字段payment的数据清洗
    def clean_payment(self):
        # 获取字段payment的值
        data = self.cleaned_data['payment'] + 1
        return data

posted @ 2022-04-27 16:56  索匣  阅读(32)  评论(0编辑  收藏  举报