6

我想在 Jinja2 模板中使用带有参数的 AJAX 调用。但是我怎样才能使它成为可能呢?我想做这样的事情。

JavaScript:

$.get("test.html", { name: "John", time: "2pm" } );

神社模板:

<div>
{{name}} {{time}}
</div>
4

2 回答 2

6

您需要访问服务器端的请求对象以获取参数。我假设您使用的是 Flask,但如果不是,那么基本思想在其他 Web 框架上也应该是相同的。假设您有一个简单的小 index.html,您可以在其中使用 Javascript 进行 Ajax 查询:

$.get("{{ url_for('ajax') }}", {name: "John", time: "2pm"});

请注意,如果您不使用 Jinja2 来呈现脚本部分,请将 url_for() 调用替换为实际的 URL,因此在下面的示例中类似于 /ajax:

$.get("/ajax", {name: "John", time: "2pm"});

现在,在服务器端,您将拥有如下内容:

from flask import Flask, render_template, request

app = Flask(__name__)

@app.route('/ajax')
def ajax():

    #Access arguments via request.args
    name = request.args.get('name')
    time = request.args.get('time')

    #NOTE: In real code, check that the arguments exist

    #Silly logging call to show that arguments are there
    app.logger.info(name)
    app.logger.info(time)

    #Do stuff here to do what you want or modify name/time
    ...

    #Render template and pass the arguments to it
    return render_template('ajax.html',
                           name=name,
                           time=time)

@app.route('/index')
def index():
    return render_template('index.html')

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

和 ajax.html 看起来像这样,例如:

<h2>{{ name }}</h2>
<h2>{{ time }}</h2>

因此 request.args 是您可以访问通过 GET 传递的参数的地方,但您需要使用 render_template() 调用将它们显式传递给 Jinja2。Jinja2 只是一种模板语言,它不知道您的论点 (1),除非您将它们传递给它。

1) 有一些例外。例如,Flask 确实将一些参数隐式传递给 Jinja2,例如请求对象。

于 2013-06-10T17:05:03.737 回答
0

使用 jquery 获取 div 的内容。为了方便使用元素选择器:

<div>
    <span id="name">{{name}}</span> <span id="time">{{time}}</span>
</div>


name = $("#name").text()
time = $("#time").text()
$.get("test.html", {name : name, time : time} );
于 2013-06-09T11:29:39.640 回答