Давайте посмотрим как работает framework messages.
https://github.com/django/django/blob/master/djang...def messages(request):
return {
'messages': get_messages(request),
'DEFAULT_MESSAGE_LEVELS': DEFAULT_LEVELS,
}
...
def get_messages(request):
if hasattr(request, '_messages'):
return request._messages
else:
return []
Так messages попадают на страницу. Т.е. они берутся из request._messages. Как же они туда попадают?
https://github.com/django/django/blob/master/djang...class MessageMiddleware(MiddlewareMixin):
def process_request(self, request):
request._messages = default_storage(request)
...
def default_storage(request):
return import_string(settings.MESSAGE_STORAGE)(request)
...
MESSAGE_STORAGE = 'django.contrib.messages.storage.fallback.FallbackStorage'
Значит в request._messages у нас лежит FallbackStorage(request)
Перейдем к нашему коду
messages.error(request, 'Ваш диапазон дат занят для данного объекта.')
Что тут происходит? Посмотрим:
https://github.com/django/django/blob/master/djang...def error(request, message, extra_tags='', fail_silently=False):
add_message(request, constants.ERROR, message, extra_tags=extra_tags,
fail_silently=fail_silently)
...
def add_message(request, level, message, extra_tags='', fail_silently=False):
if not isinstance(request, HttpRequest):
raise TypeError("add_message() argument must be an HttpRequest object, "
"not '%s'." % request.__class__.__name__)
if hasattr(request, '_messages'):
return request._messages.add(level, message, extra_tags) # *** THIS ***
if not fail_silently:
raise MessageFailure('You cannot add messages without installing '
'django.contrib.messages.middleware.MessageMiddleware')
Ага, вызывается метод add знакомого нам объекта FallbackStorage.
Ему передается в качестве параметров:
- level = constants.ERROR = 40
- message = 'Ваш диапазон дат занят для данного объекта.'
- extra_tags = ''
Посмотрим на этот метод
https://github.com/django/django/blob/master/djang...def add(self, level, message, extra_tags=''):
if not message:
return
level = int(level)
if level < self.level:
return
# Add the message.
self.added_new = True
message = Message(level, message, extra_tags=extra_tags)
self._queued_messages.append(message)
...
def _get_level(self):
if not hasattr(self, '_level'):
self._level = getattr(settings, 'MESSAGE_LEVEL', constants.INFO)
return self._level
Из этого кода можно сделать вывод что сообщение попадает в очередь сообщений если его уровень более или равен тому который задан в settings.MESSAGE_LEVEL (по умолчанию = contants.INFO = 20)
Таким образом чтобы добавлялись только наши сообщения необходимо:
1) в settings.py установить
# settings.py
...
MY_SUPER_ERROR = 80
MESSAGE_LEVEL = MY_SUPER_ERROR
...
2) Во вью писать
if not available_cars:
carstoshow = None
messages.add_message(request, settings.MY_SUPER_ERROR, 'Ваш диапазон дат занят для данного объекта.')
return redirect('car_detail', pk=car_used_id)