Django, JQuery et autocomplete

après quelques recherches approfondies (googling), Je ne peux pas trouver un tutoriel actuel sur la façon de configurer autocomplete en utilisant Django et JQuery. Il semble y avoir une variété de plugins et il ne semble pas y avoir de cohérence ou de norme à propos de laquelle utiliser ou quand.

Je ne suis pas un pro à Django ou JQuery, mais j'ai besoin d'une solution autocomplète qui soit bien documentée et assez simple à utiliser.

des Suggestions?

19
demandé sur Paul Schreiber 2011-02-22 08:21:45

8 réponses

si vous cherchez dans vos modèles django quelque chose comme:

from django.utils import simplejson
    def autocompleteModel(request):
    search_qs = ModelName.objects.filter(name__startswith=request.REQUEST['search'])
    results = []
    for r in search_qs:
        results.append(r.name)
    resp = request.REQUEST['callback'] + '(' + simplejson.dumps(result) + ');'
    return HttpResponse(resp, content_type='application/json')

Pour le jQuery autocomplete et appel:

function searchOpen() {
    var search = $('#txtSearch').val()
    var data = {
        search: search
    };
    $.ajax({
        url: '/search.json',
        data: data,
        dataType: 'jsonp',
        jsonp: 'callback',
        jsonpCallback: 'searchResult'
    });
}


function searchResult(data) {
    $( "#txtSearch" ).autocomplete ({
        source: data
    });
}

enfin, pour tout connecter sur votre formulaire d'entrée aurait quelque chose comme:

<input type="text" name="search" id="txtSearch" onkeyup="searchOpen()" />

Note, Ceci utilise aussi jQuery UI en plus de stock jQuery.

14
répondu CraigKerstiens 2011-02-22 06:36:55

pendant ce temps, un bon tutoriel est apparu.

autocomplete fait tout pour vous, tout ce que vous avez à faire est la suivante:

js

$(function() {
  $("#search-field").autocomplete({
    source: "/ajax_calls/myFunction",
    minLength: 2,
  });
});

urls.py

url(r'^ajax_calls/myFunction/', 'my_app.views.handler_function'),

views.py

def get_drugs(request):

    if request.is_ajax():
        .....
        data = json.dumps(results)
    else:
        data = 'fail'
    mimetype = 'application/json'
    return HttpResponse(data, mimetype)

SOURCE: http://flaviusim.com/blog/AJAX-Autocomplete-Search-with-Django-and-jQuery/

7
répondu Mihai Zamfir 2014-10-06 13:39:19

je suis un grand fan de django-saisie semi-automatique: https://bitbucket.org/tyrion/django-autocomplete/wiki/Home . Il dispose d'un plug-and-play agréable et est très facile à intégrer avec vos propres applications sans beaucoup de codage supplémentaire.

3
répondu JudoWill 2011-02-22 06:30:15

disons que vous voulez configurer autocomplete sur un champ d'entrée (comme <input type="text" id="id_input">) avec le nom d'utilisateur de vos utilisateurs. C'est comme ça que je l'ai fait, et ça a bien fonctionné pour moi.

urls.py

tout d'abord, ajoutez l'url où ajax cherchera

url(r'^ajax/autocomplete/$', views.autocomplete, name='ajax_autocomplete')

views.py

puis définir une vue pour extraire de la base de données les informations que vous besoin d'

from django.http import JsonResponse

def autocomplete(request):
    if request.is_ajax():
        queryset = User.objects.filter(username__startswith=request.GET.get('search', None))
        list = []        
        for i in queryset:
            list.append(i.username)
        data = {
            'list': list,
        }
        return JsonResponse(data)

JavaScript

enfin, vous devez créer une fonction JavaScript qui va dans la base de données et renvoie les noms d'utilisateur qui correspondent à la valeur du champ d'entrée chaque fois que vous appuyez sur (et relâchez) une touche. Pour cela, nous allons utiliser Ajax, JQuery et JQuery-uisaisie semi-automatique de la fonction

jQuery(function() {
    $("#id_input").on('keyup', function(){
        var value = $(this).val();
        $.ajax({
            url: "{% url 'ajax_autocomplete' %}",
            data: {
              'search': value 
            },
            dataType: 'json',
            success: function (data) {
                list = data.list;
                $("#id_input").autocomplete({
                source: list,
                minLength: 3 
                });       
            }
        });        
    });
  });

