Lo scopo è far aprire un popup, in jquery-ui chiamata dialog o modale al click di un link, con un iframe con sorgente il link stesso. Si può attivare su qualsiasi link della change_list aggiungendo la classe iframe. Il sistema aggiunge automaticamente il parametro _popup=1 la dimenensione della finestra per default è 1000x500. questi parametri sono configurabili mettendoli come attributo del link
Nel creare il link possiamo usare le seguenti classi:
iframe: | forza il rendering in una modale, il sistema aggiunge _popup=1 |
---|---|
hjson: | forza l’output come json. Viene aggiunto _json=1&_popup=1 all’URL. |
refresh: | forza l’utilizzo del json per fare un refresh del dato anche quando si passi da un redirect di un oggetto diverso. Ad esempio nella changelist dei ticket, aggiungiamo un intervento e vogliamo che al salvataggio venga riletta la singola riga del ticket. Aggiunge all’url _refresh=1 In questo caso deve essere implementato a mano il redirect all’interno della response_add/response_change: if request.GET.get("_refresh"):
return HttpResponseRedirect(
reverse('admin:ticket_ticket_json', args=[obj.ticket.pk])+"?_refresh=1")
|
La modifica del link viene fatta da jQuery all’interno della funzione jmb.core.js da iframe_hjson_link con on("click") in modo da garantire che non sino applicati se decidiamo di aprire il link in una finestra separata.
Ogni ModelAdmin che erediti da AjaxParentModelAdmin ha automaticamente definita una vista con name <app_label>_<model_name>_json che crea una ChildrenChangeList composta di un solo oggetto e la renderizza come un normale elemento della change_list e poi la ritorna in un json così composto:
data_json = [{
"pk": 9134,
"model": "Ticket",
"fields": "<tr class=\"row1\">...</tr>\n\n"
} ]
data_json[0].method = ""
action = ''
message = ''
Vedi libreria jmb completa javascript
Nel caso si voglia utilizzare la funzione singolarmente si può utilizzare:
jmb.show_in_popup(src, title, width=1000, height=500, callback = function(){})
in admin.py:
def get_add_assistance(self, obj):
return """
<a class='iframe hjson refresh' href='%(reverse_url)s?_popup=1&ticket=%(ticket_id)s'
</a>""" % {
'reverse_url': reverse('admin:ticket_ticketassistance_add'),
'ticket_id': obj.id
}
get_add_assistance_.allow_tags = True
aggiungere nella change_list.html:
<script>
// classe predefinita a.iframe
jmb.auto_popup(classe, callback)
</script>