Flask-admin UserWarning: поля отсутствуют в наборе правил

При выполнении моего приложения Flask я получаю следующие предупреждения:

C:\Python27\lib\site-packages\flask_admin\model\base.py:1324: UserWarning: Fields missing from ruleset: password
  warnings.warn(text)
C:\Python27\lib\site-packages\flask_admin\model\base.py:1324: UserWarning: Fields missing from ruleset: new_password
  warnings.warn(text)
 * Restarting with stat
C:\Python27\lib\site-packages\flask_admin\model\base.py:1324: UserWarning: Fields missing from ruleset: password
  warnings.warn(text)
C:\Python27\lib\site-packages\flask_admin\model\base.py:1324: UserWarning: Fields missing from ruleset: new_password
  warnings.warn(text)

Обычно я использовал form_excluded_columns для удаления ненужных полей из моей формы, но на этот раз мне трудно избавиться от этих ошибок.

Вот мой взгляд:

class AdministratorView(sqla.ModelView):
    page_size = 10

    column_searchable_list = (
        'username',
        'description'
    )

    column_list = (
        'username',
        'apikey',
        'description',
        'active'
    )

    column_exclude_list = list = (
        'apikey',
        'source'
    )

    form_excluded_columns = (
        'source',
        'photos'
    )

    column_labels = {
        'apikey': 'API Key'
    }

    form_widget_args = {
            'apikey':{
                'readonly':True
            }
    }

    form_create_rules = (
        rules.FieldSet(('username', 'password', 'description'), 'Personal'),
        rules.FieldSet(('roles', 'apikey', 'active'), 'Permission'),
    )

    form_edit_rules = (
        rules.FieldSet(('username', 'description'), 'Personal'),
        rules.FieldSet(('roles', 'apikey', 'active'), 'Permission'),
        rules.Header('Reset password'),
        rules.Field('new_password')
    )

    def on_model_change(self, form, model, is_created):
        if is_created is False:
            if form.new_password.data:
                model.password = generate_password_hash(form.new_password.data)

    def scaffold_form(self):
        form_class = super(AdministratorView, self).scaffold_form()
        form_class.password = fields.PasswordField('Password', [validators.Required()])
        form_class.new_password = fields.PasswordField('New Password')
        return form_class

    def is_accessible(self):
        if login.current_user.is_authenticated:
            return login.current_user.has_role('admin')

Целью этого представления является наличие одного обязательного поля пароля в форме создания и необязательного поля «Новый пароль» в форме редактирования. Я понимаю, что предупреждения возникают, когда я не включаю пароль/новый_пароль в form_create_rules и form_edit_rules, но добавление этих полей в form_excluded_columns не исправляет ситуацию.

Любые советы о том, как я могу избавиться от предупреждений?

Изменить:

Я полагаю, что лучше использовать get_create_form и get_edit_form, а не только scaffold_form. Одним из преимуществ является то, что это упрощает переопределение каждой формы по отдельности. Могу ли я еще упростить это? Должен ли я выполнять проверку требований, как это, или добавить nullable = False в схему базы данных (SQLAlchemy)?

class AdministratorView(sqla.ModelView):
    page_size = 10

    column_searchable_list = (
        'username',
        'description'
    )

    column_list = (
        'username',
        'apikey',
        'description',
        'active'
    )

    column_exclude_list = list = (
        'apikey',
        'source'
    )

    form_excluded_columns = (
        'source',
        'photos'
    )

    column_labels = {
        'apikey': 'API Key'
    }

    form_widget_args = {
            'apikey':{
                'readonly':True
            }
    }

    form_create_rules = (
        rules.FieldSet(('username', 'password', 'description'), 'Personal'),
        rules.FieldSet(('roles', 'apikey', 'active'), 'Permission'),
    )

    form_edit_rules = (
        rules.FieldSet(('username', 'description'), 'Personal'),
        rules.FieldSet(('roles', 'apikey', 'active'), 'Permission'),
        rules.Header('Reset password'),
        rules.Field('new_password')
    )

    def get_create_form(self):
        form = self.scaffold_form()
        form.username = fields.StringField('Username', [validators.Required()])
        form.password = fields.PasswordField('Password', [validators.Required()])
        return form

    def get_edit_form(self):
        form = self.scaffold_form()
        delattr(form, 'password')
        form.new_password = fields.PasswordField('New Password')
        return form

    def on_model_change(self, form, model, is_created):
        if is_created is False:
            if form.new_password.data:
                model.password = generate_password_hash(form.new_password.data)

    def is_accessible(self):
        if login.current_user.is_authenticated:
            return login.current_user.has_role('admin')

person NeoID    schedule 20.10.2016    source источник


Ответы (1)


Возможно, это поможет: Как я могу избежать предупреждения Flask-Admin 2.1 UserWarning: поля отсутствуют в наборе правил?

Вот соответствующий код из этого ответа:

import warnings

with warnings.catch_warnings():
    warnings.filterwarnings('ignore', 'Fields missing from ruleset', UserWarning)
    admin.add_view(UserView())
person Steve Saporta    schedule 02.11.2016