наследование формы базовой колбы с проверкой - PullRequest
0 голосов
/ 24 октября 2018

У меня есть форма колбы, вот часть кода:

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

Так что мне кажется, что проблема в том, что проверки не наследуются вместе с полями или, может быть, я не понимаю.Я пытаюсь уменьшить код, который я пишу. Пожалуйста, помогите мне реализовать наследование формы, которое я пытался, рассказав мне, как я могу использовать свой первый код или, если это невозможно,

Ответы [ 2 ]

0 голосов
/ 26 марта 2019
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
0 голосов
/ 24 октября 2018

Ваш 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')
...