记住分页的表单数据

时间:2012-08-30 18:03:16

标签: python pagination flask template-engine flask-sqlalchemy

在我的Flask应用程序中,我有一个视图,它使用Flask-SQLAlchemy分页方法呈现项目表。到目前为止很棒的东西但我想添加排序和过滤,所以我创建了一个带有选择框的表单,用户可以在其中选择排序和过滤选项。

在页面上提交排序/过滤器时,视图工作正常:第一页已排序。但是在页面上选择另一个页面时,分页将回退到原始查询。在新页面加载期间,我该怎么做才能保存排序/过滤器选项?使用flask.g已经出现在我面前,但这是正确的方法吗?

class ItemTableForm(Form):
    sort_choices = [('id', 'ID'),
                    ('name', 'Name'),
                    ('status', 'Status')]
    filter_choices = [('all', 'All'),
                      ('instock', 'In stock'),
                      ('sold', 'Sold')]
    sort = SelectField(u'Sort by', choices=sort_choices)
    filter = SelectField(u'Filter by', choices=filter_choices)

@app.route('/browse/<int:page>', methods=("GET", "POST"))
def browse(page):
    form = ItemTableForm()
    if form.validate_on_submit():
        query = Item.query.order_by(getattr(Item, form.sort.data))
    else:
        query = Item.query

    pagination = paginate(query, page)
    return render_template('browse.html', pagination=pagination, form=form)

# My template contains this form and a regular HTML table
<form action="{{ url_for('browse') }}" method="POST">
  {{ form.hidden_tag() }}
  {{ form.sort.label }} {{ form.sort() }}
  {{ form.filter.label }} {{ form.filter() }}
  <button type="submit" class="btn">Submit</button>
</form>

2 个答案:

答案 0 :(得分:7)

您可以使用url参数传递有关排序的信息。假设用户按名称选择排序。然后在url的末尾添加它

    your_url?sort=name

然后您可以将其作为

进行访问
    value = request.args.get('name','')

只需将排序变量值传递给您将排序值附加到下一个网址的模板。

编辑:

要在Flask中创建此类网址,请执行以下操作:

    url_for('url_view_name', sort='name')

这将返回带有作为查询参数附加的排序的url。查看烧瓶文档here以了解有关网址构建的更多信息

答案 1 :(得分:-1)

你可以用Javascript做到这一点。由于页码是您网址的一部分,因此您可以让javascript更改要更改网页的表单的action,以便提交到包含所需页码而不是当前页面的网址。

为了澄清,当用户点击“下一个”链接/按钮或页码时,使用Javascript更改html表单的操作,以便将表单发布到所需页面而不是当前页面。