【问题标题】:Django sitemaps 'Post' object has no attribute 'get_absolute_url'?Django站点地图'Post'对象没有属性'get_absolute_url'?
【发布时间】:2019-01-25 02:08:48
【问题描述】:

我正在创建一个简单的 django 1.9 应用程序,其中包含一个博客,并且我希望该站点具有由网站页面和博客文章条目组成的站点地图。到目前为止,我能够构建一个将静态页面生成为站点地图的站点地图但是博客帖子站点地图给了我一个错误'Post' object has no attribute 'get_absolute_url 这是我的代码。有人请告诉我哪里出错了。

sitemaps.py

from django.contrib import sitemaps

from django.contrib.sitemaps import Sitemap

from django.core.urlresolvers import reverse

from administration.models import Post


class StaticSitemap(sitemaps.Sitemap):

      changefreq = "daily"

      priority = 1.0



     def items(self):

          return ['administration:index', 'administration:about']



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



class PostSitemap(Sitemap):

      changefreq = "daily"

      priority = 0.5


      def items(self):
          return Post.objects.all()`

models.py

class Post(models.Model):
    STATUS_CHOICES = (('draft', 'Draft'),('published', 'Published'),)
    featured_image = models.ImageField(upload_to="Photos/posts/images", blank=True, null=True)
    post_short_description = models.TextField(default="No description available")
    title = models.CharField(max_length=250)
    slug = models.SlugField(max_length=250, unique_for_date='publish')
    category = models.ForeignKey(Category)
    tag = models.ManyToManyField(Tag)
    author = models.ForeignKey(User,related_name='blog_posts',on_delete=models.CASCADE)
    body = RichTextField()
    publish = models.DateTimeField(default=timezone.now)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    status = models.CharField(max_length=10, choices=STATUS_CHOICES,default='draft')

    class Meta:
        ordering = ('-publish',)

    def __str__(self):
        return self.title

urls.py

from django.conf.urls import include, url
from django.contrib import admin
from django.conf import settings
from django.conf.urls.static import static
from django.contrib.sitemaps.views import sitemap
from administration.sitemaps import PostSitemap, StaticSitemap

sitemaps = {
   'post':PostSitemap,'static':StaticSitemap
}

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^', include('administration.urls')),
    url(r'^sitemap\.xml$', sitemap, {'sitemaps': sitemaps}, 
    name='django.contrib.sitemaps.views.sitemap'),
    url(r'^robots\.txt', include('robots.urls')),
    url(r'^', include('cms.urls'))
]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

【问题讨论】:

    标签: python django


    【解决方案1】:

    当你使用Sitemap类并且不自己实现location()方法时,默认是在每个对象上调用get_absolute_url()

    https://docs.djangoproject.com/en/2.1/ref/contrib/sitemaps/#a-simple-example 的文档说:

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

    因此,您应该在您的PostSitemap 上实现location(),或者在您的Post 模型上实现get_absolute_url()

    【讨论】:

    • 感谢您的帮助!添加get_absolute_url 成功了。
    • get_absolute_url 函数的编码是怎么做的?
    • @sly_Chandan 最简单的方法应该返回类似f"/posts/{self.id}" 的内容,基本上是您的对象的 URL 路径,或者您可以使用 reverse 方法构造它,它会根据您的 url 创建它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-17
    • 2015-01-29
    • 2019-01-19
    • 2015-04-19
    • 2019-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多