分页显示,下一页要记住表单值,一般用 url 传值?还是 js 传?

2016-07-25 13:43:53 +08:00
 rogwan

一个搜索页的表单,查找出来的内容比较多,要分页显示。用 SQLAlchemy 的 paginate()做分页,默认页是 OK 的,下一页就记不住 SearchForm 里的 value = form.keyword.data 值(搜索的关键字)。

一般是把这个 value 值,通过 app.route 里的 url 形式的参数传值? 还是用 js 的方式传比较好?

5511 次点击
所在节点    Python
23 条回复
jugelizi
2016-07-25 13:55:26 +08:00
你看百度搜索
hiro0729
2016-07-25 15:25:09 +08:00
当然是 url 传值了,按 F5 刷新能保留状态,要是纯 js 传,页面刷新参数全初始化了。
WittBulter
2016-07-25 15:28:17 +08:00
url 传值比较好
但是一般在 js 里面取,建一个规范的对象树
如果没有就把 url 参数转到对象上存起来,这样每次取速度都很高
learnshare
2016-07-25 15:28:56 +08:00
URL 太长的话,存 localStorage
aleen42
2016-07-25 15:45:44 +08:00
localStorage 时间有点长,个人觉得可以使用 cookie 存储一下用户的行为就可以了。
kaneg
2016-07-25 16:24:38 +08:00
看你考虑不考虑页面刷新的问题,不考虑的话,参数都放在页面里,请求用 ajax ,不要太简单。
如果要考虑刷新,那就不得不用上面几位提到的方法了
orzfly
2016-07-25 16:56:51 +08:00
@aleen42 Cookie 是会发到服务器去的…
rogwan
2016-07-25 17:45:26 +08:00
@hiro0729
@WittBulter

参考官方文档介绍,用 url 方式传值:
http://flask.pocoo.org/docs/0.11/quickstart/#url-building
--------------------
你可以用 args 属性来接收在 URL ( ?key=value ) 中提交的参数:
searchword = request.args.get('key', '')
--------------------
@app.route('/search', methods=['GET'])
def search():
form = SearchForm():
keyword = form.search_keyword.data

value = request.args.get('keyword')

这样写,点击“下一页”,还是取不到 value 的值啊
aleen42
2016-07-25 17:45:48 +08:00
@orzfly 服务器需要页码去分页查询吗?还是数据全 load 到 view 层了?
domty
2016-07-25 17:55:03 +08:00
url 正好,
如果 url 过长,可以考虑本地弄几个 hidden 的 input 去存,跳转分页的时候再用 js 去拼 url 。
rogwan
2016-07-25 17:55:53 +08:00
@kaneg

ajax 异步加载的方法,我只用过和后台请求简单的数据返回。
页面刷不刷新都可以,主要是这个 ajax 配合 Flask SQLAlchemy 的 Pagination 分页,以前没使过>_<!!,不知道要调试多久才能搞定。。。 有推荐的文章可以参考下吗?
chaegumi
2016-07-25 18:23:39 +08:00
chaegumi
2016-07-25 18:24:16 +08:00
chaegumi
2016-07-25 18:25:29 +08:00
honmaple
2016-07-26 01:15:21 +08:00
第一页使用 wtforms,之后的将 keyword 传入模板,
构造下一页时 url_for 加上 search=keyword 参数,
后台就能直接 value = request.args.get('search') 得到
rogwan
2016-07-26 06:43:55 +08:00
@honmaple 嗯,是用 wtforms 的。现在遇到的问题是:在第一页通过 form 取到 keyword 之后,传给模板,分页的下一页是通过 SALAlchemy 的 paginate()方法,我在那里添加 url_for 参数,返回值是空的。搞得下一页,就成了空白。。。

#form.py
class SearchForm(Form):
search_keyword = StringField('', validators = [DataRequired()])
submit = SubmitField('Start Search')

#view.py
@app.route('/search', methods=['POST', 'GET'])
def search():
form = SearchForm():
keyword = form.search_keyword.data

page = request.args.get('page', 1, type=int)
value = request.args.get('keyword')

if form.validate_on_submit():
pagination = Post.query.filter(Post.content.like(keyword))paginate(
page, per_page=current_app.config['default'], error_out=False)

posts = pagination.items
return render_template('search.html', posts=posts, pagination=pagination, form=form, value=value)

#search.html

<div class="list">
{% include 'list.html' %}
</div>
{% if pagination %}
<div class="pagination">
{{ macros.pagination_widget(pagination, '.search', value=value)}}
</div>
{% endif %}
honmaple
2016-07-26 10:03:47 +08:00
如果是我做的话大概是这样

def search():
form = DoSearchForm()
if form.validate_on_submit():
search = form.search.data
return redirect(url_for('search_content', search=search))
return render_template('搜索页')


def search_content():
page = request.args.get('page')
search = request.args.get('search')
if not search:
return redirect(url_for('search'))
else:
posts = Post.query.filter(Post.content.like(search)).paginate(
page,
per_page=current_app.config['default'],
error_out=False)
return render_template('显示内容页', posts=posts)
rogwan
2016-07-26 10:11:15 +08:00
现在搞定了上面分页传值这个问题了,又出现新故障:
https://example.com/search?keyword=foo&page=2
在这个第二页的搜索表单里回传了 foo 参数,但是用户再手动输入别的 keyword (比如 xxoo ),点击“提交”后,还是显示原来的搜索结果(即:还是搜索 keyword=foo ,而不是搜索 keyword=xxoo )。
rogwan
2016-07-26 10:13:57 +08:00
@honmaple 非常感谢!看起我上面的第二个问题,是需要你说的用 url_for 跳一次才能解决。只在一个函数里处理,判断写了好几层,自己都快看晕了。。。
honmaple
2016-07-26 10:22:25 +08:00
使用一个函数的

def search():
form = DoSearchForm()
page = request.args.get('page', type=int)
search = request.args.get('search')
if form.validate_on_submit() and request.method == 'POST':
search = form.search.data
return redirect(url_for('forums.search', search=search, page=1))
else:
topics = Topic.query.filter(Topic.content.like(search)).paginate(
page,
per_page=current_app.config['PER_PAGE'],
error_out=False)
return render_template('forums/search.html', topics=topics,form = form)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/294743

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX