问题描述:我有一个游泳者名称列表,存储在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] 删除。
我来说两句