Как передать информацию с помощью перенаправления HTTP (в Django) - PullRequest
20 голосов
/ 01 марта 2009

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

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

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

Ответы [ 11 ]

12 голосов
/ 01 марта 2009

Это встроенная функция Django, называемая «сообщения»

См. http://docs.djangoproject.com/en/dev/topics/auth/#messages

Из документации:

Сообщение связано с пользователем. Там нет понятия истечения или метки времени.

Сообщения используются администратором Django после успешных действий. Например, «Опрос Foo был создан успешно. "это сообщение.

8 голосов
/ 02 марта 2009

Вы можете использовать приложение 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 }}
5 голосов
/ 10 января 2011

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

Я думаю, что я создал решение для 2-го варианта ниже:

Надеюсь, это поможет кому-то еще.

== 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 голосов
/ 02 января 2012

Я прочитал и проверил все ответы, и мне кажется, что сейчас нужно использовать среду обмена сообщениями . Некоторые ответы довольно старые и, вероятно, были правильными на момент публикации.

3 голосов
/ 16 декабря 2009

Есть много решений

1 Используйте версию магистрали Django - она ​​поддерживает отправку сообщений анонимным пользователям

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 печенья

1 голос
/ 23 марта 2011

Я думаю, что этот код должен работать для вас

request.user.message_set.create(message="This is some message")
return http.HttpResponseRedirect('/url')
1 голос
/ 01 марта 2009

Можете ли вы просто передать сообщение в качестве параметра запроса на URL, на который вы перенаправляете? Это не ужасно RESTy, но оно должно работать:

return HttpResponseRedirect('/polls/%s/results/?message=Updated" % p.id)

и пусть этот просмотр проверит наличие параметра сообщения, очистит его от неприятностей и отобразит в верхней части.

0 голосов
/ 27 февраля 2011

Решение, используемое Pydev UA, является менее навязчивым и может быть использовано без каких-либо изменений в вашем коде. Когда вы передаете сообщение, вы можете обновить свой контекст в представлении, которое обрабатывает сообщение, и в своем шаблоне вы можете показать его.

Я использовал тот же подход, но вместо того, чтобы передать простой текст, передал диктат с информацией в полезных для меня полях. Затем в представлении также обновляется контекст, а затем возвращается обработанный шаблон с обновленным контекстом.

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

0 голосов
/ 21 февраля 2010

У вас также может быть 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 = должен принимать кортеж.

0 голосов
/ 16 декабря 2009

Взгляните на структуру сообщений Django. http://docs.djangoproject.com/en/dev/ref/contrib/messages/#ref-contrib-messages

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...