我正在使用django的send_mail发送一封电子邮件(使用模板),其中包含以下行:
要重置密码,请点击以下链接:
http://localhost:8000/{% url 'reset_password' uid=uid token=token %}
你可以想象,这并不理想。我有多个环境(本地,登台,开发,生产),每个环境都有完全不同的基本URL。我希望能够动态生成域名,但url函数仅提供根URL之后的路径(即/ reset_password / some_token /)。
有什么方法可以动态生成主机名吗?我知道我可以在每台机器上都有一个环境变量并将其放在我的settings.py文件中,但我不是唯一的开发人员,我们的环境可能暂时无法更新。
答案 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', ]
效果很好!