2014-01-22 66 views
1

我使用Django的send_mail發送一封電子郵件(使用模板)已在它的下面一行:獲得root URL /域名電子郵件模板

要重設密碼,請點擊以下鏈接:

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

正如你所想象的那樣,這並不理想。我有多個環境(本地,分段,開發,產品),每個環境都有完全不同的基本URL。我希望能夠動態生成域名,但url函數僅提供根URL之後的路徑(即/ reset_password/some_token /)。

有什麼辦法可以動態生成主機名?我知道我可以在每臺機器上都有一個環境變量,並將其放在我的settings.py文件中,但我不是唯一的開發人員,我們的環境可能無法在一段時間內更新。

回答

3

這正是sites framework的設計目的。域名將被存儲在環境的數據庫中,並且可以從管理界面進行編輯。您可以將此域名傳遞到您的模板的上下文中。舉例:

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

當我在我的本地主機上執行此操作時,我從字面上得到「example.com」。這是預期的行爲?我怎樣才能讓它返回它當前運行的域名 - localhost:8000? – user1427661

+0

這是默認值。這就是爲什麼您需要以編程方式或使用管理員在每個環境中正確設置它。 – arocks

+0

完成此操作的最佳方法是什麼?只需在settings.py中設置Site.objects.get_current()。domain? – user1427661

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 %} 
+0

當我在我的本地主機上執行此操作時,我從字面上得到「example.com」。這是預期的行爲?我怎樣才能讓它返回它當前運行的域名 - localhost:8000? – user1427661

+0

這是因爲網站域的默認值設置爲example.com。您可以使用管理面板進行更改。 –

+0

另請參閱https://docs.djangoproject.com/en/dev/ref/contrib/sites/#enabling-the-sites-framework –

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模型,返回一個完整的URL在我的Django網站視圖。

而且,在settings.py每個部署,您有:

# settings.py 

# ... 

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

的偉大工程!