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)