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

Как передавать информацию с помощью перенаправления HTTP (в Django)

У меня есть представление, которое принимает форму отправки и обновляет модель.

После обновления модели я хочу перенаправить на другую страницу, и я хочу, чтобы на этой странице появилось сообщение, такое как "Поле X успешно обновлено".

Как я могу передать это сообщение на другую страницу? HttpResponseRedirect принимает только URL. Я видел это раньше на других сайтах. Как это достигается?

4b9b3361

Ответ 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 и немного дороже. Но только немного. Они действительно чище для глаз.

Ответ 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 с информацией в полезных полях для меня. Затем в представлении также обновлен контекст, а затем возвращен обработанный шаблон с обновленным контекстом.

Простой, эффективный и очень ненавязчивый.