【问题标题】:Flask-SQLAlchemy and GET requests with paginationFlask-SQLAlchemy 和带有分页的 GET 请求
【发布时间】:2018-01-24 03:14:45
【问题描述】:

我正在尝试为一个简单的网站构建一个分页搜索表单。我的问题是——当我离开第 1 页(通过分页)并执行或更新搜索,而不是返回到第 1 页时,表单会重新加载到我当时碰巧在的任何页面上。这会中断新结果集的显示。

例如,如果 URL 是这个,我更新搜索并点击提交,我会停留在第二页而不是从第一页开始。 mysite/coorddash/2?coord_status=Pending&start_date=01/23/2017&end_date=01/23/2018

# VIEWS
@app.route('/coorddash/<int:page>', methods=['GET', 'POST'])
def coordDash(page=1):
    per_page = 3
    existingISG = ISG.query \
    .filter(or_(ISG.coordinator_status == 'IAT Verified', ISG.coordinator_status == 'New')) \
    .order_by("isg.id desc") \
    .paginate(page,per_page,error_out=False)
    form=coordDashForm(request.args)
    coordstatus=start=end=""

    if form.validate():
        coordstatus = request.values.get("coord_status")
        form.coord_status.data = coordstatus
        start = request.values.get("start_date")
        form.start_date.data = datetime.strptime(start, '%m/%d/%Y')
        end = request.values.get("end_date")
        form.end_date.data = datetime.strptime(end, '%m/%d/%Y')

        existingISG = ISG.query.filter(ISG.coordinator_status == coordstatus).filter(ISG.isg_created_on.between(start, end)).paginate(page,per_page,error_out=False)

    return render_template('coorddash.html', 
                        title = 'Coordinator Dashboard', 
                        existingisg = existingISG, 
                        form=form,
                        url_vals=request.query_string.decode())

#MODELS
class ISG(db.Model):
    __tablename__ = 'isg'
    id = db.Column(db.Integer, primary_key=True)
    coordinator_status = db.Column(db.String(30), unique=False)
    startdate = db.Column(db.DateTime)
    enddate = db.Column(db.DateTime)

#HTML
<form action="" method="get" name="searchForm">
    {{ form.coord_status.label }}:{{ form.coord_status }} | {{ form.sort_by.label }}:{{ form.sort_by }}<br>
    {{ render_field(form.start_date) }}-{{ render_field(form.end_date) }}<br>
    {{ form.submit }}
    {{ form.csrf_token }}
</form>

{% for item in existingisg.items %}
<div>
    <span>{{ item.location }}</span>
    <span>{{ item.implementing_team }}</span>
</div>
{% endfor %}

{% if existingisg.has_prev %}<a href="{{ url_for('coordDash', page=existingisg.prev_num) }}{% if url_vals|length > 0 %}{{ url_vals }}{% endif %}"> Previous Page</a>{% else %}No previous{% endif %} | 
{% if existingisg.has_next %}<a href="{{ url_for('coordDash', page=existingisg.next_num) }}{% if url_vals|length > 0 %}{{ url_vals }}{% endif %}">Next Page </a>{% else %}No more{% endif %}

【问题讨论】:

    标签: python python-3.x pagination flask-sqlalchemy


    【解决方案1】:

    看起来您在重新加载页面时将分页作为 URL 变量传回。即使使用新查询,mysite.coorddash/2 也会被发送到您的 coordDash 方法,您将获得第二页而不是第一页的结果。

    如果您更改表单操作以引用带有尾随 /1 的当前 URL 用于分页,则它应该被发送到正确的视图并且分页应该重新启动。例如,

    &lt;form action={{ url_for('coordDash', page=1) }} method="get" name="searchForm"&gt;

    语法可能略有偏差,但类似这样的内容会将您的结果发送到该 URL 的正确函数并指定分页。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-10
      • 1970-01-01
      • 1970-01-01
      • 2017-08-23
      • 2017-05-22
      • 1970-01-01
      相关资源
      最近更新 更多