首页 > 解决方案 > 多个 Django 应用程序的 Django 管理员

问题描述

我一直在使用多个数据库开发一个包含多个应用程序的 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'

请注意,我在 setup.py 文件中成功设置了不同的数据库(包括 db_myapp)。

.......
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 平台上为每个应用程序设置不同的管理站点获得一些帮助,我会很高兴。

标签: pythondjangodjango-admin

解决方案


只需替换include('myappadminsite.urls')myappadminsite.urls,因此中的行urls.py应为:

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

和这里

mammothholdingsadminsite = admin.AdminSite('mammothholdingsadminsite')

我认为你需要这样做

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

推荐阅读