2012-03-22 119 views
2

我想使用Django站點地圖創建站點特定的站點地圖。Django站點地圖:僅獲取當前網站的頁面

我的想法是做這樣的事情:

def items(self): 
    current_site = Site.objects.get_current(self.request) 
    return current_site.pages.filter(draft=False) 

但我有兩個問題:

  1. self.request沒有定義,有沒有辦法讓地圖中的真實current_site
  2. 的項目URL是不正確的,應該用正確的current_site

我想,我必須直接向右查詢集傳遞給我的網站地圖開始,但我怎麼能做到這一點?

感謝,

雷米

+0

爲什麼你將'self.request'傳遞給'get_current'方法?只需調用'Site.objects。get_current()'這會給你當前的網站! – Ahsan 2012-05-14 06:48:30

回答

1

您可以通過這種方式傳遞網站具體查詢集。

def items(self): 
    return YourModel.objects.by_site() 

by_site是的YourModel管理器功能,

def by_site(self, site=None, **kwargs): 
    """Get all pages for this site""" 
    if not site: 
     site = Site.objects.get_current() 

    site = site.id 

    return self.filter(site__id__exact = site, **kwargs) 
+1

是的,但在這種情況下,Site.objects.get_current()將返回settings.SITE_ID而不是RequestSite – Natim 2012-06-05 08:29:14

-1

這聽起來像sites框架正在使用的sites框架不打算動態切換爲基礎的網站走錯了路

請求。它用於從同一數據庫運行的多個單獨部署。

問題1:

要解決你的items()功能,SITE_ID需要在settings.py其中任何地方可以讓Site.objects.get_current()工作進行設置,而無需request對象。

問題2:

域名應該列入的URL。網站地圖是從域中請求的,因此所有信息都在該域中。

這適用於django內的所有網址。

要解決該問題,請確保模型上的get_absolute_url()方法返回一個以"/"開頭的字符串。不涉及域名。

產品的網址是通過get_absolute_url()或通過致電Sitemap.location()產生的。有關location()有關URL的內容的示例的文檔

欲瞭解更多信息,請查看此bug ticket,大約相同的問題。

+0

實際上,我正在使用'Site'作爲我的SaaS需要的方式。但我認爲使用'SITE_ID'只是使用這個contrib應用程序的簡單方法。 – Natim 2012-05-14 11:16:28

+0

'SITE_ID'是使用'contrib.sites'的**方法。當不使用'contrib.sites'時,另一個'RequestSite' /'get_current_site(request)'只是一個便利的回退。 如果您想以這種方式使用它,您必須重寫「Sitemap」類中的某些方法,這可能會在未來發生變化和破壞。 – 2012-05-14 12:33:27

+0

好的,我也可以分發Sitemap應用程序並創建一個可以工作的程序。 – Natim 2012-05-14 15:37:17