Шаблоны Django:создать “обратную” ссылку?
Вопрос
Я работаю с Джанго и мне интересно, есть ли простой способ создать "обратную" ссылку на предыдущую страницу, используя систему шаблонов.
Я полагаю, что в худшем случае я могу получить эту информацию из объекта запроса в функции просмотра и передать ее вместе с методом рендеринга шаблона, но я надеюсь, что смогу каким-то образом избежать всего этого шаблонного кода.
Я проверил документы шаблона Django и не увидел ничего, что упоминало бы это явно.
Решение
Ну, вы можете включить:
'django.core.context_processors.request',
в вашем settings.TEMPLATE_CONTEXT_PROCESSORS
блокируйте и подключайте реферера, но это немного тошнотворно и может сломаться повсеместно.
В большинстве мест, где вы хотели бы это сделать (например, на странице редактирования публикации в SO), у вас есть реальный объект для подключения (в данном примере, к сообщению), чтобы вы могли легко определить, какой должна быть соответствующая предыдущая страница.
Другие советы
На самом деле это go(-1)
.
<input type=button value="Previous Page" onClick="javascript:history.go(-1);">
Это решение сработало для меня:
<a href="{{request.META.HTTP_REFERER}}">Go back</a>
Но это предварительное добавление 'django.core.context_processors.request',
Для TEMPLATE_CONTEXT_PROCESSORS
в настройках вашего проекта.
<a href="{{request.META.HTTP_REFERER|escape}}">Back</a>
|escape
чтобы выбраться из "" веревки
Для кнопки "назад" в change forms для Django admin то, что я в конечном итоге делаю, - это пользовательский фильтр шаблона для анализа и декодирования переменной 'preserved_filters' в шаблоне.Я поместил следующее в настроенном файле templates/admin/submit_line.html :
<a href="../{% if original}../{% endif %}?{{ preserved_filters | decode_filter }}">
{% trans "Back" %}
</a>
А затем создал пользовательский шаблон фильтра:
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)
Вы всегда можете использовать опцию на стороне клиента, которая очень проста:
<a href="javascript:history.go(1)">Back</a>
Использование решения на стороне клиента было бы правильным решением.
<a href="javascript:history.go(-1)" class="btn btn-default">Cancel</a>