FlaskForm仅继承部分字段时父表单必填项校验报错如何解决?
解决方案
你可以通过以下几种方式实现需求,既保留字段复用性,又避免不必要的校验:
方案1:拆分父类层级(最推荐,可维护性最高)
把所有子类通用的字段抽为最基础的父类,再针对需要额外字段的场景封装中间父类,避免不需要的字段被继承:
from wtforms.validators import Optional # 最基础的公共父类,只有所有表单都需要的number_b字段 class BaseForm(FlaskForm): number_b = StringField('B', validators=[DataRequired()], render_kw={"placeholder":"B", 'class_':'input', 'id':'number_b'}) # 需要number_a的表单继承这个中间父类 class FormWithA(BaseForm): number_a = StringField('A', validators=[DataRequired()], render_kw={"placeholder":"A", 'class_':'input', 'id':'number_a'}) class Child1Form(FormWithA): number_c = StringField('C', validators=[DataRequired()], render_kw={"placeholder":"C", 'class_':'input', 'id':'number_c'}) class Child2Form(BaseForm): number_d = StringField('D', validators=[DataRequired()], render_kw={"placeholder":"D", 'class_':'input', 'id':'number_d'})
这种方式后续新增表单时,直接按需继承对应父类即可,不需要重复定义字段,适配你后续大量表单复用字段的需求。
方案2:在不需要对应字段的子类中移除字段
如果不想调整现有继承结构,可以直接在子类中将不需要的字段赋值为None,FlaskForm会自动忽略该字段,不会触发校验:
class Child2Form(ParentForm): # 移除不需要的number_a字段 number_a = None number_d = StringField('D', validators=[DataRequired()], render_kw={"placeholder":"D", 'class_':'input', 'id':'number_d'})
方案3:覆盖字段的校验规则
如果部分场景需要保留number_a字段但不需要必填校验,可以在子类中重写该字段的校验器,其他渲染配置可以复用父类逻辑:
class Child2Form(ParentForm): # 仅修改number_a的校验规则为非必填,其他配置保留父类定义 number_a = StringField('A', validators=[Optional()], render_kw={"placeholder":"A", 'class_':'input', 'id':'number_a'}) number_d = StringField('D', validators=[DataRequired()], render_kw={"placeholder":"D", 'class_':'input', 'id':'number_d'})
内容的提问来源于stack exchange,提问作者Valters Sējāns
相关产品推荐
相关产品推荐

