2015-09-16 4 views
3

Пробовали тонны вещей там, но ни один из них не помог.Сообщения Django, которые не отображаются после HttpResponseRedirect

У меня есть URL, например:

http://localhost:8000/user/edit-transaction/?object_id=23a959d0561711e59e36acd1b8679265&type=grossary

который называет ниже view:

def edit_transaction(request): 

    if request.method == "POST": 
     if something is True: 
      messages.error(request, 'Error message here') 

      # this don't work 
      return HttpResponseRedirect(request.META.get('HTTP_REFERER')) 

      # but this work 
      template = "user/xyz/abc.html" 
      render(request, template) 
     else: 
      return HttpResponseNotFound() 
    else: 
     context = { 
      'key1': 'value1', 
      'key2': 'value2', 
     } 
     template = "user/xyz/abc.html" 
     render(request, template, context) 

И внутри шаблона:

{% if messages %} 

<h1>I am inside MESSAGES</h1> 

    {% for message in messages %} 
     {% if message.tags == 'success' %} 
      <div class="alert alert-success" role="alert">{{ message|escape|safe }}</div> 
     {% elif message.tags == 'error' %} 
      <div class="alert alert-danger" role="alert">{{ message|escape|safe }}</div> 
     {% endif %} 
    {% endfor %} 
{% endif %} 

Это становится внутри if здесь if something is True: и перенаправляется на ту же страницу с помощью строки запроса. Но не отображать сообщение об ошибке.

Я хочу перенаправить на ту же страницу, сохранив строку запроса и отобразив сообщение об ошибке. Что я делаю неправильно здесь и какие изменения рекомендуются (если есть).

Также есть сомнения, что сообщения Django действительно работают после перенаправления, такие как Flash-сообщения?


Edit:

1) Это не работает:

if something is True: 
    messages.error(request, 'Error message here') 
    return HttpResponseRedirect(request.META.get('HTTP_REFERER')) 

С консоли:

[16/Сентябрь/2015 10 : 57: 08] "POST /пользователь/редактирование-транзакции /? Object_id = 23a959d0561711e59e36acd1b8679265 & тип = grossary HTTP/1.1" 302 0 [16/Сен/2015 10:57:08] "GET /пользователь/редактировать-транзакции /? Object_id = 23a959d0561711e59e36acd1b8679265 & тип = grossary HTTP/1.1" 200 8832

2) Это работает:

if something is True: 
    messages.error(request, 'Error message here') 
    template = "user/xyz/abc.html" 
    render(request, template) 

Из консоли:

[16/Сентябрь/2015 10:57:08] "POST /пользователь/редактирование-транзакции /? Object_id = 23a959d0561711e59e36acd1b8679265 & тип = grossary HTTP/1.1" 302 0

Так, в основном, что Я понял сверху, что messages истекает с дополнительным запросом (перенаправление, 200).

И в шаблонах, не попадая внутрь {% if messages %}, а также для печати <h1>I am inside MESSAGES</h1>

+0

Вы добавили обработчик контекста 'django.contrib.m.macages.context_processors.messages' в' TEMPLATE_CONTEXT_PROCESSORS' в файле 'settings.py'? – ozgur

+0

Да, я покончил с этим. –

+0

Можете ли вы напечатать 'message.tags', поскольку это может быть нечто иное, чем простая строка? – ozgur

ответ

7

Наконец понял.Добавлено ниже в local_settings.py и его .

MESSAGE_STORAGE = 'django.contrib.messages.storage.session.SessionStorage' 


Что происходит?

Сообщения фактически сохранялись в Cookies (CookieStorage), который по умолчанию является поведением Django. От Django docs:

FallbackStorage - класс хранения по умолчанию. Если он не подходит для ваших потребностей, вы можете выбрать другой класс хранения, установив MESSAGE_STORAGE его полный путь импорта, например:

MESSAGE_STORAGE = «django.contrib.messages.storage.cookie.CookieStorage»

А что такое FallbackStorage?

Этот класс первый использует CookieStorage, и возвращается к использованию SessionStorage для сообщений, которые не могут поместиться в одном печенье. Он также требует приложения Django contrib.sessions.

Такое поведение позволяет избежать возможности записи на сессию, когда это возможно. Это должно обеспечить наилучшую производительность в общем случае.

А что было в моем случае?

Messages становился хранится в CookiesStorage, но по какой-то странной причине (я не знаю, что), но Messages в CookiesStorage становились истек или удалены для 2-го запроса (т.е. перенаправление после POST), не должен происходить (потому что это не так, как работает flashdata). И после того, как я переключил по умолчанию MESSAGE_STORAGE на SessionStorage, он начал работать.

+1

О, человек! Ты спасатель жизни. Это была моя проблема. Большое спасибо. +1 от меня. –

Смежные вопросы