La mejor forma de integrar Django con una biblioteca Ajax

Obviamente, caballos para cursos, pero ¿cuáles son algunas buenas maneras de integrar bibliotecas javascript con la aplicación Django de uno?

Estoy planeando usar jQuery, principalmente porque parece popular y parece poderoso (pero estoy abierto a otras sugerencias).

¿Hay bibliotecas del lado de los pitones que son muy útiles o esenciales? ¿O es mejor simplemente crear vistas JSON y codificar a mano el javascript (utilizando un marco de javascript adecuado)?

He mirado (brevemente) a Dajax, pero en base a la escasa documentación, no está claro que realmente me dé mucha importancia. Ciertamente preferiría algo con un poco más de documentación.

Otras respuestas aquí sugieren que pjax no necesariamente funciona bien con muchos navegadores, por lo que está fuera.

Edit: Gracias a todos. Estaré buscando en tastypie para simplificar la exposición de algunas vistas de json, y puedo escribir un poco de javascript a mano (lo que habiendo hecho un poquito a principios de este año, parece mucho mejor de lo que era a finales de los 90).

En el lado de python, sugeriría mirar piston y tastypie .

(Al comenzar con AJAX + Django, también encontré Dajax, pero fui con el piston sentí más ‘unix-way’ para mí, no me gustan estas soluciones integrales. Aunque el pistón no se ha actualizado durante mucho tiempo. ahora, así que recomiendo tastypie , que se mantiene activamente.)

EDITAR. También hay un proyecto similar, django-rest-framework . Nunca lo usé yo mismo, es bastante nuevo.

Básicamente, estas libretas te ayudan a crear una API de lectura y escritura completamente funcional para tus modelos, de modo que puedes realizar operaciones de crear, leer, actualizar y eliminar desde tu javascript a través de HTTP. No es necesario definir ninguna vista o serializador. En su lugar, se definen los recursos , que es una abstracción decente, creo.

Y generalmente solo requiere unas pocas líneas de código, especialmente si sus recursos están vinculados a modelos.

Sin embargo, si necesita algo más complicado, puede reconsiderar su diseño y escribir sus vistas. Con vistas basadas en clases, también es bastante fácil. Echa un vistazo a este fragmento de código, por ejemplo.

Recuerde, el hecho de que sea ajax no significa que deba devolver un volcado json. De hecho, puede devolver una plantilla renderizada.

Es cierto, que la “forma correcta” es construir todas sus tags en javascript y completar esos datos con los datos de json, pero seamos sinceros, eso es un dolor en la grupa … tanto que están Desarrollando un lenguaje de plantilla jQuery.

Tampoco puedes simplemente volcar un conjunto de consultas. Necesitas construir tus datos json a mano. Todos estos tutoriales y sugerencias parecen pasar por alto ese hecho. De los documentos de django:

 def convert_context_to_json(self, context): "Convert the context dictionary into a JSON object" # Note: This is *EXTREMELY* naive; in reality, you'll need # to do much more complex handling to ensure that arbitrary # objects -- such as Django model instances or querysets # -- can be serialized as JSON. return json.dumps(context) 

Lo que he hecho es escribir un mixin para las nuevas vistas basadas en clases que representan una selección de plantillas dependiendo de si se trata de una carga de páginas ajax o no. Luego puse el fragmento de lo que querría que se devolviera en un fragmento, y en otra plantilla de envoltorio, extienda base.html e incluya la plantilla de fragmento.

 class AjaxTemplateMixin(TemplateResponseMixin): ajax_template_name = None def get_template_names(self): if self.ajax_template_name and self.request.is_ajax(): self.template_name = self.ajax_template_name return super(AjaxTemplateMixin, self).get_template_names() 

Esto me permite escribir la plantilla solo una vez, y luego sin tener que construir manualmente elementos dom en javascript. Es muy poco trabajo extra, y especialmente si no estás escribiendo una API, es el camino a seguir.

Le sugiero que simplemente cree sus propias vistas de javascript y AJAX. Ruby on Rails siempre tuvo el problema opuesto: obligar a las personas a hacer AJAX de cierta manera, y siempre fue un punto de conflicto para las personas. Recientemente, finalmente se dieron cuenta de su locura y desacoplaron AJAX del marco para que pueda usar fácilmente la biblioteca que desee.

Esta es una característica de Django. Puede parecer más difícil, pero confía en mí, termina siendo infinitamente mejor tener el control de extremo a extremo.

Siempre he creado mis propios puntos de vista que sirven para JSON, y escribí el JavaScript yo mismo (normalmente usando jQuery). Obviamente, todo esto depende de lo que estés tratando de hacer: si tienes una necesidad específica que una aplicación existente resuelve, entonces, por todos los medios, úsala.

Servir a JSON es bastante trivial (simplemente descargue un poco de JSON y devuélvalo como un HttpResponse), así:

 def get_user_ids(request): if not request.is_ajax(): raise Http404 return HttpResponse(simplejson.dumps({'ids': [u.pk for User.objects.all()]})) 

El código anterior pretende ser demostrativo, no estoy sugiriendo que haga una vista que muestre todas sus ID de usuario.

Dajax es bastante sencillo. Será mejor que nos cuentes más sobre lo que te desconcierta en Dajax.