将其他对象/数据传递到 Flask Admin 模型视图编辑模板

时间:2021-01-25 21:29:49

标签: flask flask-admin

我正在扩展 ModelView 的编辑模板,以便我可以显示数据库中的一些其他信息,这些信息与确定如何在此视图中编辑记录相关。我知道如何扩展模板并使其工作,但我不知道如何查询对象并在模板中使用它。

此外,我需要使用模型/记录中的值来查询我需要传递的新对象。

这是我在 init.py 中的代码:

class MilestoneView(ModelView):
    edit_template = '/admin/milestone_model/milestone_edit.html'
    can_delete = True

    #i need something like this to work:
    referrals = Referral.query.filter_by(email=model.email)
    #then i need to pass referrals into the template

admin = Admin(app, name="My App", template_mode='bootstrap3')
admin.add_view(MilestoneView(Milestone, db.session, name='Milestones'))

然后从里程碑_edit.html,我想要这样的工作:

{% extends 'admin/model/edit.html' %}

{% block body %}

    {{ super() }}

    {% for r in referrals %}

        <p>{{ r.name }}</p>

    {% endif %}

{% endblock %}

当然,在模板中不能使用引用对象。如何自定义此 ModelView 以便从 init 文件中传递此对象?我已经在这里查看了有关此主题(ish)的可用帖子,但还没有找到答案。提前致谢。

1 个答案:

答案 0 :(得分:1)

覆盖视图的 render 方法 see code on Github,并测试呈现的视图是否为编辑视图。现在您可以将任何数据注入 kwargs 参数。例如:

class MilestoneView(ModelView):

    def render(self, template, **kwargs):

        # we are only interested in the edit page
        if template == 'admin/model/milestone_edit.html':

            # Get the model, this is just the first few lines of edit_view method
             return_url = get_redirect_target() or self.get_url('.index_view')

            if not self.can_edit:
                return redirect(return_url)

            id = get_mdict_item_or_list(request.args, 'id')
            if id is None:
                return redirect(return_url)

            model = self.get_one(id)

            if model is None:
                flash(gettext('Record does not exist.'), 'error')
                return redirect(return_url)

            referrals = Referral.query.filter_by(email=model.email)
            kwargs['referrals'] = referrals

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

注意模型是如何检索的。这是方法 edit_view code 中代码的直接副本。根据您的用例调整代码。

在您的编辑 Jinja2 模板中使用变量 referrals

在每个视图的以下路由中调用 render 方法:

'/' - 即列表视图 code

'/new/' - code

'/edit/' - code

'/details/' - code

相关问题