在电子邮件模板中获取根URL /域名

时间:2014-01-22 16:18:34

标签: python django

我正在使用django的send_mail发送一封电子邮件(使用模板),其中包含以下行:

要重置密码,请点击以下链接:

http://localhost:8000/{% url 'reset_password' uid=uid token=token %}

你可以想象,这并不理想。我有多个环境(本地,登台,开发,生产),每个环境都有完全不同的基本URL。我希望能够动态生成域名,但url函数仅提供根URL之后的路径(即/ reset_password / some_token /)。

有什么方法可以动态生成主机名吗?我知道我可以在每台机器上都有一个环境变量并将其放在我的settings.py文件中,但我不是唯一的开发人员,我们的环境可能暂时无法更新。

3 个答案:

答案 0 :(得分:4)

这正是sites framework的设计目标。域名将存储在环境数据库中,可以从管理界面进行编辑。您可以将此域名传递到模板的上下文中。举个例子:

>>> from django.contrib.sites.models import Site
>>> Site.objects.get_current().domain
"example.com"

答案 1 :(得分:1)

您可以为此创建自定义模板标记。

# myapp/templatetags/mytags.py
from django import template
from django.contrib.sites.models import Site

register = template.Library()

@register.simple_tag
def current_domain():
    return Site.objects.get_current().domain

然后,在你的模板中,我们就像这样:

{% load mytags %}
http://{% current_domain %}{% url 'reset_password' uid=uid token=token %}

答案 2 :(得分:0)

从django 1.5版开始,您需要为授权访问您的网站定义ALLOWED_HOSTS设置。由于这种情况因部署而异,因此在这种情况下可能很有用:

from django.conf import settings

# <trimmed> ...

class User(AbstractUser):

    # <trimmed> ...

    def get_url_notifications(self):
        return settings.ALLOWED_HOSTS[0] + reverse('user-notifications')
    url_notifications = property(get_url_notifications)

在这里,我向url_notifications模型添加了User属性,该属性返回我的django网站中视图的完整网址。

并且,在每个部署的settings.py中,您有:

# settings.py

# ...

ALLOWED_HOSTS = ['production.example.com', ]

效果很好!