Настройка формы администратора в Django с использованием автообнаружения

Я хочу изменить несколько мелких деталей встроенного в Django модуля django.contrib.auth. В частности, мне нужна другая форма, которая делает имя пользователя полем электронной почты (и отправляет по электронной почте альтернативный адрес электронной почты. (Я бы предпочел не изменять auth больше, чем необходимо - простое изменение формы кажется будет всем, что нужно).

Когда я использую autodiscover с настроенным ModelAdmin для auth, я сталкиваюсь с конфликтом с собственным административным интерфейсом auth и получаю ошибку «уже зарегистрировано».

Похоже, мне нужно создать свой собственный админ-сайт, перечислив все мои модели. Всего 18 классов, но это похоже на проблему СУХОЙ - каждое изменение требует как добавления в модель а также, так и добавления к настраиваемому сайту администратора.

Или я должен написать свою собственную версию «autodiscover с исключениями», чтобы по существу импортировать все модули adminКромеauth?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
26
0
13 940
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Ни один из вышеперечисленных. Просто используйте admin.site.unregister (). Вот как я недавно добавил фильтрацию пользователей на is_active в админке (n.b. is_active фильтрация теперь по модели User по умолчанию в ядре Django; все еще работает здесь в качестве примера), все DRY как может быть:

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User

class MyUserAdmin(UserAdmin):
    list_filter = UserAdmin.list_filter + ('is_active',)

admin.site.unregister(User)
admin.site.register(User, MyUserAdmin)

Sweet - полностью пропустил метод отмены регистрации в sites.AdminSite

S.Lott 23.01.2009 05:29

Интересно. Спасибо, что поделился, Карл.

ayaz 23.01.2009 09:17

Я отмечаю, что после добавления этого вызова unregister () в мой код мне пришлось вручную убить и перезапустить мой сервер разработки до того, как Django «увидел» внесенное мной изменение. Из-за этого я потратил 15 минут, пытаясь понять, почему unregister () не работает. Что, наконец, привело меня к вопросу о переполнении стека, где я обнаружил, что то, что я делал было, должно работать. :-)

Brandon Rhodes 24.08.2009 06:19

@Brandon Да, в целом автообнаружение admin.py в Django плохо работает с автоматической перезагрузкой сервера разработки. Это также вас укусит, если у вас есть синтаксическая ошибка в admin.py; после исправления ошибка исчезнет, ​​но это приложение будет полностью отсутствовать у администратора, пока вы вручную не перезапустите сервер разработки. Раздражает, но я еще не окунулся, чтобы найти ошибку.

Carl Meyer 25.08.2009 19:27

FWIW, ошибка была исправлена ​​для Django 1.2, и теперь admin.py и автозагрузка runserver должны быть лучше вместе.

Carl Meyer 07.12.2010 00:45

Вы можете попробовать github.com/kux/django-admin-extend как общий способ расширения уже зарегистрированных административных объектов.

Ioan Alexandru Cucu 15.07.2013 17:00

Можете ли вы объяснить, почему вам пришлось отменить регистрацию пользователя, а затем повторно зарегистрировать его вместе с MyUserAdmin?

thumbtackthief 02.05.2014 23:56

@thumbtackthief Потому что Django не позволит вам зарегистрировать одну и ту же модель дважды, а пользователь уже зарегистрирован contrib.auth с его классом UserAdmin. Поэтому вам необходимо отменить регистрацию, прежде чем вы сможете зарегистрировать его в своем собственном подклассе ModelAdmin.

Carl Meyer 04.05.2014 05:41

Хорошее решение, мне очень помогло! Для меня тоже пришла на картинку эта часть кода: stackoverflow.com/questions/5429276/… | from django_admin_listfilter_dropdown.filters import (DropdownFilter, ChoiceDropdownFilter, RelatedDropdownFilter) С этим я мог бы использовать: list_filter = (('groups', RelatedDropdownFilter), ...) - потому что исходная групповая фильтрация слишком длинная.

szabozoltan 05.06.2019 12:57

Я думаю, что было бы проще сделать это с помощью настраиваемого бэкэнда аутентификации и, таким образом, устранить необходимость в настраиваемом ModelAdmin.

Я сделал нечто подобное с этим фрагментом: http://www.djangosnippets.org/snippets/74/

На самом деле мне нужен и улучшенный бэкэнд, и интерфейс. Мне нужно, чтобы имена пользователей были адресами электронной почты, чтобы @domain гарантировал их уникальность. Я уже использую ваш фрагмент. Но полезно иметь его как часть этого набора ответов.

S.Lott 23.01.2009 14:34

Другие вопросы по теме