Как передавать информацию с помощью перенаправления HTTP (в Django)
У меня есть представление, которое принимает форму отправки и обновляет модель.
После обновления модели я хочу перенаправить на другую страницу, и я хочу, чтобы на этой странице появилось сообщение, такое как "Поле X успешно обновлено".
Как я могу передать это сообщение на другую страницу? HttpResponseRedirect принимает только URL. Я видел это раньше на других сайтах. Как это достигается?
Ответы
Ответ 1
Это встроенная функция Django, называемая "сообщениями"
См. http://docs.djangoproject.com/en/dev/topics/auth/#messages
Из документации:
Сообщение связано с пользователем. Там нет понятия истечения срока или метки времени.
Сообщения используются администратором Django после успешных действий. Например, "Опрос Foo был создан успешно." - это сообщение.
Ответ 2
Вы можете использовать приложение django-flashcookie
http://bitbucket.org/offline/django-flashcookie/wiki/Home
он может отправлять несколько сообщений и иметь неограниченные типы сообщений. Допустим, вам нужен один тип сообщения для предупреждения и один для сообщений об ошибках, вы можете написать
def simple_action(request):
...
request.flash['notice'] = 'Hello World'
return HttpResponseRedirect("/")
или
def simple_action(request):
...
request.flash['error'] = 'something wrong'
return HttpResponseRedirect("/")
или
def simple_action(request):
...
request.flash['notice'] = 'Hello World'
request.flash['error'] = 'something wrong'
return HttpResponseRedirect("/")
или даже
def simple_action(request):
...
request.flash['notice'] = 'Hello World'
request.flash['notice'] = 'Hello World 2'
request.flash['error'] = 'something wrong'
request.flash['error'] = 'something wrong 2'
return HttpResponseRedirect("/")
а затем в вашем шаблоне покажите его с помощью
{% for message in flash.notice %}
{{ message }}
{% endfor }}
или
{% for message in flash.notice %}
{{ message }}
{% endfor }}
{% for message in flash.error %}
{{ message }}
{% endfor }}
Ответ 3
Мне понравилась идея использования структуры сообщений, но пример в документации django не работает для меня в контексте вопроса выше.
Что меня действительно раздражает, это строка в django docs:
If you're using the context processor, your template should be rendered with a RequestContext. Otherwise, ensure messages is available to the template context.
который непонятен новичкам (как и я) и должен расширяться, предпочтительно, с тем, как выглядят эти 2 варианта.
Мне удалось найти решения, требующие рендеринга с помощью RequestContext... который не отвечает на вопрос выше.
Я считаю, что я создал решение для второго варианта ниже:
Надеюсь, это поможет кому-то другому.
== urls.py ==
from django.conf.urls.defaults import *
from views import *
urlpatterns = patterns('',
(r'^$', main_page, { 'template_name': 'main_page.html', }, 'main_page'),
(r'^test/$', test ),
== viewtest.py ==
from django.contrib import messages
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse
def test(request):
messages.success( request, 'Test successful' )
return HttpResponseRedirect( reverse('main_page') )
== viewmain.py ==
from django.contrib.messages import get_messages
from django.shortcuts import render_to_response
def main_page(request, template_name ):
# create dictionary of items to be passed to the template
c = { messages': get_messages( request ) }
# render page
return render_to_response( template_name, c, )
== main_page.html ==
{% block content %}
{% if messages %}
<div>
{% for message in messages %}
<h2 class="{{message.tag}}">{{ message.message }}</h2>
{% endfor %}
</div>
{% endif %}
{% endblock %}
Ответ 4
Я прочитал и проверил все ответы, и мне кажется, что теперь можно использовать структуру обмена сообщениями. Некоторые ответы довольно старые и, вероятно, были правильными в момент публикации.
Ответ 5
Существует много решений
1 Используйте версию Django-trunk - она поддерживает отправку сообщений анонимным пользователям
2 сеанса
def view1(request):
request.session['message'] = 'Hello view2!'
return HttpResponseRedirect('/view2/')
def view2(request):
return HttpResponse(request.session['message'])
3 перенаправление с параметром
return HttpResponseRedirect('/view2/?message=Hello+view2')
4 Cookies
Ответ 6
Можете ли вы просто передать сообщение в качестве параметра запроса по URL-адресу, к которому вы перенаправляете? Это не ужасно RESTy, но он должен работать:
return HttpResponseRedirect('/polls/%s/results/?message=Updated" % p.id)
и проверьте этот параметр для параметра сообщения, вычистите его для гадостей и отобразите его вверху.
Ответ 7
Я думаю, что этот код должен работать для вас
request.user.message_set.create(message="This is some message")
return http.HttpResponseRedirect('/url')
Ответ 8
Пока все предложения пока работают, я предлагаю перейти с Ry4an (передать его в URL-адрес запроса) - просто измените фактический текст на кодированный текст в пределах предопределенного набора текстовых сообщений.
Два преимущества здесь:
- Меньше шансов на что-то взломать вашу чистку плохого контента.
- При необходимости вы можете локализовать свои сообщения позже.
Другие методы, связанные с cookie.. ну, они не работают, если браузер не поддерживает файлы cookie и немного дороже. Но только немного. Они действительно чище для глаз.
Ответ 9
Взгляните на структуру сообщений Django. http://docs.djangoproject.com/en/dev/ref/contrib/messages/#ref-contrib-messages
Ответ 10
У вас также может быть URL-адрес перенаправления - путь к уже параметризованному представлению.
urls.py:
(r'^some/path/(?P<field_name>\w+)/$', direct_to_template,
{'template': 'field_updated_message.html',
},
'url-name'
),
views.py:
HttpResponseRedirect( reverse('url-name', args=(myfieldname,)) )
Обратите внимание, что args = требуется взять кортеж.
Ответ 11
Решение, используемое Pydev UA, менее навязчиво и может использоваться без изменения почти ничего в вашем коде. Когда вы передаете сообщение, вы можете обновить свой контекст в представлении, которое обрабатывает сообщение, и в вашем шаблоне вы можете его показать.
Я использовал тот же подход, но вместо этого пропустил простой текст, передал dict с информацией в полезных полях для меня. Затем в представлении также обновлен контекст, а затем возвращен обработанный шаблон с обновленным контекстом.
Простой, эффективный и очень ненавязчивый.