使用Flask显示带有分页的记录时,搜索框中的变量值丢失

拉米罗

问题描述:我有一个游泳者名称列表,存储在swimmer表的Sqlite db中。单击主菜单时,该列表将显示给用户。

在此处输入图片说明

从菜单中选择“游泳者”选项时,将使用分页显示游泳者列表。您可以使用上一页或下一页按钮浏览页面,而不会出现问题。您甚至还可以选择特定页面,并且记录会正确显示给用户。

在此处输入图片说明

在显示带有分页的游泳者列表的页面上,页面底部是搜索框和用于按名称激活搜索的按钮。

在此处输入图片说明

For example, when entering the letter "A" in capital letters, the @app.route('/search_swimmers/') searches for all the records that include the letter "A" in the name field and returns this list with pagination. Up to here everything works perfect.

在此处输入图片说明

Results of the search for names that include the capital letter "A" in the name field:

在此处输入图片说明

When the search results are displayed on the screen. The Name field in the search box no longer includes the capital letter "A" which was the criteria entered for the search. However, all the records found are correct, because they satisfy the search criteria. The example shows a total of nine pages. For purposes of explaining the problem, a maximum number of three records per page has been adjusted. So far everything is correct in what the app is expected to do.

问题:当您要在页面中导航时,路由@ app.route('/ search_swimmers /')失去了name_search变量的值。结果,显示找到0条记录。

在此处输入图片说明

如何防止变量name_search的值不丢失?

随附相关代码部分供您查看:

app.py:

from flask import Flask 
from flask import render_template
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime  
from flask import request, redirect

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'  
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False 
db = SQLAlchemy(app) 


class Swimmer(db.Model):
    id          = db.Column(db.Integer,     primary_key=True)
    name        = db.Column(db.String(80),  nullable=False)
    created_at  = db.Column(db.DateTime,    nullable=False, default=datetime.utcnow)

    def __repr__(self):
        return '<Swimmer %r>' % self.name


@app.route('/swimmers/<int:page_num>')
def swimmers(page_num):
    swimmers_per_page = 3
    swimmers = Swimmer.query.paginate(per_page=swimmers_per_page, 
                                    page=page_num, error_out=False)

    return render_template('swimmers.html',swimmers=swimmers)

@app.route('/search_swimmers/<int:page_num>')
def search_swimmers(page_num):

    '''
    Search
    '''

    swimmers_per_page = 3
    name_search = str(request.args.get('name'))


    swimmers = Swimmer.query.filter(
                    Swimmer.name.contains(name_search)
              ).order_by(
                    Swimmer.name
                  ).paginate(
                        per_page = swimmers_per_page, 
                        page = page_num,
                        error_out=False
                    )

    return render_template(
            'search_swimmers.html', 
            swimmers = swimmers,
            name_search = name_search
       )

@app.route('/', methods=['GET', 'POST'])
def index():
    if request.method == 'POST':
        name = request.form['name']
        new_stuff = Swimmer(name=name)

        try:
            db.session.add(new_stuff)
            db.session.commit()
            return redirect('/')
        except IntegrityError as e:
            db.session.rollback()
            return "There was a problem creating a swimmer."

    else:
        swimmers = Swimmer.query.order_by(Swimmer.created_at).all()
        return render_template('index.html', swimmers=swimmers)



if __name__ == '__main__':
    app.run(debug=True)

swimmers.html:

{% extends 'base.html' %}

