Flask-admin 用户警告 : Fields missing from ruleset

标签 flask flask-sqlalchemy flask-admin

执行 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')

此 View 的目的是在创建表单上有一个必需的密码字段,在编辑表单上有一个可选的“新密码”字段。据我所知,当我在 form_create_rules 和 form_edit_rules 中不包含密码/new_password 时,会出现警告,但将这些字段添加到 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')

最佳答案

也许这会有所帮助:How can I avoid Flask-Admin 2.1 warning "UserWarning: Fields missing from ruleset"?

这是该答案的相关代码:

import warnings

with warnings.catch_warnings():
    warnings.filterwarnings('ignore', 'Fields missing from ruleset', UserWarning)
    admin.add_view(UserView())

关于Flask-admin 用户警告 : Fields missing from ruleset,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40154745/

相关文章:

python - Flask-sqlalchemy 临时 session /上下文变量

python - flask 管理员自定义 QueryAjaxModelLoader

flask 管理员 : extra_js and url_for

javascript - 如何使用 Flask 获取用户选择的 <select> 标签选项?

python - Flask View 中装饰器的顺序是否重要?

python - 如何通过 python docker SDK 保持 docker 容器运行?

python - 可以使用新 session 访问 sqlalchemy 关系吗?

javascript - 将大整数数组从 javascript 传输到 Flask 的优化方法,反之亦然

mysql - 如何使用 sqlalchemy 更新 mysql 表中的列?

mysql - Flask-Admin+SQLAlchemy 图像上传在 MySQL 生产环境中有效,但在 SQLite 测试用例 : InterfaceError 中无效