Django, JQuery и автозаполнение - PullRequest
20 голосов
/ 22 февраля 2011

После некоторых обширных исследований (Googling) я не могу найти текущий учебник о том, как настроить автозаполнение с использованием Django и jQuery. Похоже, что существует множество плагинов, и, похоже, нет последовательности или стандарта в отношении того, что и когда использовать.

Я не профессионал ни в Django, ни в jQuery, но мне нужно решение для автозаполнения, которое хорошо документировано и довольно просто в использовании.

Предложения

Ответы [ 10 ]

15 голосов
/ 22 февраля 2011

Если вы ищете для поиска из ваших моделей Django, то что-то вроде:

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')

Для автозаполнения jQuery и вызова:

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
    });
}

Наконец, чтобы соединить все это в вашей форме ввода, нужно что-то вроде:

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

Обратите внимание, это также использует пользовательский интерфейс Jquery в дополнение к стандартному jQuery.

7 голосов
/ 06 октября 2014

Тем временем появился хороший учебник.

autocomplete все делает за вас, все, что вам нужно сделать, это:

* JS 1007 *

$(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)

ИСТОЧНИК: http://flaviusim.com/blog/AJAX-Autocomplete-Search-with-Django-and-jQuery/

3 голосов
/ 15 февраля 2017

Допустим, вы хотите настроить автозаполнение в некотором поле ввода (например, <input type="text" id="id_input">) с именем пользователя ваших пользователей. Я так и сделал, и у меня все прошло гладко.

urls.py

Прежде всего, добавьте URL, по которому ajax будет искать

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

views.py

Затем установите представление для извлечения из базы данных необходимой вам информации

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

Наконец, вам нужно создать функцию JavaScript, которая будет обращаться к базе данных и возвращать имена пользователей, которые соответствуют значению поля ввода, каждый раз, когда вы нажимаете (и отпускаете) клавишу. Для этого мы будем использовать Ajax , JQuery и JQuery-ui с функцией автозаполнения

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 
                });       
            }
        });        
    });
  });

И это все, друг мой! Для получения дополнительной информации, вы можете проверить это учебник

3 голосов
/ 22 февраля 2011

Я большой поклонник django-autocomplete: https://bitbucket.org/tyrion/django-autocomplete/wiki/Home.Он имеет приятную самонастраиваемость и очень легко интегрируется с вашими собственными приложениями без большого дополнительного кодирования.

1 голос
/ 20 ноября 2015

django-autocomplete-light - очень хороший вариант. Он очень прост в использовании и хорошо документирован. Ссылка: https://github.com/yourlabs/django-autocomplete-light

Документация: https://django -autocomplete-light.readthedocs.org / ru / master /

0 голосов
/ 10 февраля 2019

Я считаю учебник https://www.w3schools.com/howto/howto_js_autocomplete.asp хорошим. В учебнике используется статический массив стран, из которого функция автозаполнения выбирает ответы (выпадающие элементы).

Теперь, чтобы сделать то же самое более динамичным, мы можем добавить простой вызов jQuery ajax в представление Django.

var countries;
$.ajax({
    url : '/autocomplete_view';
    data : {'query':$('#query').val()};
    type : 'GET',
    success : function(response){
        countries = JSON.parse(response);
        // do something extra
    },
    failure : function(response){
        // do something here
    },
    async : false
});
0 голосов
/ 31 октября 2018

Я знаю, что реализовать автозаполнение jQuery сложно. Вот рабочий пример для Django> 2.0:

Шаг 1. Создайте простой HTML-код с вводом (не забудьте добавить ссылки для загрузки jQuery и jquery-ui). Сохраните код как testsearch.html

<head>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/themes/smoothness/jquery-ui.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.js"></script> 
</head>
<div class="ui-widget">
  <label for="search"> Search </label>
  <input id="search">
</div>

Шаг 2: Добавьте код JavaScript в HTML. Вызывает функцию автозаполнения из jquery-ui. Эта функция использует источник, который URL для Ajax вызывает

<script type="text/javascript">
$(function() {
  $("#search").autocomplete({
    source: "{% url 'project:ajax_load_project' %}",
    minLength: 2,
  });
});
</script>

Шаг 3: Теперь нам нужно создать две функции. Простая функция для отображения testsearch.html и другой, которая получает вызовы Ajax и отправляет обратно данные.

def ajax_load_project(request):
    if request.is_ajax():
        q = request.GET.get('term', '')
        print(q)
        projects = Project.objects.filter(title__istartswith=q)[:5]
        results = []
        for project in projects:
            project_json = {}
            project_json['id'] = project.id
            project_json['value'] = project.title
            project_json['label'] = project.title
            results.append(project_json)
        data = json.dumps(results)
    else:
        data = 'fail'
    mimetype = 'application/json'
    return HttpResponse(data, mimetype)

def searchProject(request):
    template = 'project/testsearch.html'
    return render(request, template)

Проект - моя модель. Вы можете заменить его своей моделью. Замените заголовок на поле, используемое для поиска.

Для моего примера вы можете создать эту простую модель:

class Project(models.Model):
    """
    A Model representing a the project.
    """
    title = models.CharField(max_length=200)

Шаг 4. Не забудьте указать два URL-адреса. Один для HTML, а другой для Ajax звонков

urlpatterns += [
    #test search
    path('SuggestProject/', views.ajax_load_project, name='ajax_load_project'),
    path('searchtest/', views.searchProject, name='searchProject'),]
0 голосов
/ 25 мая 2017

В django 1.10 я использую тот же код

url:

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

view:

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 голосов
/ 22 декабря 2016

Я обнаружил, что самый простой способ начать работу (хотя, вероятно, не самый оптимальный для производства) - это JQuery Autocomplete Widget .

Самый простой способ - просто скопировать и вставитькод в ваш HTML, используя массив как 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 голосов
/ 08 сентября 2016

Есть способ без использования Json:

пример: предположим, у вас есть модель с именем College:

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

Теперь визуализируйте контекст с именем 'all_colleges' = College.objects.all () для вашего шаблона:

HTML:

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

JS:

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

Ресурсы для включения в шаблон:

<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>

Вот и все!

Если вам требуется автозаполнение для отображения параметров, начинающихся с введенного термина, измените функцию фильтра автозаполнения фильтра по умолчанию, добавив этот фрагмент в свой шаблон:

 // 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);
    });
  };

Комментарий, если у вас возникли проблемы:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...