Добавление параметра для отображения вызова при расширении шаблона администратора фляги - PullRequest
0 голосов
/ 30 января 2019

Я пытаюсь добавить содержимое в представление списка 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

У меня вопрос: как включить мой параметр в вызов рендеринга родительского представления?

Спасибо!

1 Ответ

0 голосов
/ 30 января 2019

Попробуйте переопределить метод 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)
...