首页 > 解决方案 > Flask,WTForms:编辑和创建表单规则时出错

问题描述

我在 Web 应用程序中使用 Flask 和 WTForms。我有一个 db.Model、一个表单和一个 sqla.ModelView,如下所示:

class Users(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.INTEGER, primary_key=True)
    name = db.Column(db.String, nullable=False)
    last_name = db.Column(db.String, nullable=False)

class UsersForm(form.Form):
    id = fields.IntegerField('Id')
    name = fields.StringField('Name')
    last_name = fields.StringField('Last Name')

class UsersAdmin(sqla.ModelView):
    column_list = ['id', 'name', 'last_name']
    form = UsersForm
    form_create_rules = column_list
    form_edit_rules = ['name', 'last_name']

但它不起作用,因为这个错误:

ValueError: Form <__main__.UsersForm object at 0x7f5039c48710> does not have field name

但是,当 form_edit_rules 等于 form_create 规则时,它可以完美运行!

标签: pythonflaskruleswtforms

解决方案


我在 flask-admin github issuelist 上发现 form_*_rules 只影响表单的显示方式,但不影响表单本身。

不需要在 flask-admin 中创建表单实例。我建议让您的数据库处理 id,因为它会自动递增。根据我的经验,flask-admin 甚至不显示 id 字段。

如果您真的只想在创建表单上有一个可编辑的 id 字段,您可以使用以下代码在编辑表单上将该字段设为只读:

class UsersAdmin(sqla.ModelView):
    def on_form_prefill(self, form, id):
        form.id.render_kw = {'readonly': True}

    column_list = ['id','name','last_name']
    form = UsersForm

推荐阅读