烧瓶管理员记住表格值

use*_*267 11 python flask flask-admin

在我的应用程序中,我将“用户”和“帖子”作为模型。每个帖子都有一个用户名外键。当我在帖子模型的顶部创建ModelView时,可以在管理界面中以特定用户的身份创建帖子,如以下屏幕截图所示

在此处输入图片说明

添加帖子并单击“保存并添加另一个”后,“用户”将恢复为“ user1”。如何使表单记住先前的值“ user2”?

我的研究使我相信可以通过修改on_model_change和on_form_prefill并在flask会话中保存先前的值来完成,但这似乎过度设计了这么简单的任务。必须有一个更简单的方法。

我的代码可以在下面看到

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import flask_admin
from flask_admin.contrib import sqla

app = Flask(__name__)

db = SQLAlchemy()

admin = flask_admin.Admin(name='Test')


class Users(db.Model):
    """
    Contains users of the database
    """
    user_id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), index=True, unique=True, nullable=False)

    def __str__(self):
        return self.username


class Posts(db.Model):
    """
    Contains users of the database
    """
    post_id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(11), db.ForeignKey(Users.username), nullable=False)
    post = db.Column(db.String(256))
    user = db.relation(Users, backref='user')


def build_sample_db():
    db.drop_all()
    db.create_all()
    data = {'user1': 'post1', 'user1': 'post2', 'user2': 'post1'}
    for user, post in data.items():

        u = Users(username=user)
        p = Posts(username=user, post=post)

        db.session.add(u)
        db.session.add(p)
    db.session.commit()

class MyModelView(sqla.ModelView):

    pass


if __name__ == '__main__':

    app.config['SECRET_KEY'] = '123456790'
    app.config['DATABASE_FILE'] = 'sample_db.sqlite'
    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///database'
    app.config['SQLALCHEMY_ECHO'] = True
    db.init_app(app)

    admin.init_app(app)
    admin.add_view(MyModelView(Posts, db.session))

    with app.app_context():
        build_sample_db()

    # Start app
    app.run(debug=True)

Run Code Online (Sandbox Code Playgroud)

Tej*_*sad 5

我之前遇到过这种情况,我已经使用2个函数解决了。它非常简单和小巧。

@expose('/edit/', methods=('GET', 'POST'))
def edit_view(self):
    #write your logic to populate the value into html        
    self._template_args["arg_name"] = stored_value
    # in your html find this value to populate it as you need
Run Code Online (Sandbox Code Playgroud)

当用户尝试编辑任何值时,上述函数将允许您填充html中的值。可以使用存储的值来填充。下面是一个功能,可以帮助您保存上一次编辑的值。

在此class MyModelView(sqla.ModelView):您需要添加以下2个功能。

def on_model_change(self, form, model, is_created):
    stored_value = model.user # this is your user name stored
    # get the value of the column from your model and save it 
Run Code Online (Sandbox Code Playgroud)

这是一个两步操作,非常小,不需要很多时间。我现在仅添加了一个框架/伪代码。