2012-08-02 7 views
5

Ich finde Djangos request.is_ajax eine sehr nützliche Möglichkeit, progressive Erweiterung über JS hinzuzufügen und immer noch DRY in meinen Ansichten zu halten.Mit Django-Klassen-basierten Ansichten, wie kann ich eine andere Vorlage zurückgeben, wenn request.is_ajax

Ich möchte jedoch klassenbasierte Ansichten verwenden und mit einer anderen Vorlage rendern, wenn request.is_ajax.

Es ist mir nicht klar, wie ich meine Standardvorlage "template_name" überschreiben und das Laden der Vorlage in klassenbasierten Ansichten konditional machen kann.

Wie kann ich das tun?

+0

Vielleicht sollten Sie eine "API" URL für Ihre klassenbasierte Ansicht, wo der Ajax-Aufruf mit einer klassenbasierten Ansicht nur für die Ajax-Aufrufe geht. – Jingo

+0

Sicher kann ich das, aber das ist was ich vermeiden will: es gibt mir keine progressive Verbesserung, und es gibt mir mehr Sicht und URL-Code. – pwalsh

Antwort

4

Der geeignete Weg, dies zu tun ist, um die Methoden, die von den TemplateResponseMixin bereitgestellt außer Kraft zu setzen.

Wenn Sie einfach eine andere Vorlage für Ajax-Anforderungen bereitstellen müssen, überschreiben Sie get_template_names. Wenn Sie eine andere Antwort insgesamt angeben möchten, sagen Sie eine application/json Antwort, dann überschreiben Sie render_to_response, um eine andere HttpResponse für Ajax-Anforderungen zu erstellen.

+0

Danke, das beantwortet meine Frage und geht weiter in die richtige Richtung, um nicht nur das Template, sondern auch das Response-Objekt zu überschreiben. – pwalsh

9

Aufschalten get_template_names:

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

gute Antwort, danke. – pwalsh

Verwandte Themen