Плагин автозаполнения Jquery с Django (решение Trey Piepmeier) - PullRequest
0 голосов
/ 13 апреля 2010

Итак, я основываю свой код на решении Трея:
http://solutions.treypiepmeier.com/2009/12/10/using-jquery-autocomplete-with-django/

Сценарий:

    <script>
        $(function() {
        $('#id_members').autocomplete('{{ object.get_absolute_url }}members/lookup', {
            dataType: 'json',
            width: 200,
            parse: function(data) {
                return $.map(data, function(row) {
                    return { data:row, value:row[1], result:row[0] };
                });
            }
            }).result(
                function(e, data, value) {
                    $("#id_members_pk").val(value);
                }
            );
        }
    );
   </script>

views.py:

def members_lookup(request, pid):  
    results = []
    if request.method == "GET":
        if request.GET.has_key(u'q'):
            value = request.GET[u'q']
            # Ignore queries shorter than length 1
            if len(value) > 2:

                model_results = Member.objects.filter(
                                Q(user__first_name__icontains=value) | Q(user__last_name__icontains=value)
                                )
                results = [ (x.user.get_full_name(), x.id) for x in model_results ]
    json = simplejson.dumps(results)
    print json
    return HttpResponse(json, mimetype='application/json')

Проблема :
Прекращает уточнение результатов поиска после первоначального поиска. Например:
Если я установлю len (значение)> 2, после того, как я введу третий символ, он выдаст мне список предложений. Но если я продолжу печатать 4-й или 5-й символ, список предложений не изменится.

Любые предложения о том, почему это так?

Ответы [ 2 ]

0 голосов
/ 13 апреля 2010

Я решил это, передав строку со стороны представления в формате, который jquery autocomplete может легче проанализировать.

def members_lookup(request, pid):
    results = ''
    if request.method == "GET":
        if request.GET.has_key(u'q'):
            value = request.GET[u'q']
            # Ignore queries shorter than length 1
            if len(value) > 2:
                model_results = Member.objects.filter(
                                Q(user__first_name__icontains=value) | Q(user__last_name__icontains=value)
                               )
                for r in model_results:
                    results += '%s|%s\n' % (r.user.get_full_name(), r.id)

    return HttpResponse(results, mimetype='text/html')

Тогда на стороне клиента:

<script>
$().ready(function() {
    $("#id_members").autocomplete("{{ object.get_absolute_url }}members/lookup/", {
        width: 260,
        minChars: 2,
        selectFirst: false
    });

    $("#id_members").result(function(event, data, formatted) {
        if (data)
            $(this).parent().next().find("input").val(data[1]);
    });
});
</script>
0 голосов
/ 13 апреля 2010

Для серверной части я рекомендую посмотреть ajax select application

...