Джанго sitemap (карта сайта) вложенные url
Сижу над sitemap уже 3 дня. Пробовал разные схемы, но толком ни чего не нашел.
Все что есть на просторах интернета описано в моем примере ниже в функции Sitemap - это не подходит.
Нужно чтоб в карту сайта выводились url с вложенностью —
http://example.com/categories/,
http://example.com/categories/category-1/,
http://example.com/categories/category-1/post-1,
http://example.com/categories/category-2/
http://example.com/categories/category-2/post-2-1,
Ни чего подобного в решении такой реализации sitemap я не нашел ни в ютуб ни в документации ни на просторах google. Искал как на русском языке, так и на английском.
Те кто знает, подскажите как это реализовать. Заранее спасибо!
Models
class home(models.Model):
slug = models.SlugField(max_length=266, unique=True, db_index=True, verbose_name=('SLUG'))
...
published = models.DateTimeField(default=timezone.now, verbose_name="Опубликовать",)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
def __str__(self):
return self.slug
class categories(models.Model):
slug = models.SlugField(max_length=266, unique=True, db_index=True, verbose_name=('SLUG'))
...
published = models.DateTimeField(default=timezone.now, verbose_name="Опубликовать",)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
def __str__(self):
return self.slug
def get_absolute_url(self):
return reverse('categories', kwargs={'categories_slug': self.slug })
class category(models.Model):
slug = models.SlugField(max_length=266, unique=True, db_index=True, verbose_name=('SLUG'))
...
published = models.DateTimeField(default=timezone.now, verbose_name="Опубликовать",)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
cat = models.ForeignKey('categories', on_delete=models.PROTECT, null=True)
def __str__(self):
return self.slug
def get_absolute_url(self):
return reverse('category', kwargs={'categories_slug': self.slug,'category_slug': self.slug, 'post_slug': self.slug})
class post(models.Model):
slug = models.SlugField(max_length=266, unique=True, db_index=True, verbose_name=('SLUG'))
...
published = models.DateTimeField(default=timezone.now, verbose_name="Опубликовать",)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
cat = models.ForeignKey('category', on_delete=models.PROTECT, null=True)
def __str__(self):
return self.slug
def get_absolute_url(self):
return reverse('post', kwargs={'categories_slug': self.slug, 'category_slug': self.slug, 'post_slug': self.slug, })
views
def ContentHome(request):
homepages=home.objects.all()
return render(request, 'content/home.html',{
'home':homepages, })
def categories(request):
categories=categories.objects.all()
return render(request, 'content/categories.html',{
'categories':categories, })
def category(request, category_slug):
category=category.objects.filter( slug=category_slug)
get_list_or_404(categoriy, slug=categoriy_slug)
return render(request, 'content/category.html',{
'category':category,
})
def post(request, category_slug, post_slug):
post = post.objects.filter(slug=post_slug, cat__slug=category_slug)
current_post = get_object_or_404(post, slug=post_slug, cat__slug=category_slug)
previous_post = post.objects.filter(cat__slug=category_slug, pk__lt=current_post.pk).order_by('-pk').first()
next_post = post.objects.filter(cat__slug=category_slug, pk__gt=current_post.pk).first()
return render(request, 'content/post.html', {
'post': post,
'current_post': current_post,
'previous_post': previous_post,
'next_post': next_post,
'post':current_post,
})
May URL
...
from django.contrib.sitemaps.views import sitemap
from content.sitemaps import Sitemap
sitemaps={
'pagese3': Sitemap3,
'pagese2': Sitemap2,
'pagese1': Sitemap1,
'pagese': Sitemap,
}
path('', views.ContentHome, name='homepage'),
path('categories', views.categories, name='categories'),
path('categories/<slug:category_slug>', views.category, name='category-detail'),
path('categories/<slug:category_slug>/<slug:post_slug>', views.post, name='post-detail'),
path('sitemap.xml', sitemap, {'sitemaps': sitemaps}, name='django.contrib.sitemaps.views.sitemap')
sitemaps.py
from django.contrib.sitemaps import Sitemap
from django.http import HttpResponse
from .models import *
class Sitemap3(Sitemap):
changefreq = "weekly"
priority = 0.5
protocol = 'http'
def items(self):
return home.objects.all()
def lastmod(self, obj):
return obj.published
def location(self,obj,):
return (f"/")
class Sitemap2(Sitemap):
changefreq = "weekly"
priority = 0.5
protocol = 'http'
def items(self):
return categories.objects.all()
def lastmod(self, obj):
return obj.published
def location(self,obj,):
return (f"/{obj.slug}/")
class Sitemap1(Sitemap):
changefreq = "weekly"
priority = 0.5
protocol = 'http'
def items(self):
return category.objects.all()
def lastmod(self, obj):
return obj.published
def location(self,obj,):
return (f"/{obj.cat.slug}/{obj.slug}")
class Sitemap(Sitemap):
changefreq = "weekly"
priority = 0.5
protocol = 'http'
def items(self):
return post.objects.all()
def lastmod(self, obj):
return obj.published
def location(self,obj,):
return (f"/categories/{obj.cat.slug}/{obj.slug}")
Выводит страницу - это не правильно:
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml">
<url>
<loc>http://example.com/</loc>
<lastmod>2023-03-11</lastmod>
<changefreq>weekly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>http://example.com/categories/</loc>
<lastmod>2023-03-11</lastmod>
<changefreq>weekly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>http://example.com/categories/category-1</loc>
<lastmod>2023-03-11</lastmod>
<changefreq>weekly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>http://example.com/categories/category-2</loc>
<lastmod>2023-03-11</lastmod>
<changefreq>weekly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>http://example.com/categories/category-1/post-1</loc>
<lastmod>2023-03-11</lastmod>
<changefreq>weekly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>http://example.com/categories/category-1/post-2</loc>
<lastmod>2023-03-11</lastmod>
<changefreq>weekly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>http://example.com/categories/category-1/post-3</loc>
<lastmod>2023-03-11</lastmod>
<changefreq>weekly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>http://example.com/categories/category-2/post-2-1</loc>
<lastmod>2023-03-11</lastmod>
<changefreq>weekly</changefreq>
<priority>0.5</priority>
</url>
</urlset>
Нужно чтоб выводил
<url>
<loc>http://example.com/categories</loc>
<lastmod>2023-03-11</lastmod>
<loc>http://example.com/categories/category-1/</loc>
<lastmod>2023-03-11</lastmod>
<loc>http://example.com/categories/category-1/post-1.</loc>
<lastmod>2023-03-11</lastmod>
<loc>http://example.com/categories/category-1/post-2.</loc>
<lastmod>2023-03-11</lastmod>
<loc>http://example.com/categories/category-2/</loc>
<lastmod>2023-03-11</lastmod>
<loc>http://example.com/categories/category-2/post-2-1.</loc>
<lastmod>2023-03-11</lastmod>
<changefreq>weekly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>http://example.com/category/post-2.</loc>
<lastmod>2023-03-11</lastmod>
<changefreq>weekly</changefreq>
<priority>0.5</priority>
</url>
</urlset>