Estamos hablando de AJAX. AJAX siempre requiere 3 piezas (técnicamente, solo dos: Javascript hace doble servicio).
- cliente (Javascript en este caso) hace petición
- Server (vista de Django en este caso) se encarga de la solicitud y devuelve respuesta
- cliente (de nuevo, Javascript) recibe la respuesta y hace algo con él
No ha especificado un marco de trabajo preferido, pero sería una locura para hacer AJAX sin un marco de Javascript de algún tipo, por lo que voy a elegir jQuery para usted. El código muy fácilmente se puede adaptar a cualquier marco de Javascript:
$.getJSON('/url/to/ajax/view/', {foo: 'bar'}, function(data, jqXHR){
// do something with response
});
estoy usando $.getJSON
, que es un método de conveniencia jQuery que envía una solicitud GET a una URL y automáticamente analiza la respuesta JSON, convirtiéndola en un objeto JavaScript pasado como data
aquí. El primer parámetro es la URL a la que se enviará la solicitud (más sobre eso en un bit), el segundo parámetro es un objeto Javascript que contiene datos que deben enviarse junto con la solicitud (puede omitirse si no necesita enviar cualquier dato), y el tercer parámetro es una función de devolución de llamada para manejar la respuesta del servidor en caso de éxito. Entonces, este simple código cubre las partes 1 y 3 mencionadas anteriormente.
La siguiente parte es su controlador, que por supuesto en este caso será una vista de Django.El único requisito para la vista es que debe devolver una respuesta JSON:
from django.utils import simplejson
def my_ajax_view(request):
# do something
return HttpResponse(simplejson.dumps(some_data), mimetype='application/json')
Tenga en cuenta que este punto de vista no tiene ningún argumento que no sea el request
requerido. Esta es una elección filosófica. En mi humilde opinión, en una verdadera forma de REST, los datos deben pasarse con la solicitud, no en la URL, pero otros pueden y no están de acuerdo. La mejor elección depende de usted.
Además, tenga en cuenta que aquí he usado la biblioteca de Django's simplejson que es óptima para las estructuras de datos comunes de Python (listas, dicts, etc.). Si desea devolver una instancia de modelo de Django o un conjunto de consulta, debe usar la biblioteca de serializadores en su lugar.
from django.core import serializers
...
data = serializers.serialize('json', some_instance_or_queryset)
return HttpResponse(data, mimetype='application/json')
Ahora que tiene un punto de vista, todo lo que tiene que hacer es alambre para arriba en urlpatterns de Django Django así sabrá cómo encaminar la solicitud.
urlpatterns += patterns('',
(r'^/url/to/ajax/view/$', 'myapp.views.my_ajax_view'),
)
Aquí es donde esa diferencia filosófica viene en Si decide pasar los datos a través de la URL en sí, tendrá que capturarlo en el URLPATTERN:.
(r'^/url/to/ajax/view/(?P<some_data>[\w-]+)/$, 'myapp.views.my_ajax_view'),
A continuación, modificar su punto de vista a aceptarlo como un argumento:
def my_ajax_view(request, some_data):
Y, por último, modificar el método de Javascript AJAX para incluirlo en la URL:
$.getJSON('/url/to/ajax/view/'+some_data+'/', function(data, jqXHR){
Si vas a la ruta de transmitir los datos de la solicitud, entonces usted necesita para cuidar es posible recuperar correctamente en la vista:
def my_ajax_view(request):
some_data = request.GET.get('some_data')
if some_data is None:
return HttpResponseBadRequest()
que debe darle suficiente para asumir casi cualquier Funcionalidad AJAX con Django. Todo lo demás se trata de cómo su vista recupera los datos (los crea manualmente, consulta la base de datos, etc.) y cómo su método de devolución de llamada de Javascript maneja la respuesta JSON. Algunos consejos sobre que:
El objeto data
se general ser una lista, incluso si sólo se incluye un artículo. Si sabes que solo hay un artículo, puedes usar data[0]
. De lo contrario, utilice un bucle for para acceder a cada elemento:
form (var i=0; i<data.length; i++) {
// do something with data[i]
}
Si data
o data[i]
es un objeto (También conocido como diccionario, hachís, tecleados matriz, etc.), se puede acceder a los valores de las claves mediante el tratamiento las teclas como atributos, es decir:
data[i].some_key
Cuando se trata de respuestas JSON y AJAX en general, por lo general es mejor probarlo directamente en un navegador primero para que pueda ver la respuesta exacta y/o verificar la estructura de la respuesta. Para ver las respuestas JSON en su navegador, lo más probable es que necesite una excepción. JSONView (disponible tanto para Firefox como para Chrome) le permitirá comprender JSON y mostrarlo como una página web. Si la solicitud es un GET, puede pasar datos a la URL en la moda GET normal utilizando una cadena de consulta, es decir, http://mydomain.com/url/to/ajax/view/?some_data=foo
. Si se trata de un POST, necesitará algún tipo de cliente de prueba REST. RESTClient es un buen complemento para Firefox. Para Chrome puedes probar Postman.También son excelentes para aprender API de terceros de Twitter, Facebook, etc.
Esto es solo código de vista/url Django estándar. Las solicitudes de Ajax no son diferentes de las solicitudes normales en este contexto. –
A pesar de (y precisamente por eso) ser una pregunta básica sobre AJAX y Django, esta pregunta me ha resultado muy útil. Este tipo de preguntas sobre "cómo comenzar" son difíciles de encontrar (incluso en los tutoriales básicos de lectura y escritura) en StackOverflow y pueden ahorrar un montón de esfuerzo para los novatos. Gracias xhassassin! – viridis