request.session.flash () и .pop_flash () - PullRequest
1 голос
/ 04 января 2012

Всякий раз, когда я размещаю форму, я отображаю сообщения об ошибках. Однако, как я добавляю вспышки в очередь, некоторые сообщения остаются после того, как я отправил POST в форму, а некоторые нет. Я заметил, что это связано с тем, как я добавляю сообщения в очередь.

Обычный способ, который отлично работает:

post_data = request.POST
if 'submit' in post_data:
    ... function(post_data) ...
    if ...:
        request.session.flash(u'This is some error message')
    request.session.flash(u'Maybe some other error message')

А в файле мако:

<html>...<body>...
% for m in request.session.pop_flash():
  <div class="alert-message">
    <p>${m}</p>
  </div>
% endfor
...</body></html>

Однако я хочу, чтобы некоторые сообщения работали:

if 'submit' in post_data: 
    messages = function(...) # output is always a list
    for m in messages:
        request.session.flash(m)

Когда я делаю это, каждый раз, когда я повторяю сообщение в ту же форму, ВСЕ предыдущие сообщения снова добавляются в .flash (). Таким образом, сообщения об ошибках просто продолжают накапливаться. Как мне это исправить или обойти это?

Ответы [ 2 ]

2 голосов
/ 09 января 2012

Я выяснил проблему, но я не уверен, почему это произошло. Ранее я использовал message в качестве ключевого слова:

@classmethod
def validate(cls, message=[], **kwargs):
    if this:
        message.append(u'...')
    return kwargs, message

Я считаю, что после каждого POST message не очищался, хотя я никогда не звонил validate() с ним. Однако, когда я удалил messsage в качестве ключевого слова, оно работало нормально:

@classmethod
def validate(cls, **kwargs):
    message = []
    ...

Кто-нибудь знает, почему это так?

0 голосов
/ 04 января 2012

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

  • Вы можете очистить очередь перед обновлением, добавив еще что-то.
  • Вы могли бы передать флаг вместе с POST?
  • Вы можете избежать использования вспышки и бросить что-то еще для этого варианта использования.

Причины, по которым я могу подумать, почему очередь флэш-памяти не очищается, когда вы щелкаете:

  • Вы возвращаете свой собственный объект ответа, для которого фабрика сеансов не может установить новый обновленный файл cookie сеанса.
  • Ваш код генерирует исключение, которое может привести к тому, что фабрика сеанса игнорирует изменения cookie.
...