У меня есть выбранная форма, которую нужно заполнить через AJAX. Рассмотрим простой пример:Добавление переменной контекста с AJAX в Flask
шаблоны/index.html
<!DOCTYPE html>
<html>
<body>
<select id="elements">
</select>
<script src="http://code.jquery.com/jquery-latest.min.js" type="text/javascript"></script>
<script>
$.ajax({
url: '/get-something/5',
type: "GET",
dataType: "html",
success: function (msg) {
$('#elements').html(msg)
}
})
</script>
</body>
</html>
app.py
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html')
@app.route('/get-something/<int:n>')
def get_something(n):
result = ''
for i in xrange(n):
result += "<option value='%s'>%s</option>\n" % (i, i)
return result
if __name__ == '__main__':
app.run(debug=True)
Это работает просто отлично и это то, что я сделал. Но мне было интересно, существует ли другой (лучше?) Способ.
Например, я бы предпочел иметь переменную контекста, чтобы лучше отделить представление от контроллера. Что-то вроде этого:
app.modified.py
@app.route('/get-something/<int:n>')
def get_something(n):
return dict(elements=xrange(n))
шаблоны/index.modified.html
<select id="elements">
{% for elem in elements %}
<option value='{{ elem }}'>{{ elem }}</option>\n
{% endfor %}
</select>
К сожалению, это делает не работу. Он говорит, «dict» объект не может быть вызван.
Любая помощь пожалуйста? Возможно ли это? Обратите внимание, что я не хочу перезагружать страницу, я хочу, чтобы то же поведение, что и в примере AJAX.
Beat me to :) :) – junnytony
Это будет перезагружать страницу. Я не хочу этого. – blueSurfer
Затем вы должны отправить Json not html и проанализировать с помощью JavaScript, чтобы построить select. Используйте return json.dumps (thedictionary), чтобы отправить словарь элементов. Я не буду менять ответ, поскольку проблема была связана с шаблонами. – John