Flask Admin:extra_js和url_for

时间:2018-05-25 14:44:25

标签: flask flask-admin

我尝试在管理页面中的某个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()后,我收到此错误:

  

RuntimeError:尝试在没有应用程序的情况下生成URL   上下文被推动。这必须在应用程序上下文时执行   是可用的。

取消注释app_context会给我这个错误:

  

RuntimeError:在应用程序上下文之外工作。这通常   表示您尝试使用需要连接的功能   以某种方式使用当前的应用程序对象。要解决这个问题,请设置   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 个答案:

答案 0 :(得分:1)

我找到了一个解决方案,不确定是否能完美满足您的需求,但是只要我通过谷歌搜索我的问题对这个话题感到满意,希望对大家有帮助。

因此,为了在烧瓶管理 extra_js 属性中提供 url_for ,我在类中定义了我的 extra_js 属性,该属性实现了通过覆盖render方法来实现flask admin的ModelView基类。该代码段等于数千个单词:

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)

希望这会有所帮助!