Django: удаление сообщения до его отображения
Я знаю, что этот вопрос звучит странно, но, пожалуйста, позвольте мне объяснить сам.
Я использую декоратор, чтобы сообщение сохранялось до тех пор, пока пользователь фактически не отклонит его (например, поведение сообщений). Проблема заключается в том, что в результате этого сообщение добавляется до того, как пользователь выйдет из системы, и поэтому сообщение отображается сразу после выхода пользователя из системы. Мне интересно, что лучший способ удалить сообщение в виде выхода из системы. Я подумал о двух способах сделать это, и мне интересно, может ли кто-нибудь подумать о лучшем.
В настоящее время я предпочитаю это:
storage = messages.get_messages(request)
storage.used = True
По этому поводу:
storage = messages.get_messages(request)
del storage._loaded_messages[0]
Для меня второй способ кажется более явным, хотя он уродливее: я намерен удалить загруженные в настоящее время сообщения, и это делает это ясным. Первый способ использует средство, с помощью которого сообщения будут очищаться как побочный эффект... но по крайней мере он не полагается на переменную dunder... что вы, ребята, думаете?
Ответы
Ответ 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)