2009-02-08 11 views
15

Jestem oprzyrządowania z Django i zastanawiam się, czy istnieje prosty sposób, aby utworzyć link "wstecz" do poprzedniej strony za pomocą systemu szablonów.Szablony Django: utworzyć link "z powrotem"?

Uważam, że w najgorszym przypadku mogę uzyskać te informacje z obiektu żądania w funkcji widoku i przekazać go do metody renderowania szablonu, ale mam nadzieję, że uda mi się jakoś ominąć cały ten kod.

Sprawdziłem dokumentację szablonu Django i nie widziałem niczego, co by wyraźnie o tym wspomniało.

+0

Po powrocie strona jest ponownie renderowana, co oznacza, że ​​każde przetwarzanie (zapytania do bazy danych, pobieranie zasobów itp.) Odbywa się od nowa. Aby temu zapobiec, użyj dekoratora "@ cache_page". –

Odpowiedz

12

Cóż można włączyć:

'django.core.context_processors.request', 

w bloku settings.TEMPLATE_CONTEXT_PROCESSORS i zaczepić się z odsyłającą ale to jest nieco mdły i może pęknąć w każdym miejscu.

W większości miejsc, w których chciałbyś to zrobić (np. Na stronie edycji posta na SO), masz prawdziwy obiekt, do którego możesz się podłączyć (w tym przykładzie post), abyś mógł łatwo ustalić, jaka powinna być właściwa poprzednia strona być.

+0

To jest dobra informacja i natknąłem się na "Model.get_absolute_url" w dokumentach po przeczytaniu tego. To faktycznie rozwiązuje problem w moim przypadku, ale nadal jestem ciekawy, jak najlepiej postępować, jeśli nie masz na to żadnego obiektu. –

+0

Rzeczywiście zależy od okoliczności. Jeśli jest jakiś sposób sprawdzenia, która strona "powinna" być poprzednią stroną, pójdę tą drogą. Ale czasami nie jest to możliwe, a sprawdzanie stron odsyłających może być jedyną opcją (inną niż pozwolenie użytkownikom na użycie przycisku wstecz) . – Oli

+0

Kiedyś przeszedłem ścieżką próbowania tego poprzez zmienne sesyjne, ale to był błąd; kruche i łamane przez cały czas. Twoje wybory są tymi, o których wspomniał Oli, lub używają JavaScript, aby kliknąć przycisk Wstecz. –

0

Zawsze można użyć opcji po stronie klienta, który jest bardzo prosty:

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

Naprawdę nienawidzę takich linków. Po pierwsze, nie działają, gdy dojdziesz do strony z zapisanego linku/innej strony. Po drugie, włączam Javascript tylko dla zaufanych witryn (używając rozszerzenia NoScript firefox). Istnieją inne powody, ale przestrzeń komentarzy jest ograniczona. –

+3

Brzydka, ale ważna odpowiedź. – muhuk

+0

To nie jest najlepsze kodowanie, na jakie się zgadzam. Ale wysoka przewaga jest bardzo prosta i działa. Byłoby to również przydatne, gdybyś pochodził z innej strony, ponieważ korzystał z funkcji przeglądania BACK bez względu na to skąd pochodzisz. – nivhab

25

Właściwie to go(-1).

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

Odpowiedzi na inne odpowiedzi należą do komentarzy nie w nowej odpowiedzi. –

+1

@TM: jest to poprawna odpowiedź, więc jest w porządku. – aehlke

+2

brzydki, ale działa –

15

To rozwiązanie wypracowane dla mnie:

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

Ale to uprzednio dodając 'django.core.context_processors.request', do TEMPLATE_CONTEXT_PROCESSORS w ustawieniach projektu.

+0

Znalezienie przydatny i czysty teraz w maju 2016 !!! –

+0

to działa, ale po django 1.10 jest: "django.template.context_processors.request", –

0

Dla przycisku "wstecz" w formularzach zmian dla administratora Django, co w końcu robię, jest niestandardowy filtr szablonów do analizowania i dekodowania zmiennej "zachowany_filtry" w szablonie. Umieściłem na następujący plik niestandardowe szablony/admin/submit_line.html:

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

A potem stworzył filtr niestandardowy szablon:

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

Korzystanie stronie klienta rozwiązanie byłoby właściwe rozwiązanie.

<a href="javascript:history.go(-1)" class="btn btn-default">Cancel</a> 
Powiązane problemy