Django django.contrib.messages добавляет новые постоянные сообщения. ВНИМАНИЕ

Как я могу создать новую константу для сообщений 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 01.07.2024 00:09

@Vegard Выдает ошибку AttributeError: module 'django.contrib.messages.constants' has no attribute 'NOTICE', если я пытаюсь добавить его в settings.py

Majoris 01.07.2024 10:17
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы не можете добавлять новые уровни в коллекцию 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

Abdul Aziz Barkat 02.07.2024 06:18

@AbdulAzizBarkat Вы правы, спасибо за замечание. Исправлено сейчас.

Vegard 02.07.2024 08:54

Замечательный. Добавление нового класса констант и пометка их как msg сработало отлично.

Majoris 02.07.2024 09:38

Другие вопросы по теме