在 Flask-Admin 中使主键字段可编辑

问题描述 投票:0回答:2

我正在将 Flask-Admin 用于基于 Flask 的项目。其中,我有一些模型(使用 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
错误。

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

python flask peewee flask-admin
2个回答
2
投票

当您有非整数主键时,您必须使用

save()
调用
force_insert=True
来添加新行。

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


0
投票

我认为下面的内容回答了这个问题(或者至少回答了我的问题,让我看到这篇文章);我通过阅读这个问题找到了这篇文章。

通过在 ModelView 中设置

form_controls
属性,您可以设置要在表单上显示的列

引用该问题中的回复(但我无法引用代码块......):

如果您想在表单中编辑可编辑的

id
列,请使用附加
form_columns
属性并将
id
放入其中:

class MyModel(ModelView):
       column_display_pk = True
       form_columns = ('id', 'name', 'text')

总的来说,如果您看到带有

column_ prefix
的变量,它只会影响列表视图。如果带有
form_
前缀 - 则与形式相关。

请注意,这将使

id
字段在创建新记录和编辑现有记录时都可编辑(您可能不希望这样做)。为了解决这个问题,您可以根据它是新记录还是可编辑来修改
form_controls
(链接问题中有一个示例)。

© www.soinside.com 2019 - 2024. All rights reserved.