2012-08-02 14 views
5

Me parece que la solicitud de Django.is_ajax es una forma muy útil de agregar mejoras progresivas a través de JS y aún mantener DRY en mis vistas.Utilizando vistas basadas en clases de Django, ¿cómo puedo devolver una plantilla diferente si request.is_ajax

Sin embargo, quiero usar vistas basadas en clases y renderizar con una plantilla diferente si request.is_ajax.

No tengo claro cómo puedo anular mi "template_name" predeterminado y hacer que la plantilla se cargue condicional en vistas basadas en clases.

¿Cómo puedo hacer esto?

+0

Quizás deba agregar una url "api" para su vista basada en clases a la que va la llamada ajax con una vista basada en clase solo para las llamadas ajax. – Jingo

+0

Claro que puedo hacer eso, pero eso es lo que quiero evitar: no me da una mejora progresiva, y me da más vista y código de URL. – pwalsh

Respuesta

4

La manera apropiada de hacer esto es para anular los métodos proporcionados por la TemplateResponseMixin.

Si simplemente necesita proporcionar una plantilla diferente para las solicitudes de Ajax, entonces anule get_template_names. Si desea proporcionar una respuesta diferente por completo, responda application/json, luego anule render_to_response para producir un HttpResponse diferente para solicitudes Ajax.

+0

gracias, esto responde mi pregunta, y va más allá al señalarme en la dirección correcta para anular no solo la plantilla sino el objeto de respuesta. – pwalsh

9

Override get_template_names:

def get_template_names(self): 
    if self.request.is_ajax(): 
     return ['ajax_template.html'] 
    else: 
     return ['standard_template.html'] 
+0

buena respuesta, gracias. – pwalsh

Cuestiones relacionadas