You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何在第三方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

火山引擎 最新活动