2009-02-08 14 views
15

Ich bin herum mit Django Tooling und ich frage mich, ob es eine einfache Möglichkeit gibt, einen "zurück" Link zur vorherigen Seite mit dem Vorlagensystem zu erstellen.Django-Vorlagen: Erstellen Sie einen "Zurück" -Link?

Ich denke, im schlimmsten Fall kann ich diese Informationen aus dem Anfrageobjekt in der View-Funktion erhalten und sie an die Vorlage-Rendering-Methode weitergeben, aber ich hoffe, ich kann all diesen Boilerplate-Code irgendwie vermeiden.

Ich habe die Django-Vorlage Dokumente überprüft und ich habe nichts gesehen, das explizit erwähnt.

+0

Wenn Sie zurückgehen, wird die Seite neu gerendert, dies bedeutet, dass jede Verarbeitung (Datenbankabfragen, Ressourcen-Download usw.) wieder von vorn passiert. Um dies zu verhindern, verwenden Sie den '@ cache_page' Dekorator. –

Antwort

12

Nun können Sie aktivieren:

'django.core.context_processors.request', 

in Ihrem settings.TEMPLATE_CONTEXT_PROCESSORS Block und die Referrer-Haken, aber das ist ein bisschen widerlich und könnte überall brechen.

Die meisten Orte, an denen Sie dies wünschen (zB die Post-Seite auf SO bearbeiten), haben Sie ein echtes Objekt (in diesem Beispiel den Beitrag), so dass Sie leicht herausfinden können, was die richtige vorherige Seite sollte Sein.

+0

Dies ist eine gute Information, und ich stolperte nach dem Lesen auf "Model.get_absolute_url" in den Dokumenten. Das löst das Problem in meinem Fall tatsächlich, aber ich bin immer noch neugierig auf die beste Vorgehensweise, wenn Sie kein Objekt haben, auf das Sie zeigen könnten. –

+0

Kommt wirklich auf den Umstand an. Wenn es eine Möglichkeit gibt herauszufinden, welche Seite "sollte" die vorherige Seite sein sollte, würde ich diesen Weg gehen. Aber manchmal ist das nicht möglich und Referrer-Checking ist möglicherweise die einzige Option (abgesehen davon, dass Benutzer ihre Zurück-Schaltfläche verwenden) . – Oli

+0

Ich ging einmal den Pfad zu versuchen, dies über Session-Variablen zu tun, aber das war ein Fehler; spröde und brach die ganze Zeit. Sie haben die Wahl, die Oli erwähnt hat, oder verwenden Sie JavaScript, um auf die Schaltfläche Zurück für sie zu klicken. –

0

Sie können immer die Client-Seite Option benutzen, die sehr einfach ist:

<a href="javascript:history.go(1)">Back</a> 
+3

Ich hasse solche Links wirklich. Erstens funktionieren sie nicht, wenn Sie von einem gespeicherten Link/einer anderen Site auf eine Seite kommen. Zweitens aktiviere ich Javascript nur für vertrauenswürdige Sites (mit NoScript Firefox Erweiterung). Es gibt andere Gründe, aber Kommentarraum ist begrenzt. –

+3

Hässliche, aber gültige Antwort. – muhuk

+0

Es ist nicht die beste Kodierung, der ich je zustimme. Aber der große Vorteil ist sehr einfach und es funktioniert. Es würde auch funktionieren, wenn Sie von einer anderen Seite kommen, wenn Sie die BACK-Funktion des Browsers verwenden, unabhängig davon, woher Sie kommen. – nivhab

25

Eigentlich go(-1) es ist.

<input type=button value="Previous Page" onClick="javascript:history.go(-1);"> 
+3

Antworten auf andere Antworten gehören in den Kommentaren nicht zu einer neuen Antwort. –

+1

@TM: Das ist eine richtige Antwort, also ist es in Ordnung. – aehlke

+2

hässlich, aber funktioniert –

15

Diese Lösung funktionierte für mich aus:

<a href="{{request.META.HTTP_REFERER}}">Go back</a> 

Aber das zuvor ist das Hinzufügen 'django.core.context_processors.request', zu TEMPLATE_CONTEXT_PROCESSORS in den Einstellungen Ihres Projekts.

+0

Finden Sie es jetzt nützlich und sauber im Mai 2016 !!! –

+0

das funktioniert, aber nach django 1.10 ist: 'django.template.context_processors.request', –

0

Für eine 'Zurück' Schaltfläche in Änderungsformularen für Django Admin, was ich am Ende tun, ist ein benutzerdefinierter Vorlagenfilter zum Parsen und Decodieren der 'conserved_filters' Variable in der Vorlage. Ich legte die folgenden auf einem benutzerdefinierten Vorlagen/admin/submit_line.html Datei:

<a href="../{% if original}../{% endif %}?{{ preserved_filters | decode_filter }}"> 
    {% trans "Back" %} 
</a> 

Und dann ein eigenes Template Filter erstellt:

from urllib.parse import unquote 
from django import template 

def decode_filter(variable): 
    if variable.startswith('_changelist_filters='): 
     return unquote(variable[20:]) 
    return variable 

register = template.Library() 
register.filter('decode_filter', decode_filter) 
0

Client-Lösung wäre die richtige Lösung sein.

<a href="javascript:history.go(-1)" class="btn btn-default">Cancel</a> 
Verwandte Themen