Django: удалить сообщение перед их отображением
Я знаю, что этот вопрос звучит странно, но, пожалуйста, позволь мне объяснить.
Я использую декоратор, чтобы сообщение сохранялось, пока пользователь фактически не отклонит его (например, поведение сообщений переполнения стека). Проблема в том, что в результате этого сообщение добавляется до выхода пользователя, и поэтому сообщение отображается сразу после выхода пользователя. Мне интересно, как лучше всего удалить сообщение в представлении выхода из системы. Я придумал два способа. это, и мне интересно, может ли кто-нибудь придумать лучший.
в настоящее время я пользуюсь этим:
storage = messages.get_messages(request)
storage.used = True
за это:
storage = messages.get_messages(request)
del storage._loaded_messages[0]
для меня второй способ кажется более явным, хотя он уродливее: мое намерение-удалить загруженные сообщения, и это делает это ясным. Первый способ использует средство, с помощью которого сообщения будут удалены как побочный эффект ... но, по крайней мере, он не полагается на переменную дандера ... что вы, ребята думаешь?
6 ответов
Мне нравится этот более простой подход для очистки базового итератора, так как я действительно хотел добавить новое сообщение вместо стандартного сообщения Django.
list(messages.get_messages(request))
для разрешения я собираюсь отметить метод, с которым я пошел, как "ответ". Спасибо тем, кто прокомментировал.
Я пошел с этого:
storage = messages.get_messages(request)
storage.used = True
потому что это казалось чище, было легче протестировать и соответствовало общей практике остальной части проекта.
Если ваше представление выхода всегда перенаправляется на "страницу выхода", вы можете просто изменить шаблон выхода, чтобы скрыть свои сообщения.
например, в шаблон:
{% block extra-header %}
<style type="text/css">
#message-id { display: none; }
</style>
{% endblock %}
он чувствует себя немного "хаки", но я думаю, что это, безусловно, менее хаки, чем ваш #2.
для меня Django 1.5
и session
хранение сообщений принятый метод dit не трюк.
мне нужно использовать:
storage = messages.get_messages(request)
for _ in storage:
pass
чтобы избавиться от сообщения.
мне пришлось использовать 2 из предложенных выше решений вместе как никого одного не хватило:
storage = messages.get_messages(request)
for _ in storage:
pass
if len(storage._loaded_messages) == 1:
del storage._loaded_messages[0]
насколько принятое решение я могу несколько раз перебирать сообщения и я вижу, что сообщения, похоже, не"потребляются"
один из способов сделать то же самое в 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)