6

我有一个关于 URL 更改的非常基本的问题。假设我有一个http://example.com/create包含一些输入字段的表单的 HTML 页面。从这个输入字段中,我想创建一个 python 列表,该列表应该用于生成另一个 HTML 页面http://example.com/show_list,其中包含基于 python 列表值的列表。

所以观点http://example.com/create是:

@app.route('/create', methods=['GET', 'POST']) 
def create():

if request.method == 'POST':
    some_list = parse_form_data_and_return_list(...)
    return render_template( "show_list.html", some_list=some_list)  #here's the problem!

return render_template( "create.html")

假设parse_form_data_and_return_list(...)接受用户输入并返回一个包含一些string值的列表。我在困扰我的行中添加了评论。我稍后会回到它,但首先给你页面的模板(http://example.com/show_list),应该在用户输入之后加载:

{% block content %}
<ul class="list">       
  {% for item in some_list %}
    <li>
        {{ item }}
    </li>
  {% endfor %}
</ul>
{% endblock content %}

基本上这工作正常。列表值被“传递”到 Jinja 模板并显示列表。

如果您现在再次查看我的路由方法,您会发现我只是在render_template显示shwo_list页面。对我来说,这有一个缺点。URL 不会更改为http://example.com/show_list,但会保持在http://example.com/create

所以我考虑在方法调用中创建一个自己的routeforshow_list和 in ,而不是直接渲染下一个模板。像这样:create()redirect

@app.route('/show_list')
def tasklist_foo():
return render_template( "show_list.html" )

但在这种情况下,我看不到如何将list对象传递给show_list(). 我当然可以将列表中的每一项解析为 URL(因此将其发布到http://example.com/show_list),但这不是我想要做的。

正如您可能已经认识到的那样,我对 Web 开发还很陌生。我想我只是使用了错误的模式,或者没有找到一个简单的 API 函数来解决这个问题。所以我恳请您向我展示一种解决我的问题的方法(很快总结):渲染show_list模板并将 URL 从更改http://example.com/createhttp://example.com/show_list使用在create()方法/路由中创建的列表。

4

2 回答 2

10

如果列表不是很长,您可以将其传递给查询字符串,例如逗号分隔:

comma_separated = ','.join(some_list)
return redirect(url_for('show_list', some_list=comma_separated))
# returns something like 'http://localhost/show_list?some_list=a,b,c,d'

然后在您视图中的模板中,您可以像这样迭代它们:

{% for item in request.args.get('some_list', '').split(',') %}
    {{ item }}
{% endfor %}

对于更长的列表,或者如果您不想在查询字符串中公开它,您也可以将列表存储在会话中

session['my_list'] = some_list
return redirect(url_for('show_list'))

然后在模板中:

{% for item in session.pop('my_list', []) %}
    {{ item }}
{% endfor %}
于 2013-08-13T10:33:36.620 回答
0

除了将列表存储在会话中之外,您还可以简单地更改表单操作以发布到新路由。然后从“show_list”路由中处理表单数据并呈现您的模板。

表格标题:

<form action="{{ url_for('show_list') }}" method="post">

更新了 show_list 路线:

@app.route('/show_list', methods=['GET', 'POST']) 
def show_list():
    if request.method == 'POST':
        some_list = parse_form_data_and_return_list(...)
        return render_template("show_list.html")
    else:
        # another way to show your list or disable GET
        return render_template("show_list.html")

我不一定反对使用会话存储,但我认为不使用它会更干净,因为您不必担心清除会话变量。

于 2014-08-12T15:29:35.050 回答