Я хочу изменить несколько мелких деталей встроенного в Django модуля django.contrib.auth. В частности, мне нужна другая форма, которая делает имя пользователя полем электронной почты (и отправляет по электронной почте альтернативный адрес электронной почты. (Я бы предпочел не изменять auth больше, чем необходимо - простое изменение формы кажется будет всем, что нужно).
Когда я использую autodiscover с настроенным ModelAdmin для auth, я сталкиваюсь с конфликтом с собственным административным интерфейсом auth и получаю ошибку «уже зарегистрировано».
Похоже, мне нужно создать свой собственный админ-сайт, перечислив все мои модели. Всего 18 классов, но это похоже на проблему СУХОЙ - каждое изменение требует как добавления в модель а также, так и добавления к настраиваемому сайту администратора.
Или я должен написать свою собственную версию «autodiscover с исключениями», чтобы по существу импортировать все модули adminКромеauth?






Ни один из вышеперечисленных. Просто используйте 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)
Интересно. Спасибо, что поделился, Карл.
Я отмечаю, что после добавления этого вызова unregister () в мой код мне пришлось вручную убить и перезапустить мой сервер разработки до того, как Django «увидел» внесенное мной изменение. Из-за этого я потратил 15 минут, пытаясь понять, почему unregister () не работает. Что, наконец, привело меня к вопросу о переполнении стека, где я обнаружил, что то, что я делал было, должно работать. :-)
@Brandon Да, в целом автообнаружение admin.py в Django плохо работает с автоматической перезагрузкой сервера разработки. Это также вас укусит, если у вас есть синтаксическая ошибка в admin.py; после исправления ошибка исчезнет, но это приложение будет полностью отсутствовать у администратора, пока вы вручную не перезапустите сервер разработки. Раздражает, но я еще не окунулся, чтобы найти ошибку.
FWIW, ошибка была исправлена для Django 1.2, и теперь admin.py и автозагрузка runserver должны быть лучше вместе.
Вы можете попробовать github.com/kux/django-admin-extend как общий способ расширения уже зарегистрированных административных объектов.
Можете ли вы объяснить, почему вам пришлось отменить регистрацию пользователя, а затем повторно зарегистрировать его вместе с MyUserAdmin?
@thumbtackthief Потому что Django не позволит вам зарегистрировать одну и ту же модель дважды, а пользователь уже зарегистрирован contrib.auth с его классом UserAdmin. Поэтому вам необходимо отменить регистрацию, прежде чем вы сможете зарегистрировать его в своем собственном подклассе ModelAdmin.
Хорошее решение, мне очень помогло! Для меня тоже пришла на картинку эта часть кода: stackoverflow.com/questions/5429276/… | from django_admin_listfilter_dropdown.filters import (DropdownFilter, ChoiceDropdownFilter, RelatedDropdownFilter) С этим я мог бы использовать: list_filter = (('groups', RelatedDropdownFilter), ...) - потому что исходная групповая фильтрация слишком длинная.
Я думаю, что было бы проще сделать это с помощью настраиваемого бэкэнда аутентификации и, таким образом, устранить необходимость в настраиваемом ModelAdmin.
Я сделал нечто подобное с этим фрагментом: http://www.djangosnippets.org/snippets/74/
На самом деле мне нужен и улучшенный бэкэнд, и интерфейс. Мне нужно, чтобы имена пользователей были адресами электронной почты, чтобы @domain гарантировал их уникальность. Я уже использую ваш фрагмент. Но полезно иметь его как часть этого набора ответов.
Sweet - полностью пропустил метод отмены регистрации в
sites.AdminSite