Sep/06
14
Django Ajax
O Django é realmente fantástico.
Com algumas linhas de código eu criei uma funcionalidade que pode ajudar em muito quem está fazendo seus primeiros testes com Django + Ajax.
este é o arquivo com o controlador:
from django.core import serializers
from django.http import HttpResponse, Http404
from django.core.exceptions import PermissionDenied
from django.db.models.query import QuerySet
from django.db import models
import operator
def generic_search(request, app_label, model_name, word):
model = models.get_model(app_label, model_name)
if model is None:
raise Http404, "App %r, model %r, not found" % (app_label, model_name)
if not request.user.has_perm(app_label + '.' + model._meta.get_change_permission()):
raise PermissionDenied
if not model.Ajax or not model.Ajax.search_fields:
raise Http404, "App %r, model %r, Ajax class not found" % (app_label, model_name)
if model.Ajax.search_limit: limit = model.Ajax.search_limit else: limit = 10 or_queries = [models.Q(**{'%s__istartswith' % field_name: word}) for field_name in model.Ajax.search_fields] data = serializers.serialize("xml", model.objects.filter(reduce(operator.or_, or_queries))[:limit]) return HttpResponse(data, mimetype="text/xml")Este é um arquivo de visão. Ele recebe os parametros: aplicação, modelo e palavra-chave e retorna uma coleção de objetos serialiada para XML (isso pode ser facilmente mudado para JSON)
este é o arquivo de urls:
urlpatterns = patterns('',
# observando que esta linha deve vir antes da linha de "admin" caso ela seja utilizada por ele
(r'^admin/([^/]+)/([^/]+)/search/([^/]*)/$', 'aCom.ajaxsearch.generic_search'),
(r'^admin/', include('django.contrib.admin.urls')), )
Verifique que esta url é apenas uma sugestão para quem está utilizando o contrib admin como base da aplicação. Caso não o utilize, você pode remover a palavra "admin" da url e substituir conforme sua necessidade.
este é o arquivo de uma classe de modelo:
class ClassificacaoCliente(models.Model):
descricao = models.CharField(maxlength=50)
class Admin:
pass
class Ajax:
search_fields = ['descricao']
search_limit = 10
note que a classe Ajax dentro da classe de modelo aponta o campo e o limite para a busca em Ajax.
Marinho Brandão