【问题标题】:Make primary-key fields editable in Flask-Admin在 Flask-Admin 中使主键字段可编辑
【发布时间】:2015-07-06 03:21:42
【问题描述】:

我在基于 Flask 的项目中使用 Flask-Admin。在其中,我有一些模型(使用 peewee),其中主键是用户设置的,例如 username 用于 User。但是 Flask-Admin 没有在模型的创建/编辑页面中显示这些字段。

现在,当我尝试创建新用户时,“保存”按钮给出了 peewee.UserDoesNotExist 错误,“保存并添加”两次显示“记录已成功创建”,但实际上并没有做任何事情。

我已扩展 save() 方法以在未设置的情况下从名称中自动生成用户名,但即使我删除了覆盖,问题仍然存在。

代码...

这是我的用户模型的样子:

# import peewee as pw

class User(BaseModel, UserMixin):
    username = pw.CharField(32, primary_key=True)
    password = pw.CharField(512, null=True)
    name = pw.CharField(64)

    # ... other fields not shown ... #

    def save(self, *args, **kwargs):
        # Set the username if field is blank
        if self.username == 'auto' or not self.username:
            self.username = self.name.replace(' ', '').lower()
        # Do the real save
        super(User, self).save(*args, **kwargs)

这是我的管理员代码:

# from flask_admin.contrib.peewee.view import ModelView

class AdminModelUser(ModelView):
    can_create = True
    column_list = ('username', 'name', 'group', 'active')

admin.add_view(AdminModelUser(User, name='Users', category='Accounts'))

试一试

我后来尝试覆盖get_form()方法,直接使用wtfpeewee并允许pk,像这样:

# from wtfpeewee.orm import model_form
class AdminModelUser(ModelView):
    ...        
    def get_form(self):
        return model_form(User, allow_pk=True)

现在该字段正在显示,但保存仍然不起作用。当我编辑现有用户的用户名时,管理员说“记录已成功保存”,但没有保存。当我尝试创建新用户时,我仍然收到peewee.UserDoesNotExist 错误。

我的猜测是我在错误的地方完成了覆盖,字段显示在表单中,但没有显示在保存方法中。我在文档中找不到任何提及这一点:有人知道该怎么做吗?

【问题讨论】:

  • 您得到peewee.UserDoesNotExist 的原因很可能是因为更改用户名后生成的SQL 类似于UPDATE some_table SET (...) WHERE id=new_username,显然不存在。我强烈建议不要使用用户设置的主 ID。使用自动递增的整数 id 更安全、更容易。
  • 您通过编辑主键为您和您的数据库创建了许多不必要的工作。坚持使用整数或 UUID,并对需要唯一的有意义字段使用唯一约束,例如用户名。

标签: python flask peewee flask-admin


【解决方案1】:

当您有一个非整数主键时,您必须调用 save()force_insert=True 来添加新行。

http://docs.peewee-orm.com/en/latest/peewee/models.html#non-integer-primary-keys-composite-keys-and-other-tricks

【讨论】:

  • 谢谢。我最终决定远离修改 pk,但万一我需要,现在我知道如何(我测试过并且有效)!
猜你喜欢
  • 1970-01-01
  • 2011-12-13
  • 1970-01-01
  • 2015-05-21
  • 2011-02-01
  • 2014-05-15
  • 2018-12-06
  • 2014-12-28
  • 1970-01-01
相关资源
最近更新 更多