2014-12-27 64 views
2

我有一個名爲「pagename」的元素具有唯一設置爲True的「BigPage」模型。我希望在每次通過將URL myapp.com/pagename添加到我的項目的sitemap.xml文件中創建一個帶有新「pagename」元素的新BigPage模型時,使用django-sitemaps框架生成,填充並持續更新sitemap.xml文件。這裏是我的BigPage型號:生成Django sitemap.xml:如何修復'get_absolute_url'錯誤

class BigPage(models.Model): 
    Pagename = models.CharField(max_length=128, blank=True, unique=True, null=True) #they will enter this input into a form field to reserve their unique url at myapp.com/pagename 
    PageNameOwner = models.CharField(max_length=128, blank=True, null=True) #owner of page enters their name 
    OwnerGender = models.CharField(max_length=7, choices=(('male', 'Male'), ('female', 'Female')), blank=True, null=True) 
    PageViewsCounter = models.IntegerField(null=False, default=0) 
    PageIsRemoved = models.BooleanField(default=False) #true if mods take down a person’s page 

    def __unicode__(self): 
     return self.Pagename 

我已經創建了下面sitemap.py文件,並把它放在哪裏了BigPage模型所在我的應用程序的文件夾中:

class BigPageSitemap(Sitemap): 
    changefreq = 'daily' 
    priority = 0.5 

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

然後,在主體工程網址.py文件(而不是應用程序url.py文件)我已經加入這個:

sitemaps = { 
'Name of Page':BigPageSitemap 
} 

到urlpatterns的元素是:

url(r'^sitemap\.xml$', 'django.contrib.sitemaps.views.sitemap', {'sitemaps': sitemaps}) 

我的應用程序url.py具有以下url模式,如果在匹配頁面名稱元素的URL字段中輸入了一個術語,然後可以查詢它來檢索BigPage對象,那麼它會加載該頁面,但是如果輸入網址不等於一個頁面名稱元素,它會給用戶一個404:

url(r'^(?P<url_param>[a-zA-Z0-9_.-]*)/$', views.view_for_all_BigPages, name='view_for_all_BigPages'),) 

這一切後,沒有sitemap文件似乎產生,如果我檢查應用程序文件夾或主項目文件夾。如果我訪問myapp.com/sitemap.xml,會出現以下錯誤:

'BigPage' object has no attribute 'get_absolute_url' 

我做了什麼錯事?我非常感謝任何幫助。我一直在努力幾天。

回答

3

docs

There is no location method in this example, but you can provide it in order to specify the URL for your object. By default, location() calls get_absolute_url() on each object and returns the result.

你因此未在您的Sitemap類中定義的方法location(),這就是爲什麼它正試圖打電話get_absolute_url()你的模型。所以你需要在你的模型中定義get_absolute_url()這樣的:

class BigPage(models.Model): 
    Pagename = models.CharField(max_length=128, blank=True, unique=True, null=True) 
    # .... 

    def __unicode__(self): 
     return self.Pagename 

    def get_absolute_url(self): 
     return reverse('view_for_all_BigPages', kwargs={'url_param': self.Pagename}) 

的方式,模型的屬性都寫在小字母,pagename而非Pagename

+1

哇,這令人驚訝。我真的很驚訝這個解決方案非常簡單,我花了很多時間努力弄清楚正確的「get_absolute_url()」語法應該是什麼樣子。非常感謝你的幫助。它完美的作品。你讓我今天一整天都感覺很好。 – EazyC

+1

@SwAvGuy我的榮幸:) – doniyor

+0

但是,一個簡單的問題是,sitemap.xml文件位於何處以及如何操作目錄位置,以便我可以確保搜索引擎抓取工具在正確/最高順序目錄中找到它。再次感謝。 – EazyC