Джанго: Удалить сообщение, прежде чем они отображаются - PullRequest
21 голосов
/ 03 ноября 2010

Я знаю, этот вопрос звучит странно, но, пожалуйста, позвольте мне объяснить.

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

Я сейчас одобряю это:

storage = messages.get_messages(request)
storage.used = True

За это:

storage = messages.get_messages(request)
del storage._loaded_messages[0]

Для меня второй способ кажется более явным, хотя и более уродливым: я собираюсь удалить загруженные в данный момент сообщения, и это проясняет ситуацию. Первый способ использует средство, с помощью которого сообщения будут очищаться как побочный эффект ... но, по крайней мере, он не зависит от переменной dunder ... что вы думаете, ребята?

Ответы [ 6 ]

7 голосов
/ 06 марта 2015

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

list(messages.get_messages(request))
6 голосов
/ 06 марта 2011

Ради разрешения я собираюсь отметить метод, который я использовал, как «Ответ». Спасибо тем, кто прокомментировал.

Я пошел с этим:

storage = messages.get_messages(request)
storage.used = True

Поскольку он казался чище, его было легче тестировать и он соответствовал общей практике остальной части проекта.

3 голосов
/ 29 мая 2015

Мне пришлось использовать 2 из предложенных выше решений вместе , так как никого не хватало:

storage = messages.get_messages(request)
for _ in storage: 
    pass

if len(storage._loaded_messages) == 1: 
    del storage._loaded_messages[0]

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

2 голосов
/ 08 октября 2013

Для меня в Django 1.5 и session хранилище сообщений принятый метод - не хитрость.

Мне нужно было использовать:

storage = messages.get_messages(request)
for _ in storage:
    pass

Чтобы избавиться от сообщений из хранилища.

2 голосов
/ 28 февраля 2011

Если ваш вид выхода из системы всегда перенаправляет на «страницу выхода из системы», вы можете просто изменить шаблон выхода из системы, чтобы скрыть свои сообщения.

например, в шаблоне:

{% block extra-header %}
<style type="text/css">
    #message-id { display: none; }
</style>
{% endblock %}

Чувствуется немного "хакерским", но я думаю, что он, конечно, менее хакерский, чем твой # 2.

0 голосов
/ 08 ноября 2017

Один из способов сделать то же самое в Django Admin (протестирован с Django==1.11.6) - переопределить response_post_*.

def response_post_save_change(self, request, obj):
    storage = messages.get_messages(request)
    storage._loaded_messages = []

    return super().response_post_save_change(request, obj)

И если вы хотите сохранить только свойпользовательские сообщения (например, добавленные в save_model или любым другим переопределенным методом) удаляют последнее сообщение в очереди (по умолчанию это объявление Django).

def response_post_save_change(self, request, obj):
    storage = messages.get_messages(request)

    if len(storage._queued_messages) > 1:
        del storage._queued_messages[-1]

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