Подтвердить что ты не робот

Как передать информацию о контексте шаблона при использовании HttpResponseRedirect в Django?

У меня есть форма, которая перенаправляется на ту же страницу после того, как пользователь вводит информацию (чтобы они могли продолжать вводить информацию). Если подача формы прошла успешно, я возвращаюсь

HttpResponseRedirect(request.path)

который отлично работает. Тем не менее, я также хотел бы отобразить некоторые сообщения пользователю в этом случае (например, "Ваши данные были сохранены" в верхней части экрана). Если бы я не перенаправлялся, я бы просто вернул эти сообщения в словарь контекста. Однако при переадресации я не могу этого сделать.

Итак, как я могу передавать информацию о контексте шаблона при использовании HttpResponseRedirect?

То, что я пытаюсь сделать, похоже, было бы невероятно распространено, поэтому, пожалуйста, извините меня, если я пропущу что-то очевидное.

4b9b3361

Ответ 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  %}