将其他 object/data 传递到 Flask Admin 模型视图编辑模板
Pass other object/data into Flask Admin model view edit template
我正在扩展 ModelView 的编辑模板,以便我可以显示数据库中的一些其他信息,这些信息与确定如何在此视图中编辑记录相关。我知道如何扩展模板并让它工作,但我不知道如何查询对象并在模板中使用它。
我还需要使用 model/record 中的值来查询我需要传递的新对象。
这是我在 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)的可用帖子,但没有找到答案。提前致谢。
重写视图的 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
我正在扩展 ModelView 的编辑模板,以便我可以显示数据库中的一些其他信息,这些信息与确定如何在此视图中编辑记录相关。我知道如何扩展模板并让它工作,但我不知道如何查询对象并在模板中使用它。
我还需要使用 model/record 中的值来查询我需要传递的新对象。
这是我在 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)的可用帖子,但没有找到答案。提前致谢。
重写视图的 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