Django: использование 2 разных экземпляров AdminSite с разными зарегистрированными моделями - PullRequest
3 голосов
/ 24 декабря 2010

Помимо обычного администратора, я хочу создать ограниченного администратора для пользователей, не являющихся сотрудниками.Этот админ-сайт будет иметь различные зарегистрированные 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 и обновление импорта соответственно разрешило последний случай, который был конфликтом именования и импорта.

1 Ответ

0 голосов
/ 24 декабря 2010

Определен ли useradmin класс ModelAdmin или вы импортируете его из contrib.admin?Я не вижу нигде в коде, который вы указали, где установлен этот класс.

При этом существует более простой способ сделать это на 1006 * намного : просто инициализировать два AdminSites, а затем подключите их к нужным URL-адресам (вы даже можете поместить их в тот же urlconf ).

...