Помимо обычного администратора, я хочу создать ограниченного администратора для пользователей, не являющихся сотрудниками.Этот админ-сайт будет иметь различные зарегистрированные ModelAdmin
s.
Я создал папку / useradmin / в каталоге моего проекта и аналогичен contrib / admin / _ init_ .py Я добавил автообнаружение (), которое будет регистрировать модели, определенные в модулях useradmin.pyвместо admin.py:
# useradmin/__init__.py
def autodiscover():
# Same as admin.autodiscover() but registers useradmin.py modules
...
for app in settings.INSTALLED_APPS:
mod = import_module(app)
try:
before_import_registry = copy.copy(site._registry)
import_module('%s.useradmin' % app)
except:
site._registry = before_import_registry
if module_has_submodule(mod, 'useradmin'):
raise
я также создал site.py под useradmin / для переопределения AdminSite, аналогичного contrib / admin / sites:
# useradmin/sites.py
class UserAdminSite(AdminSite):
def has_permission(self, request):
# Don't care if the user is staff
return request.user.is_active
def login(self, request):
# Do the login stuff but don't care if the user is staff
if request.user.is_authenticated():
...
else:
...
site = UserAdminSite(name='useradmin')
В URL проекта:
# urls.py
from django.contrib import admin
import useradmin
admin.autodiscover()
useradmin.autodiscover()
urlpatterns = patterns('',
(r'^admin/', include(admin.site.urls)),
(r'^useradmin/', include(useradmin.site.urls)),
)
И я пытаюсь зарегистрировать разные модели в модулях admin.py и useradmin.py в каталогах приложений:
# products/useradmin.py
import useradmin
class ProductAdmin(useradmin.ModelAdmin):
pass
useradmin.site.register(Product, ProductAdmin)
Но при регистрации моделей в useradmin.py, таких как useradmin.site.register(Product, ProductAdmin)
,Я получаю 'module' object has no attribute 'ModelAdmin'
исключение.Хотя, когда я пытаюсь сделать это через оболочку,
import useradmin
from useradmin import ModelAdmin
не вызывает никаких исключений.
Есть идеи, что может быть не так?
Редактировать:
Я попытался пойти по пути @Luke и расположил код как можно ниже: (пути к файлам относительно корня проекта)
# admin.py
from django.contrib.admin import autodiscover
from django.contrib.admin.sites import AdminSite
user_site = AdminSite(name='useradmin')
# urls.py (does not even have url patterns; just calls autodiscover())
import admin
admin.autodiscover()
# products/admin.py
import admin
from products.models import Product
admin.user_site.register(Product)
В результате я получаю AttributeError: 'module' object has no attribute 'user_site'
когда admin.user_site.register(Product)
в products/admin.py
вызывается.
Есть идеи?
Решение:
Я не знаю, есть лилучшие способы, но переименование admin.py
в корне проекта в useradmin.py
и обновление импорта соответственно разрешило последний случай, который был конфликтом именования и импорта.