2013-06-28 4 views
3

Этот вопрос задан раньше, и я думаю, что я сделал то, что видел, но не знаю, что я делаю неправильно. Я не знаю много о jQuery, но я сделаю все возможное, чтобы объяснить, что я пытаюсь сделать.Использование автозаполнения jQuery с Flask

Я хочу автозаполнения на основе запроса из базы данных, так что у меня есть это в моем шаблоне:

<script type="text/javascript"> 
    $(function() { 
     $("#function_name").autocomplete({ 
      source: '{{url_for("autocomplete")}}', 
      minLength: 2, 
     }); 
    }); 
</script> 

<form id="function_search_form" method="post" action=""> 
    {{form.function_name}} 
</form> 

форма генерируется с помощью этой формы Настой класса:

class SearchForm(Form): 
    function_name = TextField('function_name', validators = [Required()]) 

И здесь функция автозаполнения:

@app.route('/autocomplete') 
def autocomplete(): 
    results = [] 
    search = request.args.get('term') 
    results.append(db.session.query(Table.Name).filter(Table.Name.like('%' + search + '%')).all()) 
    return dumps(results) 

Так JQuery должен перейти к функции автозаполнения и ге t некоторые JSON вернутся к автозаполнению с. По крайней мере, я думаю, это то, что происходит. Что я здесь делаю неправильно?

+0

@morphyn Да. Он называется function_name. Я даже проверил HTML, созданный Flask, и это правильно. EDIT: Кажется, что комментарий исчез. Ну что ж. – miscsubbin

+0

Привет, miscsubbin, я пытаюсь реализовать эту функцию автозаполнения, но я не могу этого сделать. Я также попробовал ваш метод и попробовал решение, приведенное ниже. но я столкнулся с проблемой получения значения в request.args.get ('term'). Это всегда для меня. Не знаю, что происходит. Было бы здорово, если бы вы могли предоставить фрагмент рабочего кода. Заранее спасибо. – Pradeepb

ответ

3

Update:

autocomplete не обрабатывает запрос Ajax автоматически, если вы даете ему URL, вы должны сделать это вручную:

$(document).ready(function() { 
    $.ajax({ 
     url: '{{ url_for("autocomplete") }}' 
    }).done(function (data) { 
     $('#function_name').autocomplete({ 
      source: data, 
      minLength: 2 
     }); 
    }); 
} 

Вы, возможно, придется изменить так, как вы справиться возвращаемые данные, в зависимости от того, что возвращает ваш API.

Update 2:

Результат запроса на стороне сервера выглядит следующим образом:

[[["string1"], ["string2"], ... ["stringn"]]] 

Вы можете выровнять его перед отправкой:

import itertools 
flattened = list(itertools.chain.from_iterable(result[0])) 

Но вы вероятно, может улучшить ваш запрос, чтобы напрямую возвращать список строк. Вам нужно будет опубликовать весь код, если вам нужна помощь.

+0

Функция автозаполнения на самом деле работает нормально. Если я перейду к 127.0.0.1:5000/autocomplete?term=something, я получу соответствующий JSON. Мой стол называется чем-то другим, но для цели вопроса это действительно не нужно. Кроме того, причина, по которой я использовал результаты.append' и 'results = []', заключается в том, что я использую несколько более сложный запрос, который включает цикл, но это не проблема, которую я испытываю. – miscsubbin

+0

ОК, моя следующая догадка заключается в том, что вы, вероятно, не можете указать URL-адрес непосредственно в параметре 'source' функции' autocomplete'. Вероятно, вам придется выполнить запрос Ajax вручную. Я обновлю свой ответ, чтобы привести пример. –

+0

Так что на самом деле это действительно GET'ing от моей функции. Я немного изменил свою функцию, чтобы просто вернуть каждое имя в JSON. Тем не менее, я все еще не получаю автозаполнения. Есть ли способ форматировать ответ, сделанный Flask? Как я должен это делать? – miscsubbin

1

На самом деле вам даже не нужен запрос, чтобы сделать эту работу! Использование стандартного JQuery-UI автозаполнения, вы можете бросить свои возможные элементы в переменную дзиндзя, а затем:

<script type="text/javascript"> 
$('#search_form').autocomplete({ 
    source: JSON.parse('{{jinja_list_of_strings | tojson | safe}}'), 
    minLength: 2, 
    delay: 10, 
}); 
</script> 

Это очень удобно, если элементы привязаны к current_user, как и в Flask-Login.

<script type="text/javascript"> 
$('#search_form').autocomplete({ 
    source: JSON.parse('{{current_user.friends | map(attribute="name") | list | tojson | safe}}'), 
    minLength: 2, 
    delay: 10, 
}); 
</script>