You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于django_hosts实现多应用共用模板自动匹配对应基础模板

解决方案:根据多主机自动匹配对应App的基础模板

我帮你梳理了两个实用的解决方案,都能完美解决你不想在每个视图手动传递base变量的需求:

方案一:利用django_hosts内置的request.host属性

django_hosts中间件会自动将当前匹配到的host规则对象附加到request上,我们可以利用这个特性来动态返回对应的基础模板路径:

步骤1:创建自定义上下文处理器

在你的项目根目录下新建context_processors.py文件,写入以下代码:

def host_base_template(request):
    # 获取当前host规则的名称(对应host_patterns里的name字段)
    host_name = getattr(request, 'host', None)
    # 映射host名称到对应App的基础模板
    template_map = {
        'app1': 'app1/base.html',
        'app2': 'app2/base.html',
    }
    # 设置默认模板,避免未匹配到的情况报错
    return {'base': template_map.get(host_name, 'base.html')}

步骤2:注册上下文处理器

在项目的settings.py中,找到TEMPLATES配置项,将刚才的处理器添加到context_processors列表里:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR / 'templates'],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
                # 添加自定义处理器
                'your_project_name.context_processors.host_base_template',
            ],
        },
    },
]

这样一来,当你访问http://app1.example.com/document/时,base变量会自动被设置为app1/base.html;访问app2或application2域名时,则会对应app2/base.html,完全不需要在视图里手动传参。

方案二:直接解析请求域名(不依赖django_hosts属性)

如果你不想依赖django_hosts的request.host属性,也可以直接解析请求的域名前缀来判断:

修改context_processors.py的代码为:

def host_base_template(request):
    # 提取域名的前缀部分(比如app1.example.com -> app1)
    host_prefix = request.get_host().split('.')[0]
    
    # 处理app2的别名application2
    if host_prefix in ['app2', 'application2']:
        base_template = 'app2/base.html'
    elif host_prefix == 'app1':
        base_template = 'app1/base.html'
    else:
        # 默认模板,可根据需求调整
        base_template = 'base.html'
    
    return {'base': base_template}

同样完成步骤2的注册即可,这个方案更直接,不需要依赖django_hosts的内部属性,适合对依赖控制更严格的场景。

注意事项

  • 确保你的ALLOWED_HOSTS配置包含所有需要支持的子域名(比如['app1.example.com', 'app2.example.com', 'application2.example.com'])
  • 确认django_hosts的中间件已经正确添加到MIDDLEWARE配置中:
MIDDLEWARE = [
    'django_hosts.middleware.HostsRequestMiddleware',
    # 其他中间件...
    'django_hosts.middleware.HostsResponseMiddleware',
]

内容的提问来源于stack exchange,提问作者Tomasz Brzezina

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:14:26