【发布时间】:2019-07-17 07:53:00
【问题描述】:
在我的应用程序中,我有用户和帖子作为模型。每个帖子都有一个用户名的外键。当我在我的 Posts 模型上创建 ModelView 时,我可以在管理界面中以特定用户的身份创建帖子 如下图所示
添加帖子并单击“保存并添加另一个”后,“用户”恢复为“用户1”。如何让表单记住以前的值“user2”?
我的研究让我相信可以通过修改 on_model_change 和 on_form_prefill 并在烧瓶会话中保存以前的值来完成,但它似乎过度设计了这样一个简单的任务。一定有更简单的方法。
我的代码如下所示
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)
【问题讨论】:
-
[保存并添加另一个]表示清除当前表格并填写新表格。如果您想在选择框中使用以前的表单用户作为默认值,您可以使用 cookie(client) 或 session(server) 来保存用户值并实现它。
-
我不认为您从研究中得到的解决方案是过度设计的。正如@John 所说,您必须维护 cookie 或会话才能使其成为可能。
-
如果我误解了您的问题,请原谅我@user787267,但是您是否有兴趣将表单的默认加载选项更改为当前选择的内容,或者动态添加用户并将其设置为默认值表格?
-
@calestini 我有兴趣让表单记住用户最后选择的值。因此,如果管理员想要为 user2 添加多个帖子,他不必在每次插入时重新选择 user2。
-
@user787267,总体选项将是 (1) 异步发送表单以便当前值保持预加载,(2) 如上所述的 cookie,(3) 传递 url 参数,例如 @ 987654324@ 并动态更改表单上的默认值,或 (4) 保存会话。选项 3 是一种简单、笨拙的方式,但它会在 url 上公开您的内部 id。
标签: python flask flask-admin