2015-06-03 2 views
0

У меня есть выбранная форма, которую нужно заполнить через 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.

ответ

1

Использование index.modified, что вам нужно сделать что-то вроде этого:

return render_template('index.modified.html', 
         elements=your_dictionary) 

Не пытается вернуть словарь (поэтому вы получаете эту ошибку). См. http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-ii-templates. Еще примеры

+0

Beat me to :) :) – junnytony

+0

Это будет перезагружать страницу. Я не хочу этого. – blueSurfer

+0

Затем вы должны отправить Json not html и проанализировать с помощью JavaScript, чтобы построить select. Используйте return json.dumps (thedictionary), чтобы отправить словарь элементов. Я не буду менять ответ, поскольку проблема была связана с шаблонами. – John

0

Вы должны вернуть render_template('index.modified.html', elements=xrange(n)), так как вы хотите html.

render_template возвращает строку, которую вы затем можете кодировать как JSON. Пример:

data = render_template('index.modified.html', elements=xrange(n)) 
return json.dumps({'data': data})