Администратор Flask: extra_js и url_for - PullRequest
0 голосов
/ 25 мая 2018

Я пытаюсь загрузить сценарий для определенного 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 голосов
/ 21 июня 2018

Я нашел решение, я не уверен, что оно полностью отвечает вашим потребностям, но пока я чувствовал эту тему, прибегая к помощи своей проблемы, я надеюсь, что это может помочь товарищам.

Итак, чтобы сделать url_for доступно в администраторе фляги extra_js , я только что определил свое свойство extra_js в своем классе, которое реализует базовый класс 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)

Надеюсь, это поможет!

...