2010-08-11 20 views
3

我設置了一些Django站點地圖。它適用於我擁有的所有對象,但我很好奇我應該如何做,如果我想在沒有對象關聯的站點地圖中添加內容。沒有關聯對象的Django站點地圖(只是一個視圖)

例如,我有一個類別列表,我可以返回所有類別的查詢集。網址將是example.com/cats/12或你有什麼。我也有一種不與類別對象關聯的僞根類別。該頁面(example.com/cats/)只是一個視圖,包括沒有父項的所有子類別以及產品列表。點是,我不能使用get_absolute_url,因爲沒有「根」對象。我的解決辦法是讓查詢集作爲一個列表,添加一個「無」對象,然後得到相應的URL:

class CatsSitemap(Sitemap): 
    changefreq = "weekly" 
    priority = 0.4 

    def items(self): 
     cats = list(Category.objects.all()) 
     cats.append(None) 
     return cats 

    def location(self, obj): 
     if(obj != None): 
      return reverse('cats_sub_category', args=[obj.pk]) 
     else: 
      return reverse('cats_root') 

有誰看到這是一個問題?將它們作爲列表殺死性能返回嗎?實際上,我們可能會有數百個類別,但可能不會比這更多。太多了?

回答

1

也許我找到了一個更好的方法來做到這一點,這將在未來與其他沒有關聯對象的命名視圖一起使用。在sitemaps.py,放:

class NamedURLSitemap(Sitemap): 
    priority = 1.0 
    changefreq = "daily" 

    def __init__(self, names): 
     self.names = names 

    def items(self): 
     return self.names 

    def lastmod(self, obj): 
     return datetime.datetime.now() 

    def location(self, obj): 
     return reverse(obj) 

而在urls.py,放:

'cat-roots': NamedURLSitemap(['cats_root']), 

這簡化了類別代碼地圖:

class CatsSitemap(Sitemap): 
    changefreq = "weekly" 
    priority = 0.4 

    def items(self): 
     return Category.objects.all() 

    def location(self, obj): 
     return reverse('cats_sub_category', args=[obj.pk]) 

任何意見在這或以前的解決方案?

+0

似乎是一個不錯的解決方案給我。你應該看到將這個包含在django的站點地圖模塊中,我認爲這非常有用。我不確定如何使用datetime.datetime.now()作爲lastmod時間戳,儘管 – 2010-08-23 16:08:30

+0

儘管您可以將'priority'和'changefreq'參數設置爲__init__,以支持添加具有不同優先級和changefreq的多個命名頁面 – 2010-08-23 16:13:07

1

略有改善你的答案,包括每個頁面的優先級和的changefreq傳遞給初始化列表的一部分:

class NamedURLSitemap(Sitemap): 

    def __init__(self, pages): 
     """ 
     Parameters: 
     ``pages`` 
      A list of three-tuples containing name, priority, and changefreq: 

      e.g. [('home', 0.5, 'daily'), ('search', 0.5, 'never')] 
     """ 
     self.pages = pages 

    def items(self): 
     return self.pages 

    def lastmod(self, obj): 
     return datetime.datetime.now() 

    def location(self, obj): 
     return reverse(obj[0]) 

    def priority(self, obj): 
     return obj[1] 

    def changefreq(self, obj): 
     return obj[2] 
相關問題