我怎样才能得到我的网站在Django模板的域名?
如何从Django模板中获取当前网站的域名? 我试过看标签和filter,但没有在那里。
我想你想要的是访问请求上下文,请参阅RequestContext。
如果你想要实际的HTTP主机头,请参阅Daniel Roseman对@ Phsiao答案的评论。 另一种方法是,如果您使用的是contrib.sites框架 ,则可以为数据库中的站点设置规范域名(将请求域映射到具有适当SITE_ID的设置文件是您必须通过您的networking服务器设置)。 在这种情况下,你正在寻找:
 from django.contrib.sites.models import Site current_site = Site.objects.get_current() current_site.domain 
如果你想使用它,你必须把current_site对象放在模板上下文中。 如果你在各地使用它,你可以把它打包在一个模板上下文处理器中。
作为Carl Meyer的补充,您可以创build一个上下文处理器:
module.context_processors.py
 from django.conf import settings def site(request): return {'SITE_URL': settings.SITE_URL} 
本地settings.py
 SITE_URL = 'http://google.com' # this will reduce the Sites framework db call. 
settings.py
 TEMPLATE_CONTEXT_PROCESSORS = ( ... "module.context_processors.site", .... ) 
模板返回的上下文实例的网站是{{SITE_URL}}
如果想在上下文处理器中处理子域或SSL,可以编写自己的rutine。
 我发现了{{ request.get_host }}方法。 
我使用的上下文处理器的变体是:
 from django.contrib.sites.shortcuts import get_current_site from django.utils.functional import SimpleLazyObject def site(request): return { 'site': SimpleLazyObject(lambda: get_current_site(request)), } 
  SimpleLazyObject包装器确保数据库调用仅在模板实际使用site对象时发生。 这将从pipe理页面中删除查询。 它也caching结果。 
并将其包含在设置中:
 TEMPLATE_CONTEXT_PROCESSORS = ( ... "module.context_processors.site", .... ) 
 在模板中,您可以使用{{ site.domain }}获取当前的域名。 
编辑:也支持协议切换,使用:
 def site(request): site = SimpleLazyObject(lambda: get_current_site(request)) protocol = 'https' if request.is_secure() else 'http' return { 'site': site, 'site_root': SimpleLazyObject(lambda: "{0}://{1}".format(protocol, site.domain)), } 
我知道这个问题是旧的,但我偶然发现它寻找pythonic的方式来获得当前的域名。
 def myview(request): domain = request.build_absolute_uri('/')[:-1] # that will build the complete domain: http://foobar.com 
 我使用自定义模板标签。 添加到例如<your_app>/templatetags/site.py : 
 # -*- coding: utf-8 -*- from django import template from django.contrib.sites.models import Site register = template.Library() @register.simple_tag def current_domain(): return 'http://%s' % Site.objects.get_current().domain 
在像这样的模板中使用它:
 {% load site %} {% current_domain %} 
快速简单,但不适合生产:
(在视图中)
  request.scheme # http or https request.META['HTTP_HOST'] # example.com request.path # /some/content/1/ 
(在模板中)
 {{ request.scheme }} :// {{ request.META.HTTP_HOST }} {{ request.path }} 
请确保使用RequestContext ,如果您使用渲染 ,则是这种情况。
 不要相信生产中的request.META['HTTP_HOST'] :该信息来自浏览器。 相反,使用@ CarlMeyer的答案 
  {{ request.get_host }}与ALLOWED_HOSTS设置(在Django 1.4.4中添加)一起使用时,应该防止HTTP Host头部攻击。 
 请注意, {{ request.META.HTTP_HOST }}不具有相同的保护。 看文档 : 
ALLOWED_HOSTS
表示此Django站点可以提供服务的主机/域名的string列表。 这是防止HTTP主机头攻击的安全措施,即使在许多看似安全的Web服务器configuration下也是如此。
…如果
Host头(或X-Forwarded-Host如果USE_X_FORWARDED_HOST已启用)与此列表中的任何值不匹配,则django.http.HttpRequest.get_host()方法将引发SuspiciousOperation。…此validation只适用于通过
get_host(); 如果您的代码直接从request.META访问主机头,您将绕过此安全保护。
 至于在你的模板中使用request , Django 1.8中的模板渲染函数调用已经改变 ,所以你不再需要直接处理RequestContext 。 
 以下是使用快捷方式函数render()为视图呈现模板的方法: 
 from django.shortcuts import render def my_view(request): ... return render(request, 'my_template.html', context) 
以下是如何为电子邮件呈现模板,其中IMO是您希望获取主机值的常见情况:
 from django.template.loader import render_to_string def my_view(request): ... email_body = render_to_string( 'my_template.txt', context, request=request) 
 以下是在电子邮件模板中添加完整url的示例;  request.scheme应根据您使用的内容获取http或https : 
 Thanks for registering! Here's your activation link: {{ request.scheme }}://{{ request.get_host }}{% url 'registration_activate' activation_key %} 
类似于用户panchicore的回复,这是我在一个非常简单的网站上做的。 它提供了一些variables,并使它们在模板上可用。
  SITE_URL将拥有像example.com这样的值 
  SITE_PROTOCOL将保存一个像http或https的值 
  SITE_PROTOCOL_URL将保存一个值,如http://example.com或https://example.com 
  SITE_PROTOCOL_RELATIVE_URL会保存一个像//example.com的值。 
模块/ context_processors.py
 from django.conf import settings def site(request): SITE_PROTOCOL_RELATIVE_URL = '//' + settings.SITE_URL SITE_PROTOCOL = 'http' if request.is_secure(): SITE_PROTOCOL = 'https' SITE_PROTOCOL_URL = SITE_PROTOCOL + '://' + settings.SITE_URL return { 'SITE_URL': settings.SITE_URL, 'SITE_PROTOCOL': SITE_PROTOCOL, 'SITE_PROTOCOL_URL': SITE_PROTOCOL_URL, 'SITE_PROTOCOL_RELATIVE_URL': SITE_PROTOCOL_RELATIVE_URL } 
settings.py
 TEMPLATE_CONTEXT_PROCESSORS = ( ... "module.context_processors.site", .... ) SITE_URL = 'example.com' 
 然后,在您的模板上,将它们用作{{ SITE_URL }} , {{ SITE_PROTOCOL }} , {{ SITE_PROTOCOL_URL }}和{{ SITE_PROTOCOL_RELATIVE_URL }} 
 from django.contrib.sites.models import Site if Site._meta.installed: site = Site.objects.get_current() else: site = RequestSite(request) 
 您可以在模板中使用{{ protocol }}://{{ domain }}来获取您的域名。