DisallowedModelAdminToField

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

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

Синтаксис

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

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

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

Пример

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

pythonfrom 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
pythonfrom 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 в админке будет выброшено исключение:

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

Пример

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

pythonfrom 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:

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

Пример

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

pythonfrom 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)}'
      )

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

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

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

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