python - 扩展烧瓶管理模板时向渲染调用添加参数
问题描述
我正在尝试将内容添加到 Flask-admin 列表视图。我想在列表视图的顶部添加我自己的内容。到目前为止我所做的是扩展默认列表视图并添加我自己的内容,如下所示:
{% extends 'admin/model/list.html' %}
{% block body %}
<h3>Submit report</h3>
{% if report_form.errors %}
<ul class="errors">
{% for field_name, field_errors in report_form.errors|dictsort if field_errors %}
{% for error in field_errors %}
<li>{{ form[field_name].label }}: {{ error }}</li>
{% endfor %}
{% endfor %}
</ul>
{% endif %}
<form action="{{ url_for('report.index') }}" method="post" enctype="multipart/form-data">
{{ report_form.file }}
{{ report_form.csrf_token }}
<button type="submit">Send</button>
</form>
{{ super() }}
{% endblock %}
我的这个模板的自定义模型视图是:
class ReportAdmin(ModelView):
@expose('/', methods=('GET', 'POST'))
def index(self):
report_form = ReportFileForm()
if form.validate_on_submit():
file = form.file.data
#Check for report duplicate
if Report.query.filter(Report.filename == file.filename).all():
flash('Could not add report because a report with filename {} already exists.'.format(file.filename), 'error')
else:
try:
report = parser_factory(file)
flash('Report was submitted succesfully')
return redirect(url_for('report.index_view'))
except ValueError as e:
form.file.errors.append(e)
return self.render('report/index.html', report_form=report_form)
现在我的问题是列表视图需要设置一定数量的参数(以处理显示列表)。
这些参数在base.py中定义
return self.render(
self.list_template,
data=data,
form=form,
delete_form=delete_form,
# List
list_columns=self._list_columns,
sortable_columns=self._sortable_columns,
editable_columns=self.column_editable_list,
# Pagination
count=count,
pager_url=pager_url,
num_pages=num_pages,
page=view_args.page,
# Sorting
sort_column=view_args.sort,
sort_desc=view_args.sort_desc,
sort_url=sort_url,
# Search
search_supported=self._search_supported,
clear_search_url=clear_search_url,
search=view_args.search,
# Filters
filters=self._filters,
filter_groups=self._filter_groups,
active_filters=view_args.filters,
# Actions
actions=actions,
actions_confirmation=actions_confirmation,
# Misc
enumerate=enumerate,
get_pk_value=self.get_pk_value,
get_value=self.get_list_value,
return_url=self._get_list_url(view_args),
)
所以当然当尝试显示页面时,我得到一个错误:
jinja2.exceptions.UndefinedError: 'num_pages' is undefined
我的问题是:如何将我的参数包含在父视图的渲染调用中?
谢谢!
解决方案
尝试覆盖视图的render
方法,您可以将变量注入到kwargs
参数中。
示例(未经测试)
class ReportAdmin(ModelView):
list_template = 'report/index.html'
# Override to allow POSTS
@expose('/', methods=('GET', 'POST'))
def index_view(self):
return super(ReportAdmin, self).index_view(self)
def render(self, template, **kwargs):
# we are only interested in our custom list page
if template == 'report/index.html':
report_form = ReportFileForm()
if report_form.validate_on_submit():
file = report_form.file.data
#Check for report duplicate
if Report.query.filter(Report.filename == file.filename).all():
flash('Could not add report because a report with filename {} already exists.'.format(file.filename), 'error')
else:
try:
report = parser_factory(file)
flash('Report was submitted succesfully')
except ValueError as e:
report_form.file.errors.append(e)
kwargs['report_form'] = report_form
return super(ReportAdmin, self).render(template, **kwargs)
推荐阅读
- vb.net - 在 VB.NET 中追加文本列表
- regex - 我如何只选择特定的单词?
- android - 您需要至少调用一次 create() 来创建单例
- java - Thymeleaf 模板 th:data=http://www.somesite.com || org.thymeleaf.exceptions.TemplateProcessingException:无法解析为分配序列
- firebase - 是否可以从后端更改 Firebase Analytics 用户属性?
- java - SockJsClient 抛出 ClassCastException
- css - 带有固定侧边栏的 CSS 网格
- r - R使用XML2将数据从XML提取到数据框
- javascript - 不同类型的对象数组
- vb.net - 根据不同的复选框组合显示消息