继承具有验证的基础烧瓶形式

问题描述 投票:0回答:2

我有一个烧瓶形式,这里是代码的一部分:

class BaseForm(FlaskForm):
    username = TextField('Username')
    email = TextField('Email', [validators.Required('Please enter your email address.'), validators.Length(min=6, message=('Too short for an email address?')), validators.Email(message=('Enter a valid email address.'))
    ])
    password = PasswordField('Password')
    register = SubmitField('Register')

class RegisterForm(BaseForm):
    BaseForm.username
    BaseForm.email
    BaseForm.password
    BaseForm.register

当我使用上面的代码时,不会呈现错误消息,但是,当我使用下面的代码时,会呈现错误:

class BaseForm(FlaskForm):
    username = TextField('Username')
    email = TextField('Email', [validators.Required('Please enter your email address.'), validators.Length(min=6, message=('Too short for an email address?')), validators.Email(message=('Enter a valid email address.'))
    ])
    password = PasswordField('Password')
    register = SubmitField('Register')

class RegisterForm(BaseForm):
    BaseForm.username
    email = TextField('Email', [validators.Required('Please enter your email address.'), validators.Length(min=6, message=('Too short for an email address?')), validators.Email(message=('Enter a valid email address.'))
    ])
    BaseForm.password
    BaseForm.register

所以在我看来,这里的问题是验证不是与字段一起继承的,也可能是我不理解的。我正在努力减少代码编写。请帮我实现我尝试的表单继承,告诉我如何使用我的第一个代码或者如果它的任务不可能

python flask flask-wtforms wtforms
2个回答
0
投票

您的RegisterForm没有BaseForm的新字段。无论如何,不​​要在子类中重新定义您的字段。也许你应该首先阅读一些编程语言,例如Python,特别注意继承。

这样做:

class BaseForm(FlaskForm):
    username = TextField('Username')
    email = TextField('Email', [validators.Required('Please enter your email address.'), validators.Length(min=6, message=('Too short for an email address?')), validators.Email(message=('Enter a valid email address.'))])
    password = PasswordField('Password')

class RegisterForm(BaseForm):
    register = SubmitField('Register')

0
投票
class BaseForm(Form):
    def __iter__(self):
        token = self.csrf_token
        yield token

        field_names = {token.name}
        for cls in self.__class__.__bases__:
            for field in cls():
                field_name = field.name
                if field_name not in field_names:
                    field_names.add(field_name)
                    yield self[field_name]

        for field_name in self._fields:
            if field_name not in field_names:
                yield self[field_name]

class EmailForm(BaseForm):
    email = EmailField('Email')


class PasswordForm(BaseForm):
    password = PasswordField('Password')


class EmailPasswordForm(EmailForm, PasswordForm):
    pass
© www.soinside.com 2019 - 2024. All rights reserved.