Как иметь два разных сайта администратора в проекте Django?
Я хочу иметь 2 отдельных сайта администратора внутри проекта Django.
Отдельно я имею в виду - у них должна быть отдельная аутентификация пользователей, они должны администрировать разные модели и иметь разные взгляды и URL-адреса.
Причина, по которой я хочу это сделать, заключается в том, что клиент хочет, чтобы отдельный раздел администрировал часть CMS на странице и отделялся от использования в качестве "бэк-офиса".
Я подумал о том, чтобы сделать копию django.contrib.auth appliaction в моем дереве проектов, назвав ее по-разному и используя отдельные вызовы admin.site.register()
для обоих из них. Таким образом, у меня могут быть доступны другие модели в каждом из них, разные взгляды и т.д. Я не знаю, как решить проблему аутентификации пользователя (у меня должен быть другой пользователь, чтобы иметь возможность входа в CMS затем в BackOffice).
Кто-нибудь это делал раньше и мог дать мне какой-то намек? Или что я планирую сделать, это просто неправильно по дизайну?
Ответы
Ответ 1
Для регистрации моделей в разных AdminSites вам просто нужно создать разные экземпляры django.contrib.admin.sites.AdminSite, посмотреть это.
Вам будет хорошо пойти с двумя разными административными сайтами, управляющими разными моделями и имеющими разные шаблоны.
Для аутентификации и разрешений вы можете использовать встроенный django.contrib.auth, а также пользовательские разрешения (надеюсь, что кто-то еще сможет помочь здесь)
Ответ 2
Вы можете подклассифицировать Django AdminSite
(поместите его, например, в admin.py
в корневой каталог проекта):
from django.contrib.admin.sites import AdminSite
class MyAdminSite(AdminSite):
pass
#or overwrite some methods for different functionality
myadmin = MyAdminSite(name="myadmin")
По крайней мере, с 1,9 до вас нужно добавить параметр имени, чтобы он работал правильно. Это используется для создания обратных URL-адресов, поэтому имя должно быть одним из urls.py.
Затем вы можете использовать его в своем приложении admin.py
так же, как и с обычным экземпляром AdminSite
:
from myproject.admin import myadmin
myadmin.register(MyModel_A)
Вам также нужно определить некоторые URL-адреса для него (в вашем проекте urls.py
):
from myproject.admin import admin, user_site
from myproject.admin import myadmin
urlpatterns = patterns('',
...
(r'^admin/', include(admin.site.urls)),
(r'^myadmin/', include(myadmin.urls)),
Также см. это: http://docs.djangoproject.com/en/dev/ref/contrib/admin/#adminsite-objects
Ответ 3
Я не уверен, что мое обнаружение, о котором сообщалось здесь, было бы очень полезно для кендера, потому что, между прочим, я не знаю, говорил ли он не только о двух сайтах администратора, но и о двух базах данных, один для каждый. Это моя ситуация. Я получил яркую идею о том, что я хотел, чтобы одно из моих приложений, новое приложение, имело собственную базу данных и собственные страницы администратора.
Но у меня возникла проблема с подклассическим подходом AdminSite Бернхарда Валанта, хотя, похоже, это была ортодоксальная и, по сути, правильная вещь. Я решил проблему.
Вот мода на код Бернхарда Валланта, который я нашел абсолютно необходимым:
from django.contrib.admin.sites import AdminSite
class MyAdminSite(AdminSite):
pass
#or overwrite some methods for different functionality
myadmin = MyAdminSite(name='anything')
Да, я действительно имею в виду name= "что угодно", которое вы выберете (пока это не "админ" ). И я переключился с ним, и он терпит неудачу каждый раз без назначения имени ничего, кроме admin.
Признаками, которые я приобрел, было то, что когда я добавил вторую базу данных и создал для нее myadmin, а затем зарегистрировал модель с myadmin.register(My_ModelA) и перешел посмотреть две страницы приложения администратора, одну для моей новое приложение, которое использовало вторую базу данных и myadmin, а модель My_ModelA выглядела отлично, но моя старая страница администратора показывала мертвые ссылки для своих моделей, и когда я нажал туда на не-мертвую ссылку для приложения (старое приложение, использующее старую базу данных ) У меня есть код 404, что страница не существует.
Кроме того, я не знаю, что это важно, но я сделал что-то отличное от того, что
Bernhard Vallant сделал в проекте urlconf:
from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
url(r'^admin/', include('mynewapp.urls')),
url(r'^someword/admin/', include(admin.site.urls)),
)
ОК, "someord" не имеет значения - там для выступлений с конечным пользователем, а не с именем приложения или проекта. Но связанный администратор - тот, который используется для моего старого приложения и старой базы данных. Обратите внимание на включение автообнаружения(). В документах, с которыми связан Bernhard Vallant, есть некоторые мутные слова, связанные с его использованием, когда проект urlconf настроен так, как Bernhard Vallant имеет его с myadmin import, но также со ссылкой на администратора по умолчанию.
И для urlconf для mynewapp у меня есть:
from django.conf.urls import patterns, url, include
from myproject.admin import myadmin
urlpatterns = patterns('',
url(r'/', include(myadmin.urls) )
)
urlpatterns += patterns('mynewapp.views',"... url() stuff for mynewapp views"),
)
Несмотря на полную необходимость называть ваш экземпляр AdminSite внутренне чем-то другим, кроме "admin", я должен добавить, что, когда пришло время разжечь файл mynewapp admin.py с некоторым подклассом admin.ModelAdmin, необходимо было действительно используйте admin.ModelAdmin как родительский класс. myadmin - это, в конце концов, экземпляр подкласса AdminSite. Как таковой, я понимаю, что он наравне с admin.site, а не с администратором.
Это все очень запутывает NOOB, как я, потому что администратор с нижним регистром выглядит как экземпляр, и я не знаком с экземплярами подкласса. Поэтому я предполагаю, что это не так.