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

Django: удаление сообщения до его отображения

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

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

В настоящее время я предпочитаю это:

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

По этому поводу:

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

list(messages.get_messages(request))

Ответ 3

Для меня в Django 1.5 и session используется метод хранения сообщений, а не трюк.

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

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

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

Ответ 4

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

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

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

Он чувствует себя немного "взломанным", но я думаю, что он, безусловно, менее хакерский, чем ваш # 2.

Ответ 5

Мне пришлось использовать 2 предложенных выше решения, поскольку ни один из них не был достаточно:

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

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

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

Ответ 6

Один из способов сделать то же самое в 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)