如何在第三方Django包中覆写Django Admin模板?
如何在第三方Django包中覆写Django Admin模板?
我之前开发第三方Django插件时也碰到过一模一样的问题,想覆写admin的登录模板却死活不生效,后来排查下来发现是几个细节没做好。咱们一步步来解决:
确保你的Django addon app结构规范
你的Python包里面的Django插件必须是标准的Django app结构,比如:mypackage/ __init__.py auth_addon/ # 这是你的Django addon app __init__.py apps.py templates/ admin/ login.html # 你的覆写模板同时
apps.py里要定义好AppConfig类,让Django识别这是一个合法的Django app:# mypackage/auth_addon/apps.py from django.apps import AppConfig class AuthAddonConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'mypackage.auth_addon'调整INSTALLED_APPS的顺序
Django加载模板时,会按INSTALLED_APPS里的顺序依次查找模板文件,先找到的会被优先使用。所以你必须把你的Django addon app放在django.contrib.admin前面:# settings.py INSTALLED_APPS = [ 'mypackage.auth_addon', # 你的app要放在admin前面 'django.contrib.admin', # 其他app... ]这里要注意:如果你之前把整个Python包(比如
mypackage)加到INSTALLED_APPS里,而不是里面的Django app,那Django根本找不到你的模板目录,这是很常见的坑。确保模板文件被正确打包进你的Python包
很多人会忽略这一步:如果你的包是通过pip安装的,必须确保模板文件被包含在安装包中。在setup.py里添加package_data配置:# setup.py from setuptools import setup, find_packages setup( name='mypackage', version='0.1', packages=find_packages(), package_data={ 'mypackage.auth_addon': ['templates/admin/*.html'], }, # 其他配置比如install_requires等... )如果你用的是pyproject.toml,可以这么写:
# pyproject.toml [tool.setuptools.package-data] "mypackage.auth_addon" = ["templates/admin/*.html"]验证模板加载情况
如果还是不生效,可以用Django的模板加载器排查实际加载的是哪个模板:
在Django shell里运行:from django.template.loader import get_template print(get_template('admin/login.html').origin)这会输出当前加载的模板文件路径,你就能清楚是不是你的模板被正确加载了。
备注:内容来源于stack exchange,提问作者recoup8063




