如何在Django模板中获取当前域名?
在Django模板中获取当前域名的解决方案
问题说明
你希望在Django模板中获取当前域名(如192.168.1.1:8000或mydomain.com),尝试了{{ domain }}、{{ site }}、{{ site_name }}但无效——这些变量仅在聚合框架、认证框架(如LoginView)的特定模板中自动可用,普通模板需要手动配置才能访问。
解决步骤
1. 启用并配置Django Sites框架
首先确保启用sites模块并完成基础配置:
- 在
settings.py的INSTALLED_APPS中添加:INSTALLED_APPS = [ # ...其他应用 'django.contrib.sites', ] - 在
settings.py中设置站点ID:SITE_ID = 1 - 执行数据库迁移,生成Site表:
之后可在后台修改python manage.py migrateSite对象的domain和name字段,对应你的实际域名与站点名称。
2. 让所有模板全局访问Site对象
在settings.py的TEMPLATES配置中,添加sites上下文处理器,这样所有模板都能直接调用{{ site }}变量:
TEMPLATES = [ { # ...其他配置 'OPTIONS': { 'context_processors': [ # ...默认处理器 'django.contrib.sites.context_processors.site', ], }, }, ]
配置完成后,模板中可通过以下变量获取信息:
{{ site.domain }}:当前站点的域名(含端口,如192.168.1.1:8000){{ site.name }}:当前站点的名称
你的版权代码可修改为:
<p class="text-right">© Copyright {% now 'Y' %} {{ site.name }} - {{ site.domain }}</p>
3. 获取请求动态域名(适配开发/多域名场景)
如果需要根据当前请求动态获取域名(比如开发环境的随机IP+端口),可自定义上下文处理器:
- 在你的应用目录下创建
context_processors.py文件,写入:def dynamic_domain(request): return {'dynamic_domain': request.get_host()} - 在
settings.py的TEMPLATES.context_processors中添加该处理器:'OPTIONS': { 'context_processors': [ # ...其他处理器 'your_app_name.context_processors.dynamic_domain', ], }, - 模板中使用
{{ dynamic_domain }}即可获取当前请求的完整域名(含端口)
补充说明
- 聚合框架、认证框架(如LoginView)会自动向模板传递
{{ site }}或{{ site_name }},但普通模板需手动配置上下文处理器,或在视图中手动传入Site对象:from django.contrib.sites.models import Site from django.shortcuts import render def your_view(request): site = Site.objects.get_current() return render(request, 'your_template.html', {'site': site})
内容的提问来源于stack exchange,提问作者Majoris
相关产品推荐
相关产品推荐

