Как я могу создать новую константу для сообщений 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
}
Ошибка, если я попытаюсь добавить вышеизложенное.
G:\runtime\devui\devui\settings.py changed, reloading.
Traceback (most recent call last):
File "G:\runtime\devui\manage.py", line 22, in <module>
main()
File "G:\runtime\devui\manage.py", line 18, in main
execute_from_command_line(sys.argv)
File "C:\Users\devuser\AppData\Local\Programs\Python\Python311\Lib\site-packages\django\core\management\__init__.py", line 442, in execute_from_command_line
utility.execute()
File "C:\Users\devuser\AppData\Local\Programs\Python\Python311\Lib\site-packages\django\core\management\__init__.py", line 382, in execute
settings.INSTALLED_APPS
File "C:\Users\devuser\AppData\Local\Programs\Python\Python311\Lib\site-packages\django\conf\__init__.py", line 89, in __getattr__
self._setup(name)
File "C:\Users\devuser\AppData\Local\Programs\Python\Python311\Lib\site-packages\django\conf\__init__.py", line 76, in _setup
self._wrapped = Settings(settings_module)
^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\devuser\AppData\Local\Programs\Python\Python311\Lib\site-packages\django\conf\__init__.py", line 190, in __init__
mod = importlib.import_module(self.SETTINGS_MODULE)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\devuser\AppData\Local\Programs\Python\Python311\Lib\importlib\__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "<frozen importlib._bootstrap>", line 1204, in _gcd_import
File "<frozen importlib._bootstrap>", line 1176, in _find_and_load
File "<frozen importlib._bootstrap>", line 1147, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 690, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 940, in exec_module
File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
File "G:\runtime\devui\devui\settings.py", line 44, in <module>
messages.NOTICE: 'alert-primary',
^^^^^^^^^^^^^^^
AttributeError: module 'django.contrib.messages.constants' has no attribute 'NOTICE'
PS G:\runtime\devui>
@Vegard Выдает ошибку AttributeError: module 'django.contrib.messages.constants' has no attribute 'NOTICE', если я пытаюсь добавить его в settings.py






Вы не можете добавлять новые уровни в коллекцию 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 или *Choice-класс Django) на основе исходных констант:
# 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. Вы также можете (и, вероятно, должны) использовать коллекцию для этого:
# 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',
}
У вас опечатка NOTICE: 60, вместо этого должно быть NOTICE = 60. Также from ./constants должно быть from .constants
@AbdulAzizBarkat Вы правы, спасибо за замечание. Исправлено сейчас.
Замечательный. Добавление нового класса констант и пометка их как msg сработало отлично.
Вы уже делаете то, что предлагают документы – это не работает? Если нет, то в чем заключается ошибка или симптом?