如何指定项目级别admin.py?
我前段时间问过这个问题,因为问题缺乏活动而被授予Tumbleweed奖项! > _<
项目:
例如,admin.autodiscover()
通常放在项目级别urls.py
中(是的,它会自动包含在1.7中)
我想将此以及以下内容移至他们自己的admin.py
文件中:
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User
UserAdmin.list_display = ('email', 'first_name', 'last_name', 'is_active')
admin.site.unregister(User)
admin.site.register(User, UserAdmin)
admin.autodiscover()
我尝试这样做,制作一个admin.py
文件并将代码添加到其中。没用。
我尝试添加一个名为admin
的项目级文件夹,添加了__init__.py
并将admin.py
扔进了admin文件夹。没工作
此外,我尝试将此admin
文件夹添加到INSTALLED_APPS
中的settings.py
。没有运气。
答案 0 :(得分:1)
所有admin.autodiscover()
都会导入它找到的所有管理文件。没有必要将行本身放在管理文件中。
要理解它为什么不起作用,你需要意识到它是如何工作的。它的作用是导入注册应用程序中的admin.py文件 。已注册的应用程序是包含在INSTALLED_APPS中的包,其中包含models.py.这是值得重复的:如果没有models.py,则不考虑应用程序 - 即使是空白的也可以使用,但如果没有它,则包不是应用程序。
因此,如果在目录中创建空白models.py,请确保该目录位于INSTALLED_APPS中,并将admin.autodisover移回urls.py,一切都会正常工作。
修改强>
我不确定你想要什么,为什么。正如我所提到的,自动发现取决于应用程序;但正如我所提到的,所有自动发现都会导入所有管理文件。如果您真的不想遵循最佳实践,那么您需要做的就是手动导入管理文件:您可以在通常称为自动发现的相同位置(即主urls.py中)执行此操作。
答案 1 :(得分:0)
来自admin.autodiscover
doc字符串:
自动发现INSTALLED_APPS admin.py模块并在以后无提示失败 不存在。这会强制导入它们以注册任何管理位 可能想要。
以下是完整的功能:
def autodiscover():
"""
Auto-discover INSTALLED_APPS admin.py modules and fail silently when
not present. This forces an import on them to register any admin bits they
may want.
"""
import copy
from django.conf import settings
from django.utils.importlib import import_module
from django.utils.module_loading import module_has_submodule
for app in settings.INSTALLED_APPS:
mod = import_module(app)
# Attempt to import the app's admin module.
try:
before_import_registry = copy.copy(site._registry)
import_module('%s.admin' % app)
except:
# Reset the model registry to the state before the last import as
# this import will have to reoccur on the next request and this
# could raise NotRegistered and AlreadyRegistered exceptions
# (see #8245).
site._registry = before_import_registry
# Decide whether to bubble up this error. If the app just
# doesn't have an admin module, we can ignore the error
# attempting to import it, otherwise we want it to bubble up.
if module_has_submodule(mod, 'admin'):
raise
因此,自动发现对您来说唯一的事情就是在已安装的应用程序目录中查找名为admin.py
的模块,因此您可以将admin.py放在您想要的地方,只需确保导入它,这样就可以使用它(模型的注册等)得到执行。
重要:我不确定导入自定义路径admin.py
的正确时机。但是确保你必须在加载所有相关应用程序后导入它。
答案 2 :(得分:0)
我很想知道这是否会被投票。它似乎有效,但感觉不对。 ; - )
问题是如何覆盖UserAdmin设置。
from django.contrib.auth import admin
from django.contrib.auth.admin import UserAdmin
UserAdmin.list_display = ('email', 'first_name', 'last_name',
'is_active', 'date_joined', 'last_login',
'is_staff')
UserAdmin.ordering = ['-date_joined']
现在您应该在/ admin / auth / user /
上看到新列和排序顺序这对Django 1.11起作用了。到目前为止,我找不到任何问题。你怎么说StackOverflow?
答案 3 :(得分:0)
迟早,一个重度定制的(?,3,1)
课程很可能需要一个项目范围admin
,因为它是注册所有未被自动发现的每个应用程序管理员的地方。文档提到了这一点,但没有广泛的例子来说明它:
https://docs.djangoproject.com/en/1.11/ref/contrib/admin/#customizing-the-adminsite-class
请注意,在使用您自己的
admin.py
实例时,您可能不希望自动发现admin
模块,因为您可能会导入AdminSite
中的所有每个应用admin
模块模块。这意味着您需要在myproject.admin
设置中添加'django.contrib.admin.apps.SimpleAdminConfig'
而不是'django.contrib.admin'
。
在wiki中以及多个INSTALLED_APPS
网站上有一些过时但有效的示例:
https://code.djangoproject.com/wiki/NewformsAdminBranch
admin