【问题标题】:Generating Django sitemap.xml: How to fix 'get_absolute_url' error生成 Django sitemap.xml:如何修复“get_absolute_url”错误
【发布时间】:2014-12-27 04:46:05
【问题描述】:

我有一个“BigPage”模型,其中包含一个名为“pagename”的元素,该元素的唯一设置为 True。每次通过将 URL myapp.com/pagename 添加到我的项目的站点地图来创建具有新“页面名称”元素的新 BigPage 模型时,我想使用 django-sitemaps 框架来生成、填充和持续更新 sitemap.xml 文件。 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 文件(不是应用程序 url.py 文件)中,我添加了这个:

sitemaps = {
'Name of Page':BigPageSitemap
}

到 urlpatterns 元素:

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

我的应用程序 url.py 具有以下 url 模式,如果在 URL 字段中输入与 pagename 元素匹配的术语,然后可以查询该元素以检索 BigPage 对象,则它会加载该页面,但如果输入的 URL 是不等于pagename元素,它会给用户一个404:

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

毕竟,如果我检查应用程序文件夹或主项目文件夹,似乎没有生成站点地图文件。如果我访问 myapp.com/sitemap.xml,我会收到以下错误:

'BigPage' object has no attribute 'get_absolute_url'

我做错了什么?我真的很感激任何帮助。我已经尝试了好几天了。

【问题讨论】:

    标签: python xml django


    【解决方案1】:

    来自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

    【讨论】:

    • 哇,效果惊人。我真的很惊讶解决方案如此简单,我辛勤工作了好几个小时,试图弄清楚正确的“get_absolute_url()”语法应该是怎样的。非常感谢你的帮助。它完美地工作。你让我开心。
    • @SwAvGuy 我的荣幸 :)
    • @SwAvGuy 您直接在主 urls.py 中定义站点地图 url,这意味着它可以直接在域名之后使用,如下所示:www.yourdomain.com/sitemap.xml
    • @SwAvGuy 是的,这很正常。不会有任何物理 xml 文件。它通过调用您的站点地图类方法动态显示。而且这种方式比创建文件并更新文件要高效得多。
    • @SwAvGuy 是的,这对 SEO 来说已经足够好了。搜索引擎也会调用 url,他们不会寻找物理文件。所以你很好:)。玩得开心
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-15
    • 2019-07-15
    • 2018-08-12
    • 2015-03-14
    • 1970-01-01
    • 2021-08-02
    • 2020-08-26
    相关资源
    最近更新 更多