2

静态部分工作正常,但我的博客应用程序的动态帖子没有生成

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

我无法通过我的博客和模型中的 Post 类获得动态站点地图:

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, blank=True, 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')

如果有人可以帮助我,我将不胜感激。网址.py:

from django.contrib.sitemaps.views import sitemap
from theblog.sitemaps import PostSitemap, StaticSitemap
        
        sitemaps = {'static': StaticSitemap, 'blog': PostSitemap}
4

1 回答 1

2

简短回答get_absolute_url()应该实现对象的规范 URL

为了生成站点地图。Django 将在每个元素上调用对象的.location(…)方法 [Django-doc] 。Sitemap如果没有.location(…)定义方法,就像这里的情况一样。它将调用模型对象上的.get_absolute_url(…)方法 [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})
于 2020-10-10T22:16:28.587 回答