Django Admin для нескольких Django приложений - PullRequest
0 голосов
/ 09 января 2020

Я разрабатывал проект Django с несколькими приложениями, использующими несколько баз данных. Мне нужен отдельный админ-сайт для каждого приложения. Например, myapp должен использовать админ-сайт, который просто принадлежит самому себе. Другими словами, мне нужно что-то вроде http://127.0.0.1: 8000 / myapp_admin / в браузере для доступа к соответствующей базе данных на сайте администратора.

Это то, что я сделал до сих пор :

class MultiDBModelAdmin(admin.ModelAdmin):
    # A handy constant for the name of the alternate database.
    using = 'db_myapp'

    def save_model(self, request, obj, form, change):
        # Tell Django to save objects to the 'other' database.
        obj.save(using=self.using)

    def delete_model(self, request, obj):
        # Tell Django to delete objects from the 'other' database
        obj.delete(using=self.using)

    def get_queryset(self, request):
        # Tell Django to look for objects on the 'other' database.
        return super().get_queryset(request).using(self.using)

    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        # Tell Django to populate ForeignKey widgets using a query
        # on the 'other' database.
        return super().formfield_for_foreignkey(db_field, request, using=self.using, **kwargs)

    def formfield_for_manytomany(self, db_field, request, **kwargs):
        # Tell Django to populate ManyToMany widgets using a query
        # on the 'other' database.
        return super().formfield_for_manytomany(db_field, request, using=self.using, **kwargs)

В файле admin.py у меня есть это:

mammothholdingsadminsite = admin.AdminSite('mammothholdingsadminsite')
mammothholdingsadminsite.register(User, MultiDBModelAdmin)

В файле urls.py у меня есть это:

from django.urls import path, include  
from django.contrib import admin, auth  

from myapp.admin import myappadminsite

urlpatterns = [
    path('admin/', admin.site.urls),
    path('myapp/', include('myapp.urls')),
    path('oauth/', include('social_django.urls', namespace='social')),
    path('myapp_admin/', include('myappadminsite.urls')),
]

Но я получаю следующую ошибку:

File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
  File "<frozen importlib._bootstrap>", line 983, in _find_and_load
  File "<frozen importlib._bootstrap>", line 965, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'mammothholdingsadminsite'

Обратите внимание, что у меня есть разные базы данных (включая db_myapp), успешно настроенные в файле setup.py.

.......
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    },

    'db_myapp': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'testdb',
        'USER': 'root',
        'PASSWORD': 'mypassword',
        'HOST': 'myhost', #that is my amazon end point that I removed for now
        'PORT': '3306',
    }
}

DATABASE_ROUTERS = ['myapp.dbRouter.MyAppDbRouter',]
.......
.......

Я бы хотел будь рад, если бы я мог получить некоторую помощь, имея разные админ-сайты для каждого приложения на платформе django.

1 Ответ

0 голосов
/ 09 января 2020

Просто замените include('myappadminsite.urls') на myappadminsite.urls, поэтому строка в urls.py должна выглядеть следующим образом:

path('myapp_admin/', myappadminsite.urls),

и здесь

mammothholdingsadminsite = admin.AdminSite('mammothholdingsadminsite')

Я думаю, вам нужно это сделать как это

mammothholdingsadminsite = admin.AdminSite(name='mammothholdingsadminsite')
...