I find myself doing a search engine with ajax and django that throws me results as soon as I write a word in the search engine but I have not been successful. supposedly I already have everything.
in the console shows me this when I do a search.
[25/Apr/2016 20:25:22] "GET /clientes/list/ HTTP/1.1" 200 16400
[25/Apr/2016 20:25:22] "GET /static/js/ajax_buscar.js HTTP/1.1" 304 0
Create an app called ajax where I passed the Client model to access your objects. views.py
from django.shortcuts import render
from django.http import HttpResponseBadRequest, HttpResponse, HttpRequest
from django.core import serializers
import re
from clientes.models import Cliente
def search(request):
# si no es una peticion ajax, devolvemos error 400
if not request.is_ajax() or request.method != "POST":
return HttpResponseBadRequest()
# definimos el termino de busqueda
q = request.POST['q']
#verificamos si el termino de busqueda es un documento de identidad
match = re.match(r'^(?P<CI>[0-9]{2,})$', q)
isCI = (False, True)[match != None]
# generamos la query
if isCI:
clientes = Cliente.objects.filter(id=match.groupdict()['id'])
else:
clientes = Cliente.objects.filter(n_empresa__Icontains=q)
# seleccionamos las columnas que deseamos obtener para el json
cliente_fields = (
'id',
'n_empresa',
'email'
)
# json!
data = serializers.serialize('json', clientes, fields=cliente_fields)
return HttpResponse(data, content_type="application/json")
ajax_buscar.js
function __init()
{
$('#search_input')
.val('')
.focus()
.keyup(function(){
if(!$.trim($(this).val()))
$('.results .error').empty().hide();
});
var cache = {};
$('#search_input').autocomplete({
minLength: 5,
select: function( event, ui ) {
return false;
},
open: function() {
$('.results .wrapper').html($(this).autocomplete("widget").html());
$(this).autocomplete("widget").hide();
},
source: function( request, response ) {
if (cache[request.term]) {
response(cache[request.term]);
return;
}
$.ajax({
dataType : 'json',
method : 'POST',
url : '/ajax/search/',
data : {
q : encodeURIComponent(request.term),
csrfmiddlewaretoken : $('input[name=csrfmiddlewaretoken]').val()
},
success : function(data) {
var clientes = [];
for(var x in data)
{
clientes.push({
id : data[x].fields['id'],
n_empresa : data[x].fields['n_empresa'],
email : data[x].fields['email']
});
}
cache[request.term] = clientes;
response(clientes);
}
});
},
response: function(event, ui) {
if (ui.content.length === 0) {
$('.results .error').html('No se encontraron resultados').show();
$('.results .wrapper').empty();
}
else
$('.results .error').empty().hide();
}
}).autocomplete('instance')._renderItem = function(ul, item) {
var cliente_tmpl = $('<div />')
.addClass('Cliente')
.append('<a href="/" />').find('a').addClass('id').html(item.id)
.parent()
.append('<span class="identity"><strong>Identidad:</strong><span></span></span>')
.find('.identity > span').append(item.n_empresa)
.parent().parent()
.append('<span class="email"><strong>Email:</strong><span></span></span>')
.find('.email > span').append(item.email)
.parent().parent();
return $('<div></div>')
.data('item.autocomplete', item)
.append(cliente_tmpl)
.appendTo(ul);
};
}
$(document).ready(__init);
my html
<script type="text/javascript" src="https://code.jquery.com/jquery-2.1.3.min.js"></script>
<div class="search">
<div class="searchbox">
<label>Buscar un estudiante:</label>
<span class="info">(Puede ser un nombre o el id de identidad)</span>
<input id="search_input" type="text" name="q">{% csrf_token %}
</div>
<div class="results">
<h1 class="error"></h1>
<div class="wrapper"></div>
</div>
</div>
my urls.py
from ajax.views import search
url(r'^ajax/search/', view='ajax.views.search'),