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,
которое возникает при обращении к реестру приложений до его инициализации