{% block content %}
<div class="container">
  <h3>
    <span class="d-block p-2 bg-primary text-white">
      Swimmers list
    </span>
  </h3>
  <ul class="pagination">
    {% if swimmers.has_prev %}
      <li class="page-item"> <a class="page-link" href="{{ url_for('swimmers', page_num =   swimmers.prev_num ) }}">Previous page</a></li>
    {% else %}
      <li class="page-item"><a class="page-link btn disabled" href="#">Previous page</a></li>
    {% endif %}


    {% if swimmers.has_next %}
      <li class="page-item"> <a class="page-link" href="{{ url_for('swimmers', page_num = swimmers.next_num) }}">Next page</a></li>
    {% else %}
      <li class="page-item"><a class="page-link btn disabled" href="#">Next page</a></li>
    {% endif %}
  </ul>
  <p class="text-primary"> Page {{ swimmers.page }} of {{ swimmers.pages }}</p>

  {% for page in swimmers.iter_pages(left_edge=3, 
                                  right_edge=3, 
                                  left_current=3, 
                                  right_current=3
                                  ) 
  %}
  {% if page %}
    <a href="{{ url_for('swimmers',page_num=page) }}">{{page}}</a>
  {% else %}
  ... 
  {% endif %}
  {% endfor %}


  {% for swimmer in swimmers.items %}
  <div class="alert alert-primary" role="alert">
    {{ swimmer.name }}
  </div>
  {% endfor %}

  <p class="text-primary"> Page {{ swimmers.page }} of {{ swimmers.pages }}</p>
  {% for page in swimmers.iter_pages(left_edge=3, 
                                  right_edge=3, 
                                  left_current=3, 
                                  right_current=3
                                  ) 
  %}
  {% if page %}
    <a href="{{ url_for('swimmers',page_num=page) }}">{{page}}</a>
  {% else %}
  ... 
  {% endif %}


  {% endfor %}
  <div class="container">
    <form action="{{ url_for('search_swimmers',page_num=1) }}" method="get" class="form-inline my-2 my-lg-0">
      <input class="form-control mr-sm-2" type="text" name="name" placeholder="Name ... " oninvalid="this.setCustomValidity('Please Enter a valid Name')" aria-label="Search" required>
      <button class="btn btn-primary my-2 my-sm-0" type="submit"><svg class="bi bi-search" width="1em" height="1em" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
        <path fill-rule="evenodd" d="M10.442 10.442a1 1 0 011.415 0l3.85 3.85a1 1 0 01-1.414 1.415l-3.85-3.85a1 1 0 010-1.415z" clip-rule="evenodd"/>
        <path fill-rule="evenodd" d="M6.5 12a5.5 5.5 0 100-11 5.5 5.5 0 000 11zM13 6.5a6.5 6.5 0 11-13 0 6.5 6.5 0 0113 0z" clip-rule="evenodd"/>
      </svg></button>
    </form>
  </div>



</div>

{% endblock content %}

search_swimmers.html:

{% extends 'base.html' %}

{% block content %}
<div class="container">
  <h3>
    <span class="d-block p-2 bg-primary text-white">
      Search Swimmers Results
    </span>
  </h3>


  <p class="text-primary">Total pages: {{ swimmers.pages }}</p>
  {% for page in swimmers.iter_pages(left_edge=3, 
                                  right_edge=3, 
                                  left_current=3, 
                                  right_current=3
                                  ) 
  %}
  {% if page %}
    <a href="{{ url_for('search_swimmers',page_num=page) }}">{{page}}</a>
  {% else %}
  ... 
  {% endif %}
  {% endfor %}


  {% for swimmer in swimmers.items %}
  <div class="alert alert-primary" role="alert">
    {{ swimmer.name }}
  </div>
  {% endfor %}

  <p class="text-primary">Total pages: {{ swimmers.pages }}</p>
  {% for page in swimmers.iter_pages(left_edge=3, 
                                  right_edge=3, 
                                  left_current=3, 
                                  right_current=3
                                  ) 
  %}
  {% if page %}
    <a href="{{ url_for('search_swimmers',page_num=page) }}">{{page}}</a>
  {% else %}
  ... 
  {% endif %}
  {% endfor %}


  <div class="container">
    <form action="{{ url_for('search_swimmers',page_num=1) }}" method="get" class="form-inline my-2 my-lg-0">
      <input class="form-control mr-sm-2" type="text" name="name" placeholder="Name ... " aria-label="Search">
      <button class="btn btn-primary my-2 my-sm-0" type="submit"><svg class="bi bi-search" width="1em" height="1em" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
          <path fill-rule="evenodd" d="M10.442 10.442a1 1 0 011.415 0l3.85 3.85a1 1 0 01-1.414 1.415l-3.85-3.85a1 1 0 010-1.415z" clip-rule="evenodd"/>
          <path fill-rule="evenodd" d="M6.5 12a5.5 5.5 0 100-11 5.5 5.5 0 000 11zM13 6.5a6.5 6.5 0 11-13 0 6.5 6.5 0 0113 0z" clip-rule="evenodd"/>
        </svg></button>
    </form>
  </div>

</div>

{% endblock content %}

任何指南都将受到高度赞赏。谢谢!

机械肉

我相信正确的解决方案是将搜索词放在URL中。
在我的测试中,以下修改适用于以下URL:
http://127.0.0.1:5000/search_swimmers/3/test

我这样修改了您的search_swimmers()路线:

