问题描述
from django.contrib.sitemaps import Sitemap
from django.urls import reverse
from .models import Post
class PostSitemap(Sitemap):
changefreq = "weekly"
priority = 0.9
def items(self):
return Post.objects.all()
class Post(models.Model):
title=models.CharField(max_length=100)
header_image = models.ImageField(null=True,blank=True,upload_to="images/")
title_tag=models.CharField(max_length=100)
author= models.ForeignKey(User,on_delete=models.CASCADE)
body = RichTextUploadingField(extra_plugins=
['youtube','codesnippet'],external_plugin_resources= [('youtube','/static/ckeditor/youtube/','plugin.js'),('codesnippet','/static/ckeditor/codesnippet/','plugin.js')])
#body = models.TextField()
post_date = models.DateTimeField(auto_Now_add=True)
category = models.CharField(max_length=50,default='uncategorized')
snippet = models.CharField(max_length=200)
likes = models.ManyToManyField(User,related_name='blog_posts')
def total_likes(self):
return self.likes.count()
class Meta:
verbose_name = "EnTrada"
verbose_name_plural = "EnTradas"
ordering = ['-post_date']
def __str__(self):
return self.title + ' | ' + str(self.author)
def get_absolute_url(self):
return reverse('home')
如果有人可以帮助我,我将非常感激。 urls.py:
from django.contrib.sitemaps.views import sitemap
from theblog.sitemaps import PostSitemap,StaticSitemap
sitemaps = {'static': StaticSitemap,'blog': PostSitemap}
解决方法
简短答案:get_absolute_url()
应该为对象实现规范网址。
为了生成站点地图。 Django将在每个元素上调用Sitemap
对象的.location(…)
method [Django-doc]。如果没有定义.location(…)
方法,如此处所示。它将在模型对象上调用.get_absolute_url(…)
method [Django-doc]。
您实现了一种get_absolute_url
方法,但它看起来像:
def get_absolute_url(self):
return reverse('home')
这意味着Post
对象的所有“详细页面”显然都是主页,因此这是站点地图中唯一的页面。它也不能真正满足.get_absolute_url(…)
方法的条件:
定义一个
get_absolute_url()
方法来告诉Django如何计算对象的规范URL 。对于调用者,此方法应该看起来像返回一个字符串,该字符串可用于通过HTTP引用该对象。
规范URL表示每个对象通常唯一。因此,如果您定义的路径如下:
path('post/<int:pk>',post_details,name='post_details')
然后通常的标准网址是:
def get_absolute_url(self):
return reverse('post_details',kwargs={'pk': self.pk})