Flask Admin: extra_js and url_for

6
我正在尝试在管理页面的某个 ModelView 中加载脚本:
class CustomView(ModelView):
    # Neither approach works here:
    # with current_app.app_context(), current_app.test_request_context():
    extra_js = [url_for('static', filename='admin/admin.js')]

app_context()注释掉后,我会得到以下错误:

运行时错误:尝试生成URL但未推送应用程序上下文。这必须在应用程序上下文可用时执行。

取消注释app_context后,我会得到以下错误:

运行时错误:工作在应用程序上下文之外。这通常意味着您尝试使用需要以某种方式与当前应用程序对象进行接口的功能。为解决此问题,请使用app.app_context()设置应用程序上下文。有关更多信息,请参见文档。

我还尝试在设置管理视图时添加上下文,但仍然遇到相同的错误:

# ADMIN
with app.app_context():
    admin = Admin(app, name='Custom', template_mode='bootstrap3', index_view=MyIndex(), base_template='admin/base.html')
    admin.add_view(CustomView(User, db.session))

那么,我如何适当地传递应用上下文以加载此视图的脚本呢?
1个回答

10
我找到了一个解决方案,不确定它是否完美地解答了您的需求,但只要我通过谷歌搜索我的问题时遇到了这个话题,我希望这可以帮助其他人。
因此,为了使 url_for 在 flask admin 的 extra_js 属性中可用,我只需在实现 flask admin 的 ModelView 基类的类中覆盖渲染方法来定义我的 extra_js 属性。以下是代码片段:
class MyModelView(AdminModelView):

    def render(self, template, **kwargs):
        """
        using extra js in render method allow use
        url_for that itself requires an app context
        """
        self.extra_js = [url_for("static", filename="js/whatever.js")]

        return super(MyModelView, self).render(template, **kwargs)

希望这可以帮助你!

1
谢谢,这很有帮助!只是为其他新手指出一下。AdminModelView类只是普通的ModelView类,这最初让我感到困惑。 - geogrow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接