【问题标题】:Flask with Jinja issue with pagination after the first pageFlask with Jinja 在第一页后出现分页问题
【发布时间】:2018-07-09 10:41:33
【问题描述】:

我创建了一个下拉菜单,用于从 SQL 数据库中按项目编号搜索零件。第一个页面加载了正确的部分,但随后的任何页面都会出现以下错误:

TypeError: show_compound() 缺少 1 个必需的位置参数:'search_string'

从我在网上看到的情况看来,我可能需要使用*args 或将search_string 传递给模板,但我不确定如何使用*args 或在何处插入search_string 值模板。

@parts_database.route('/searchcompound', methods=['GET', 'POST'])
@login_required
def compounds_search():
    form = ProjectSearch(request.form)
    if form.validate_on_submit():
        search_string = form.select.data.project_number

        return show_compound(search_string)

    return render_template('parts_database/search_compounds.html', form=form)

@parts_database.route('/showcompound', methods=['GET'])
@login_required
def show_compound(search_string):
    page = request.args.get('page', 1, type=int)

    pagination = PartsTable.query.filter_by(project_number=search_string).order_by(PartsTable.part_number).paginate(page, per_page=15, error_out=False)

    compound = pagination.items
    page_10 = pagination.next_num+9
    if page_10 > pagination.pages:
        pageincrement = pagination.pages
    else:
        pageincrement = page_10

    page_decrement = page - 10
    if page_decrement < 1:
        page_decrement = 1

    return render_template('parts_database/showpartstable.html', compound=compound, pagination=pagination, pageincrement=pageincrement, page_decrement=page_decrement)

模板:

{% extends "base.html" %}
{% import "bootstrap/wtf.html" as wtf %}
{% import "_macros.html" as macros %}

{% block title %}Amos{% endblock %}

{% block page_content %}
<div class="page-header">
    <a href="{{ url_for('main.render_csv', jobname_filename = 'Parts_PDB') }}"><h1>Parts</h1></a>

{% include 'parts_database/_showpartstable.html' %}
    {% if pagination %}
    <div class="pagination">
    {{ macros.pagination_widget(page_decrement, pageincrement, pagination, '.show_compound') }}
</div>
    {% endif %}
</div>    
{% endblock %}

【问题讨论】:

    标签: python flask flask-sqlalchemy flask-wtforms


    【解决方案1】:

    如果视图接受参数,则必须在路由中包含该变量。

    在您的情况下,您在 show_compound 路由定义中缺少 search_string。试试这样的:

    @parts_database.route('/showcompound/<search_string>', methods=['GET'])
    @login_required
    def show_compound(search_string):
        (...)
    

    编辑:

    另外,我建议重定向而不是调用另一个视图的函数。

    替换这个:

    if form.validate_on_submit():
        search_string = form.select.data.project_number
    
        return show_compound(search_string)
    

    用这个:

    您必须在此之前导入重定向:

    from flask import redirect  # (Add this at the top)
    
    (...)
    
    if form.validate_on_submit():
        search_string = form.select.data.project_number
    
        return redirect(url_for('parts_database.show_compound', search_string=search_string))
    

    【讨论】:

    • 成功了,谢谢!虽然结果的最后一页现在有错误 TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'
    • @Chelsea 似乎与这条线有关:page_10 = pagination.next_num+9。我不确定你的逻辑是什么,但如果你想要变量中的第 10 页,为什么不这样做page_10 = 10?另外,请检查我的编辑以获取另一个小提示。如果您不介意,请将答案标记为已接受,谢谢!
    • 感谢您的帮助。当搜索结果只是从数据库中提取所有化合物之前从项目编号搜索时使用它,但现在可以取出,因为通过项目搜索的结果页面要少得多。
    猜你喜欢
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-10
    • 1970-01-01
    • 2019-08-29
    • 2018-08-26
    相关资源
    最近更新 更多