La partie statique fonctionne bien mais les articles dynamiques de mon application de blog ne sont pas générés

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

Je n'arrive pas à obtenir un sitemap dynamique avec mon blog et ma classe Post dans les modèles :

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

Si quelqu'un peut m'aider, je serais très reconnaissant. URL.py :

from django.contrib.sitemaps.views import sitemap
from theblog.sitemaps import PostSitemap, StaticSitemap
        
        sitemaps = {'static': StaticSitemap, 'blog': PostSitemap}
2
Gerard 11 oct. 2020 à 01:06

1 réponse

Meilleure réponse

Réponse courte : le get_absolute_url() doit implémenter une URL canonique vers l'objet.

Afin de générer le plan du site. Django appellera le .location(…) méthode [Django-doc] de l'objet Sitemap sur chaque élément. Si aucune méthode .location(…) n'est définie, comme c'est le cas ici. Il appellera le .get_absolute_url(…) méthode [Django-doc] sur l'objet modèle.

Vous avez implémenté une méthode get_absolute_url, mais cela ressemble à :

def get_absolute_url(self):
    return reverse('home')

Cela signifie que toutes les "pages de détails" pour les objets Post sont apparemment la page d'accueil, c'est donc la seule page qui sera dans le plan du site. Elle ne satisfait pas non plus vraiment les conditions de la méthode .get_absolute_url(…) :

Définissez une méthode get_absolute_url() pour indiquer à Django comment calculer l'URL canonique pour un objet. Pour les appelants, cette méthode doit sembler renvoyer une chaîne pouvant être utilisée pour faire référence à l'objet via HTTP.

Une URL canonique signifie qu'elle est normalement unique par objet. Donc, si vous avez un chemin défini comme :

    path('post/<int:pk>', post_details, name='post_details')

Alors souvent l'url canonique est :

def get_absolute_url(self):
    return reverse('post_details', kwargs={'pk': self.pk})
2
Willem Van Onsem 10 oct. 2020 à 22:16