Исключение DisallowedModelAdminLookup
Исключение DisallowedModelAdminLookup относится
к модулю django.contrib.admin и возникает,
когда в административной панели предпринимается
попытка выполнить фильтрацию или поиск с использованием
поля модели, которое не было явно разрешено в
настройках ModelAdmin. Это исключение является
подклассом ValueError и служит для
предотвращения несанкционированного доступа к данным
через параметры GET запроса.
Синтаксис
raise DisallowedModelAdminLookup(message)
Исключение принимает один параметр - строку с описанием ошибки, которая указывает на запрещенное поле или оператор фильтрации.
Пример . Возникновение исключения
Рассмотрим ситуацию, когда в административной панели
выполняется запрос с параметром фильтрации по полю,
которое не указано в list_filter:
from 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 возникнет исключение:
"DisallowedModelAdminLookup: Field 'created_at' does not exist in list_filter or search_fields"
Пример . Корректное использование
Чтобы избежать исключения, необходимо добавить
разрешенные поля в list_filter или
search_fields:
from 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 будет обработан
без ошибки:
"Request processed successfully"
Пример . Обработка исключения
При необходимости можно переопределить метод
get_queryset в ModelAdmin для кастомной
обработки запросов:
from 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,
возникающее при попытке удаления объекта с ограничениями