РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
525 of 818 menu

DisallowedModelAdminToField

Исключение DisallowedModelAdminToField возникает в административном интерфейсе Django, когда разработчик пытается использовать поле модели, которое не разрешено для отображения или фильтрации. Это исключение является подклассом SuspiciousOperation и служит для предотвращения несанкционированного доступа к полям модели через административный интерфейс.

Обычно данное исключение выбрасывается при работе с параметрами GET-запросов, которые определяют сортировку или фильтрацию данных в админке. Django проверяет, что указанные поля действительно разрешены для использования в админке, чтобы защитить приложение от потенциальных атак и некорректных запросов.

Синтаксис

from django.contrib.admin.exceptions import DisallowedModelAdminToField raise DisallowedModelAdminToField(message)

Исключение принимает один необязательный параметр:

message - строка с описанием ошибки, которая будет отображена пользователю. Если сообщение не указано, Django использует стандартное сообщение.

Пример

Рассмотрим модель Post и настройку административного интерфейса, которая вызывает исключение:

from django.db import models class Post(models.Model): title = models.CharField(max_length=200) content = models.TextField() created_at = models.DateTimeField(auto_now_add=True) is_published = models.BooleanField(default=False) views = models.IntegerField(default=0) def __str__(self): return self.title
from django.contrib import admin from .models import Post from django.contrib.admin.exceptions import DisallowedModelAdminToField @admin.register(Post) class PostAdmin(admin.ModelAdmin): list_display = ['title', 'created_at', 'is_published'] list_filter = ['is_published'] def get_queryset(self, request): qs = super().get_queryset(request) # Пытаемся отсортировать по полю, которого нет в list_display order_by = request.GET.get('order_by') if order_by == 'views': raise DisallowedModelAdminToField( 'Поле views не разрешено для сортировки' ) return qs

При попытке передать параметр ?order_by=views в админке будет выброшено исключение:

"Поле views не разрешено для сортировки"

Пример

Исключение также возникает при попытке использовать поле, которого нет в list_display или list_filter для сортировки или фильтрации:

from django.contrib import admin from .models import Post @admin.register(Post) class PostAdmin(admin.ModelAdmin): list_display = ['title', 'created_at'] list_filter = ['is_published'] search_fields = ['title', 'content'] def get_list_display(self, request): # Попытка добавить поле для сортировки, которого нет в list_display order_by = request.GET.get('o') if order_by == 'views': # Django выбросит DisallowedModelAdminToField pass return super().get_list_display(request)

Результат при попытке сортировки по полю views:

"DisallowedModelAdminToField: Поле views не разрешено для сортировки в админке"

Пример

Правильный способ обработки исключения с использованием try-except:

from django.contrib import admin from .models import Post from django.contrib.admin.exceptions import DisallowedModelAdminToField from django.http import HttpResponseBadRequest @admin.register(Post) class PostAdmin(admin.ModelAdmin): list_display = ['title', 'created_at', 'views'] list_filter = ['is_published'] def changelist_view(self, request, extra_context=None): try: return super().changelist_view(request, extra_context) except DisallowedModelAdminToField as e: return HttpResponseBadRequest( f'Недопустимый параметр сортировки: {str(e)}' )

При возникновении исключения пользователь увидит сообщение:

"Недопустимый параметр сортировки: Поле test не разрешено для сортировки в админке"

Смотрите также

  • исключение DisallowedModelAdminLookup,
    которое возникает при использовании неразрешенного поискового запроса в админке
  • исключение SuspiciousOperation,
    которое является базовым классом для подозрительных операций
  • исключение DisallowedHost,
    которое возникает при запросе с неразрешенного хоста
  • исключение AppRegistryNotReady,
    которое возникает при обращении к реестру приложений до его инициализации
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить