Исключение DisallowedModelAdminLookup

Исключение DisallowedModelAdminLookup относится к модулю django.contrib.admin и возникает, когда в административной панели предпринимается попытка выполнить фильтрацию или поиск с использованием поля модели, которое не было явно разрешено в настройках ModelAdmin. Это исключение является подклассом ValueError и служит для предотвращения несанкционированного доступа к данным через параметры GET запроса.

Синтаксис

pythonraise DisallowedModelAdminLookup(message)

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

Пример . Возникновение исключения

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

pythonfrom django.contrib import admin
from myapp.models import Article

@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
  list_display = ['title', 'status', 'created_at']
  list_filter = ['status']

При попытке перейти по URL с параметром ?created_at__gte=2025-01-01 возникнет исключение:

python"DisallowedModelAdminLookup: Field 'created_at' does not exist in list_filter or search_fields"

Пример . Корректное использование

Чтобы избежать исключения, необходимо добавить разрешенные поля в list_filter или search_fields:

pythonfrom django.contrib import admin
from myapp.models import Article

@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
  list_display = ['title', 'status', 'created_at']
  list_filter = ['status', 'created_at']
  search_fields = ['title', 'content']

Теперь запрос с параметром ?created_at__gte=2025-01-01 будет обработан без ошибки:

python"Request processed successfully"

Пример . Обработка исключения

При необходимости можно переопределить метод get_queryset в ModelAdmin для кастомной обработки запросов:

pythonfrom django.contrib import admin
from django.core.exceptions import ValidationError
from myapp.models import Article

@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
  list_display = ['title', 'status', 'created_at']
  list_filter = ['status']

  def get_queryset(self, request):
    qs = super().get_queryset(request)
    try:
      if 'created_at__gte' in request.GET:
        return qs.filter(created_at__gte=request.GET['created_at__gte'])
      return qs
    except (ValueError, ValidationError):
      return qs

В этом примере мы перехватываем ошибки валидации и возвращаем исходный QuerySet, предотвращая возникновение исключения.

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

  • исключение DisallowedModelAdminToField,
    возникающее при обращении к запрещенному полю в параметрах to_field
  • исключение ImproperlyConfigured,
    возникающее при неправильной конфигурации приложения Django
  • исключение FieldError,
    возникающее при ошибках в именах полей модели
  • исключение RestrictedError,
    возникающее при попытке удаления объекта с ограничениями