@app.route('/search_swimmers/<int:page_num>/')
@app.route('/search_swimmers/<int:page_num>/<search_term>')
def search_swimmers(page_num=None,search_term=None):
    swimmers_per_page = 3
    if not search_term:
        name_search = str(request.args.get('name'))
    else:
        name_search = search_term 

    swimmers = Swimmer.query.filter(
                    Swimmer.name.contains(name_search)
              ).order_by(
                    Swimmer.name
                  ).paginate(
                        per_page = swimmers_per_page, 
                        page = page_num,
                        error_out=False
                    )

    return render_template(
            'search_swimmers.html', 
            swimmers = swimmers,
            name_search = name_search, 
       )

和你search_swimmers.html这样:

{% extends 'base.html' %}

{% block content %}
<div class="container">
  <h3>
    <span class="d-block p-2 bg-primary text-white">
      Search Swimmers Results
    </span>
  </h3>


  <p class="text-primary">Total pages: {{ swimmers.pages }}</p>
  {% for page in swimmers.iter_pages(left_edge=3, 
                                  right_edge=3, 
                                  left_current=3, 
                                  right_current=3
                                  ) 
  %}
  {% if page %}
    <a href="{{ url_for('search_swimmers',page_num=page, search_term=name_search) }}">{{page}}</a>
  {% else %}

  {% endif %}
  {% endfor %}


  {% for swimmer in swimmers.items %}
  <div class="alert alert-primary" role="alert">
    {{ swimmer.name }}
  </div>
  {% endfor %}

  <p class="text-primary">Total pages: {{ swimmers.pages }}</p>
  {% for page in swimmers.iter_pages(left_edge=3, 
                                  right_edge=3, 
                                  left_current=3, 
                                  right_current=3
                                  ) 
  %}
      {% if page %}
        <a href="{{ url_for('search_swimmers',page_num=page, search_term=name_search) }}">{{page}}</a>
      {% else %}

      {% endif %}
  {% endfor %}


  <div class="container">
    <form action="{{ url_for('search_swimmers',page_num=1) }}" method="get" class="form-inline my-2 my-lg-0">
      <input class="form-control mr-sm-2" type="text" name="name" value="{{ search_term }}" aria-label="Search">
      <button class="btn btn-primary my-2 my-sm-0" type="submit"><svg class="bi bi-search" width="1em" height="1em" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
          <path fill-rule="evenodd" d="M10.442 10.442a1 1 0 011.415 0l3.85 3.85a1 1 0 01-1.414 1.415l-3.85-3.85a1 1 0 010-1.415z" clip-rule="evenodd"/>
          <path fill-rule="evenodd" d="M6.5 12a5.5 5.5 0 100-11 5.5 5.5 0 000 11zM13 6.5a6.5 6.5 0 11-13 0 6.5 6.5 0 0113 0z" clip-rule="evenodd"/>
        </svg></button>
    </form>
  </div>

</div>

{% endblock content %}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

显示带有html标签的javascript变量值

来自分类Dev

在Ansible中设置变量值时如何使用算术?

来自分类Dev

显示变量值?

来自分类Dev

在文本javafx中显示变量值

来自分类Dev

在jQuery代码中显示变量值

来自分类Dev

基于现有列中变量值的Pandas数据框中的新列

来自分类Dev

如何使用R中的函数更新数据框中的变量值?

来自分类常见问题

带有构建时间的变量值env vars

来自分类Dev

带有构建时间的变量值env vars

来自分类Dev

带有 Django 的 HTML 上的动态变量值

来自分类Dev

使用AspectJ记录局部变量值

来自分类Dev

分配值时不显示变量值

来自分类Dev

执行存储过程时显示声明的变量值

来自分类Dev

显示来自 2 个面板的变量值时出错

来自分类Dev

如何在Flask HTML模板中设置变量值

来自分类Dev

如何从Flask路由功能中清除变量值?

来自分类Dev

数据框中各列的变量值计数

来自分类Dev

winapi-使用宏在MessageBox中显示int变量值

来自分类Dev

MessageBox在Power Builder中显示文本和变量值

来自分类Dev

“ ???” 显示在背景虚化而不是变量值中

来自分类Dev

调试断点-在日志消息中显示变量值

来自分类Dev

在PHP的Bootstrap模型中显示foreach循环变量值

来自分类Dev

在Python中使用%d准备要显示的变量值

来自分类Dev

使用v-if根据变量值显示html元素

来自分类Dev

使用bash在变量名中的变量值

来自分类Dev

我们如何使用php将带有字符串的php变量值提交到数据库中

来自分类Dev

在Swift中更改变量值时执行方法

来自分类Dev

cfchart中的变量值

来自分类Dev

从具有变量名称的变量中获取变量值时,tcl的替代似乎比设置的要慢

Related 相关文章

热门标签

归档