Как передать информацию о контексте шаблона при использовании HttpResponseRedirect в Django?
У меня есть форма, которая перенаправляется на ту же страницу после того, как пользователь вводит информацию (чтобы они могли продолжать вводить информацию). Если подача формы прошла успешно, я возвращаюсь
HttpResponseRedirect(request.path)
который отлично работает. Тем не менее, я также хотел бы отобразить некоторые сообщения пользователю в этом случае (например, "Ваши данные были сохранены" в верхней части экрана). Если бы я не перенаправлялся, я бы просто вернул эти сообщения в словарь контекста. Однако при переадресации я не могу этого сделать.
Итак, как я могу передавать информацию о контексте шаблона при использовании HttpResponseRedirect?
То, что я пытаюсь сделать, похоже, было бы невероятно распространено, поэтому, пожалуйста, извините меня, если я пропущу что-то очевидное.
Ответы
Ответ 1
Лучшим способом, вероятно, будет использование закодированного запроса на URL-адрес переадресации... его старый подход к школе.
Вы можете сделать что-то вроде
/page/? m = 1,/page/? m = 2 и т.д.
Затем вы проанализируете эту переменную с запросом .GET в коде просмотра и покажите соответствующее сообщение.
Ответ 2
Для завершения и использования в будущем вы можете теперь использовать структуру сообщений. После его установки:
views.py
from django.contrib import messages
def view(request):
# your code
messages.success(request, "Your data has been saved!")
HttpResponseRedirect(request.path)
template.html
{% if messages %}
<ul class="messages">
{% for message in messages %}
<li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
Ответ 3
если вы используете auth и имеете зарегистрированного пользователя, вы можете:
http://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.models.User.message_set.create
Параметры GET также могут быть взломаны. Повторите попытку, как указано в других ответах.
Я думаю, что самым лучшим способом было бы использовать рамки сеансов. Таким образом, вы можете загружать все, что хотите, в контекст и получать
{{ request.session.foo }}
может быть сообщение или вы могли
{% ifequal request.session.foo 1 %} Nice work! {% else %} Almost! {% endifequal %}
и другие забавные вещи.
http://docs.djangoproject.com/en/dev/topics/http/sessions/#using-sessions-in-views
Ответ 4
Вы не можете. HttpResponseRedirect отправляет клиенту переадресацию (код статуса HTTP 302) в браузер, а затем браузер повторно запрашивает другую страницу.
Вы можете установить строку запроса URL-адреса при перенаправлении, хотя это будет видно пользователю и любому, кто перехватывает HTTP-запросы (т.е. прокси), и поэтому не подходит для конфиденциальной информации.
Ответ 5
Единственный способ передать любые данные с помощью перенаправления - добавить параметры GET к URL-адресу, который вы передаете. Чтобы избежать хакеров XSS, вам нужно передать определенную константу, например:
[текущий путь, в котором вы проходите] сообщение = сохранено
И затем обработайте сообщение = сохраненный параметр в обработчике пути, в который вы прошли.
Несколько более сложным способом было бы не передавать данные в перенаправление и вместо этого использовать что-то вроде http://code.google.com/p/django-notify/ для хранения сеанса, основанные на данных, которые отображаются пользователю после перенаправления.
Ответ 6
Вы добавляете? saved = 1 в строку запроса и проверяете его с чем-то вроде:
saved = request.GET.get('saved', False)
Ответ 7
Из вашего view.py вам нужно поставить пару ключ/значение в сеанс, а затем прочитать его из шаблона HTML.
Например:
views.py
# your code here
request.session['vote'] = 1
return HttpResponseRedirect(request.path)
your_template.html
{% ifequal request.session.vote 1 %}
<!-- Your action here -->
{% endifequal %}