2013-06-28 2 views
3

이 질문은 이전에 물어 보았습니다. 내가 본 것을 이미 끝 냈다고 생각합니다.하지만 내가 잘못하고있는 것을 정말로 모르겠습니다. jQuery에 대해 많이 알지는 못하지만, 최선을 다해 내가하려는 일을 설명 할 것입니다.Flask로 jQuery 자동 완성 사용하기

은 내가 데이터베이스에서 쿼리를 기반으로 자동으로 완성하려는, 그래서 난 내 템플릿이 있습니다

<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는 자동 완성 함수로 이동해야하고 ge 일부 JSON이 자동 완성으로 돌아갑니다. 적어도 나는 그렇게 생각합니다. 여기서 내가 뭘 잘못하고 있니?

+0

@morphyn 예. function_name이라고합니다. 나는 심지어 플라스크에 의해 생성 된 HTML을 체크했고 그것은 정확하다. 편집 : 댓글이 사라진 것으로 보입니다. 오 잘. – miscsubbin

+0

안녕하세요 miscsubbin,이 자동 완성 기능을 구현하는 노력하고 있지만 그렇게 할 수 없습니다. 나는 또한 당신의 방법을 시도하고 아래에 제공된 해결책을 시도했다. request.args.get ('용어')에서 가치를 얻는 데 문제가 있습니다. 그 날은 항상 null입니다. 무슨 일이 일어나고 있는지 몰라. 작업 코드 스 니펫을 제공 할 수 있다면 좋을 것입니다. 미리 감사드립니다. – Pradeepb

답변

3

업데이트 :

autocomplete 당신이 그것에게 URL을 제공하는 경우 자동으로 Ajax 요청을 처리하지 않습니다, 당신은 수동으로 수행해야합니다

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

당신은 당신이 처리하는 방식을 수정해야 할 수도 있습니다 API가 반환하는 값에 따라 반환되는 데이터

업데이트 2 :

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

하지만 :

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

당신은 그것을 보내기 전에 그것을 평평하게 할 수 있습니다

서버 측에서 쿼리의 결과는 다음과 같습니다 아마도 문자열 목록을 직접 반환하도록 쿼리를 향상시킬 수 있습니다. 도움이 필요하면 전체 코드를 게시해야합니다.

+0

자동 완성 기능이 실제로 정상적으로 작동합니다. 127.0.0.1:5000/autocomplete?term=something으로 가면 적절한 JSON을 받게됩니다. 내 테이블은 다른 것으로 불리지 만, 질문의 목적 상 실제로 필요하지는 않습니다. 또한, 내가'결과를 사용하는 이유.append'와'results = []'는 루프를 포함하는 좀 더 복잡한 쿼리를 사용하지만, 문제는 아닙니다. – miscsubbin

+0

OK, 내 다음 추측은'autocomplete' 함수의'source' 매개 변수에서 직접 URL을 제공 할 수 없다는 것입니다. 아마 Ajax 요청을 수동으로해야 할 것이다. 나는 예를 들기 위해 나의 대답을 업데이트 할 것이다. –

+0

그래서 현재 실제로 내 기능에서 얻고 있습니다. JSON에서 모든 이름을 반환하기 위해 함수를 약간 변경했습니다. 나는 아직도 어떤 자동 완성도 얻지 않고있다. 플라스크에서 만든 응답을 형식화해야하는 방법이 있습니까? 어떻게해야합니까? – miscsubbin

1

실제로이 작업을 요청하지 않아도됩니다. 표준 JQuery와 - UI를 자동 완성을 사용하면 다음 신사의 변수로 가능한 항목을 던질 수 : 항목이 Flask-Login 같이 current_user에 연결되어있는 경우

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

이 정말 편리합니다.

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