Per effettuare la ricerca con Ext, la lista che visualizza i dati dovrà essere un oggetto Grid di Ext.
Nel metodo layout del template_list.mako sostituire il submit button con un button generico:
<%def name="layout()">
user..= job..=
D=from.date.gte D=to.date.lte
--
s=Search <------ DA COSI
</%def>
<%def name="layout()">
user..= job..=
D=from.date.gte D=to.date.lte
--
b=Search <------ A COSI
</%def>
Il nome che si da al button diventerà anche l’id dello stesso (tutto in minuscolo, però). in questo caso il button avrà come id “search”
Importare nel template il file “ext_search.js” (questo file verrà importato automaticament attraverso il comando “jsetup.sh -s”) :
<script type="text/javascript" src="/static/js/ext_search.js"></script>
Aggiungere al file javascript che gestisce la griglia di ext le seguenti righe. ATTENZIONE : Le righe dovranno essere aggiunte dopo la creazione della griglia.:
// Aggiungo la ricerca via Ext
ext_search = new ExtSearch({'url':'/prodotto/ajax/prodotto/',
'grid':grid_prodotti,
'button_id':'cerca'});
I possibili parametri da passare alla classe ExtSearch sono:
Nome | Obbligatorio | Descrizione | Default |
---|---|---|---|
url | SI | indica l’url che verrà chiamato al click del bottone “Search” | |
grid | SI | istanza della grid che visualizzerà i dati della ricerca | |
button_id | SI | id del bottone “Search” | |
waitMsg | NO | messaggio che appararira’ durante la ricerca. | ‘Attendere, ricerca in corso...’ |
succes | NO | istanza della funzione che verra’ chiamata se la ricerca nn ha dato errori | search_reload_grid (ext_search.js) |
failure | NO | istanza della funzione che verra’ chiamata se la ricerca ha dato errori | search_failure_grid (ext_search.js) |
Nel file urls.py associare l’url scelto sul lato javascript ad una vista
(r'^ajax/model/?$', 'model.views.metodo_della_ricerca')
Modifica del metodo che torna i dati in json alla griglia di Ext in views.py. Le parti da aggiungere sono quelle tra “INIZIO CODICE DA AGGIUNGERE” e “FINE CODICE DA AGGIUNGERE”
def metodo_della_ricerca(request, model):
user = request.user
get = request.GET.copy()
queryset = Model.objects.all()
# importo il modulo di Jungle per la ricerca
#
from jungle.views.fast_search import search2
########################################################
#
# INIZIO CODICE DA AGGIUNGERE
#
#########################################################
# Il modulo mi ritorna un dizionario con pronti i filtri
# da dare in pasto al filter di django in base alle scelte
# fatte dall'utente nel form di ricerca.
# L'unico parametro che a noi interessa sara' "filter_cnd"
filter_cnd, oldorder_by, form = search2(request, model)
if filter_cnd:
queryset = queryset.filter(**filter_cnd)
########################################################
#
# FINE CODICE DA AGGIUNGERE
#
#########################################################
# Total serve per dire a Ext quanti sono i risultati trovati
#
total = queryset.count()
# Parametri per la paginazione (start, limit) e per
# l'ordinamento (dir e sort). Vengono passati da Ext ad ogni richiesta
#
start = get.get('start', 0)
limit = get.get('limit', 25)
dir = get.get('dir', 'ASC')
sort = get.get('sort', 'nome')
if dir == 'DESC':
sort = "-%s" % sort
# ordinamento e limit dei dati in base ai parametri ricevuti da Ext
#
queryset = queryset.order_by(sort)[int(start):int(start)+int(limit)]
dati = []
for x in queryset:
d = {}
d['id'] = x.id
d['campo1'] = x.campo1
d['campo2'] = x.campo2
d['campo_data'] = x.campo_data.strftime("%m/%d/%Y")
dati.append(d)
# Creazione del dizionario json nel formato richiesto dalla griglia Ext
#
data = '{"success": true, "total": %s, "data": %s}' % (total, simplejson.dumps(dati, ensure_ascii=False))
return HttpResponse(data, mimetype='text/javascript;')