【问题标题】:Pass other object/data into Flask Admin model view edit template将其他对象/数据传递到 Flask Admin 模型视图编辑模板
【发布时间】:2021-01-25 21:29:49
【问题描述】:

我正在扩展 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'))

然后从milestone_edit.html,我想要这样的工作:

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

{% block body %}

    {{ super() }}

    {% for r in referrals %}

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

    {% endif %}

{% endblock %}

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

【问题讨论】:

    标签: flask flask-admin


    【解决方案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_viewcode 中代码的直接副本。为您的用例调整代码。

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

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

    '/' - 即列表视图code

    '/new/' - code

    '/edit/' - code

    '/details/' - code

    【讨论】:

    • 非常酷,谢谢。在模板中,如何访问 kwargs 变量 - 特别是 kwards['referrals'] ?
    • 我也得到了一个未定义的模型。如何访问模型对象,以便我可以使用当前对象的字段之一来查询引用数据?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-26
    • 2016-09-28
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    相关资源
    最近更新 更多