生成Django sitemap.xml:如何修复' get_absolute_url'错误

时间:2014-12-27 04:46:06

标签: python xml django

我有一个“BigPage”模型,它有一个名为“pagename”的元素,其唯一设置为True。每次通过将URL myapp.com/pagename添加到我的项目中创建具有新“pagename”元素的新BigPage模型时,我想使用django-sitemaps框架来生成,填充和不断更新sitemap.xml文件sitemap.xml文件。这是我的BigPage模型:

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()

然后,在主项目url.py文件(不是app url.py文件)中我添加了这个:

sitemaps = {
'Name of Page':BigPageSitemap
}

对于urlpatterns元素:

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

我的应用程序url.py具有以下网址格式,如果在URL字段中输入的术语与可以查询以检索BigPage对象的页面名称元素匹配,则它会加载该页面,但如果输入的URL是不等于pagename元素,它将为用户提供404:

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

完成所有这些后,如果我检查app文件夹或主项目文件夹,似乎没有生成站点地图文件。如果我转到myapp.com/sitemap.xml,我会收到以下错误:

'BigPage' object has no attribute 'get_absolute_url'

我做错了什么?我非常感谢任何帮助。我已经好几天了。

1 个答案:

答案 0 :(得分:3)

来自docs

  

此示例中没有位置方法,但您可以在其中提供   为了指定对象的URL。默认情况下,location()调用   每个对象都有get_absolute_url()并返回结果。

您没有在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写的。