Django django.contrib.messages добавляет новую константу messages.NOTICE

Как создать новую константу для сообщений Django?

Я хочу добавить новую константу messages.NOTICE в дополнение к существующим шести константам. С ее помощью я могу отображать уведомления с помощью Bootstrap CSS.

# settings.py
from django.contrib.messages import constants as messages

MESSAGE_TAGS = {
        messages.DEBUG: 'alert-secondary',
        messages.INFO: 'alert-info',
        messages.SUCCESS: 'alert-success',
        messages.WARNING: 'alert-warning',
        messages.ERROR: 'alert-danger',
        #messages.NOTICE: 'alert-primary', #To add
}

Вы не можете добавлять новые уровни в коллекцию messages. На самом деле вам не нужно добавлять его куда-либо, если все, что вам нужно, это чтобы уровень существовал, вы просто должны передать его в метод add_message - но чтобы CSS-часть сообщений работала, вы должны добавить его в MESSAGES_TAGS в settings.py.

Уровни сообщений - это просто целые числа. Это означает, что вы можете складывать целые числа напрямую, или вы можете сделать константу для этого, если хотите, я покажу оба варианта ниже.

# settings.py
from django.contrib.messages import constants as messages

NOTICE: 60 # Or some other integer

MESSAGE_TAGS = {
        messages.DEBUG: 'alert-secondary',
        messages.INFO: 'alert-info',
        messages.SUCCESS: 'alert-success',
        messages.WARNING: 'alert-warning',
        messages.ERROR: 'alert-danger',
        NOTICE: 'alert-primary',
        80: 'alert-tertiary',
}
# elsewhere.py
from django.contrib import messages
messages.add_message(request, 60, "Hello world.") # Would trigger the `NOTICE` CSS class from `MESSAGE_TAGS`

Если вы хотите унифицировать удобство передачи констант в вызовы сообщений, создайте пользовательскую коллекцию (enum или Django *Choice-класс) на основе исходных констант:

# constants.py
from django.contrib.messages import constants as message_constants
from django.db import models

class MessageLevels(models.IntegerChoices):
    DEBUG    = message_constants.DEBUG,
    INFO     = message_constants.INFO,
    [...] # repeat for the standard levels

    NOTICE   = 60
    CRITICAL = 90
# elsewhere.py
from ./constants import MessageLevels as msg

messages.add_message(request, msg.NOTICE, "Hello world.")
messages.add_message(request, msg.DEBUG, "Hello debugger.")

Как было отмечено изначально - не забудьте также добавить пользовательские целые числа из коллекции уровней сообщений в MESSAGE_TAGS, иначе не будет никакого CSS passthrough. Вы можете (и, вероятно, должны) использовать коллекцию и для этого:

# settings.py
from ./constants import MessageLevels as msg

MESSAGE_TAGS = {
        messages.DEBUG: 'alert-secondary',
        messages.INFO: 'alert-info',
        messages.SUCCESS: 'alert-success',
        messages.WARNING: 'alert-warning',
        messages.ERROR: 'alert-danger',
        msg.NOTICE, 'alert-primary',
        msg.CRITICAL, 'alert-tertiary',
}
Вернуться на верх