Et voilà, mon ami! Pour plus d'informations, vous pouvez consulter cette tutoriel

2
répondu rvliscano 2017-06-16 21:16:40

django-saisie semi-automatique-lumière est très belle option. Il est très facile à utiliser et aussi très bien documenté. Lien: https://github.com/yourlabs/django-autocomplete-light

Documentation:https://django-autocomplete-light.readthedocs.org/en/master/

1
répondu chiseledCoder 2015-11-20 19:46:41

Il y a un chemin sans l'aide de Json:

exemple: supposons que vous avez un modèle nommé Collège:

class College(models.Model):
    collegeName = models.CharField(max_length=250)
    def __str__(self):
        return self.collegeName

maintenant, render un contexte nommé 'all_colleges' = College.objet.tous les() pour votre modèle:

HTML:

<input type="text" id="college"/>

JS:

  $( function() {
    var availableColleges = [
      {% for clg in all_colleges %}
          "{{clg}}",
      {%endfor%}
    ];
    $( "#clg" ).autocomplete({
      source: availableColleges
    });
  } );

Ressources à inclure dans le modèle:

<link rel="stylesheet" href="http://code.jquery.com/ui/1.8.18/themes/base/jquery-ui.css" type="text/css" media="all" />
<script src="https://code.jquery.com/jquery-1.12.4.min.js"></script>
<script src="https://code.jquery.com/ui/1.12.0/jquery-ui.min.js"></script>

C'est ça!

si vous avez besoin d'autocomplete pour montrer options qui commencent avec le terme entré, Modifiez la fonction de filtre autocomplete par défaut en ajoutant cet extrait dans votre template:

 // over write the default autocomplete function to match the option starting with entered term 
  $.ui.autocomplete.filter = function (array, term) {
    var matcher = new RegExp("^" + $.ui.autocomplete.escapeRegex(term), "i");
    return $.grep(array, function (value) {
      return matcher.test(value.label || value.value || value);
    });
  };

Commentaire si vous rencontrez le moindre problème :)

0
répondu Rishabh Agrahari 2016-09-08 06:23:23

j'ai trouvé que la façon la plus simple pour commencer (bien que probablement pas optimale pour la production) est JQuery Autocomplete Widget.

la manière la plus basique nécessite juste de copier-coller le code dans votre html, en utilisant un tableau comme un source:

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>jQuery UI Autocomplete - Cities example</title>
  <link href="style.css" rel="stylesheet">

  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.css">
  <script src="https://code.jquery.com/jquery-1.12.4.js"></script>
  <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
</head>

<body>  
<div class="ui-widget">
  <label for="tags">Cities: </label>
  <input id="tags">
</div>

<script>
    $( function() {
      var availableTags = [
          'Barcelona',
          'Berlin',
          'London',
          'Madrid',
          'Rome',
          'Paris'
      ];
      $( "#tags" ).autocomplete({
        source: availableTags
      });
    } );
</script>

</body>
</html>
0
répondu J0ANMM 2016-12-22 11:25:09

Dans django 1.10-je utiliser le même code

url:

# Ajax
    url(r'^search-autocomplete/$', autocompleteModel,  name='search-autocomplete'),

vue:

def autocompleteModel(request):
    search_qs = Account.objects.filter(email__startswith=request.GET['search'])
    results = []
    for r in search_qs:
        results.append(r.email)
    resp = request.GET['callback'] + '(' + simplejson.dumps(results) + ');'
    return HttpResponse(resp, content_type='application/json')

js:

$(document).ready(function () {
    function searchOpen() {
        var search = $('#countryId').val();
        $.ajax({
            url: '/cabinet/search-autocomplete',
            dataType: 'jsonp',
            type: 'GET',
            async: false,
            data: injectCsrfToken({
                search: search
            }),
            success: function (data) {
                searchResult(data)
            },
            error: function () {
                console.log('error');
            }

        });
    }
    function searchResult(data) {
        console.log('sdfsdfd');
        $( "#countryId" ).autocomplete ({
            source: data
        });
    }
    $("#countryId").on('keyup', function () {
        searchOpen();
    });
});

html:

<input id="countryId" type="text" name="fname">
0
répondu user_ivanp 2017-06-04 15:03:11