2012-11-12 11 views
7

Ci sono MOLTE post e pagine che parlano dell'uso di Django e AJAX, e ne ho letto centinaia nel corso dell'ultimo giorno o così alla ricerca della risposta a questa domanda. Una rapida panoramica:Uso del tag URL Django in una chiamata AJAX

maggio degli esempi mostrano un URL hard-coded come questo:

$.post("/projects/create/", {"name" : name}, function(data) {... 

o qualche utilizzare il tag modello di URL, ma senza parametri:

$.post("{% url create_project %}", {"name" : name}, function(data) {... 

Tuttavia, Mi piacerebbe includere un parametro in stile Django in un URL. Ecco la mia definizione url:

url(r'ajax/entity_name/(?P<pk>\w+)/$',EntityAjaxView.as_view(),name='entity_name'), 

Sì, sto usando una vista basata di classe, ed è basato su detailview. Questo punto di vista sembra per impostazione predefinita per un valore di pk da fornire nella URL, e in un modello normale userei:

{% url entity_name id_number %} 

per fornire un collegamento. Nel mio codice, voglio prendere il valore inserito in una casella di input per il valore pk. Ecco un frammento del mio JavaScript (che non funziona):

var id_number = $('#id_endowmententity_set-' + rownum + '-id_number').val() 
$.ajax({ 
    type: "GET", 
url: '{% url entity_name id_number %}', 

Quindi, la mia domanda è, posso usare il tag modello di URL con un valore da una casella di input?

(so che potrei usare POST invece di GET e passare l'id_number nei dati POST, ma che non funziona bene con il detailview.)

Grazie in anticipo per il vostro aiuto.

risposta

10

Django è un'applicazione lato server. Javascript è lato client. I template di Django vengono renderizzati sul server, quindi {% url entity_name id_number %} viene valutato sul lato server, quindi il valore viene restituito al client. Proprio per questo motivo, è impossibile combinare i modelli di Django con javascript. Tuttavia ci sono un paio di cose che puoi fare per risolvere il tuo problema.

Poiché si sta effettuando una chiamata ajax e la chiamata ajax dipende da alcuni input dell'utente, in genere il percorso migliore per il client per l'invio di qualsiasi tipo di input utente al server consiste nell'utilizzo di querystring (cosa dopo ? in URL) o inviando un dato POST. Quindi la cosa più semplice è cambiare il tuo url per non includere pk nella url, ma per la vista di ottenerlo come parte dei dati GET o POST.

url(r'ajax/entity_name/$', EntityAjaxView.as_view(), name='entity_name'), 

e la vista (scusate non ho familiarità con vista a base di classe):

def entity_name(request): 
    pk = request.GET.get('pk') 
    ... 

Questo mi sembra essere la soluzione più elegante. Se tuttavia è assolutamente necessario costruire l'URL sul lato client, è possibile generare un URL modello sul lato server e quindi sostituire le parti necessarie sul lato client per ottenere l'URL completo. Ciò tuttavia richiede più manutenzione e quindi è più soggetto a errori. Semplice esempio di questo approccio:

var id_number = $('#id_endowmententity_set-' + rownum + '-id_number').val(), 
    url = '{% url entity_name 0 %}'.replace('0', id_number); 
$.ajax({ 
    type: "GET", 
    url: url, 
    ... 
}); 
+0

Due buone opzioni. Grazie! – Dashdrum