ri_gilfanov
@ri_gilfanov
Web- and desktop-developer

Возможно ли корректное переопредение свойства _meta.app_label у моделей contrib.auth в Django?

При использовании кастомной модели User, искал простой способ сгруппировать в админке Users и Groups в один раздел без установки дополнений для админки.

Нашёл следующий:
https://stackoverflow.com/a/33856716

Пробовал пару месяцев назад на 1.11, вроде всё работало.

Сейчас решил повторить в 2.0. В приложение users с кастомной моделью пользователя импортировал модели Group и Permission из django.contrib.auth и ниже модели User переопределил им мета-свойство app_label:
Group._meta.app_label = 'users'
Permission._meta.app_label = 'users'


Миграции проходят, таблицы создаются корректно:
5a3e4ead7c3fb413231178.png

Панель администратора открывается и модели Users и Groups оказались сгруппированы в нужном разделе:
5a3e4ee146623310722163.png

Но, при входе хоть в пользователи, хоть в группы Django не может найти таблицу auth_groups:
5a3e4f9487b7a617808802.png

Перепробовал:
  1. переопределение app_label у Group и Permission до объявления модели кастомного пользователя -- вызывает ошибку fields.E307;

    5a3e57510e463255211323.png
  2. импорт Group в admin.py не из django.contrib.auth.models, а из users.models -- ни на что не влияет, хотя app_label у Group выводится как 'users';

    5a3e56bd2e64b560244032.png
  3. отключать 'django.contrib.auth' -- RuntimeError;

    5a3e5a3349e36546687228.png
  4. менять порядок приложений в INSTALLED_APPS -- роли не играет.


Собственно, хотелось бы определиться:
  • Рабочий ли это способ и может я просто что-то упускаю?
  • Кто как решает задачу группировки моделей в админке?
  • Вопрос задан
  • 211 просмотров
Решения вопроса 1
ri_gilfanov
@ri_gilfanov Автор вопроса
Web- and desktop-developer
Понял, при каких обстоятельствах это работает.

Если провести все миграции и только потом переопределить app_label для Group и Permission -- всё работает как надо. Имена таблиц остаются с префиксом auth_, но в админке модели группируются в одном разделе.

Если закомментировать это переопределение -- можно создавать и делать миграции.

В иных случаях, будет либо изложенное в вопросе, либо поломанная миграция:
AttributeError: 'ManyToManyField' object has no attribute 'm2m_reverse_field_name'


В общем, сомнительное решение. Надёжнее переопределить вьюхи/шаблоны админки или поставить соответствующую батарейку (например, django-admin-tools, django-suit или django-grappelli).
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы