La forma normal en que se usa el mapa del sitio en Django es:
from django.contrib.sitemaps import Sitemap from schools.models import School class SchoolSitemap(Sitemap): changefreq = "weekly" priority = 0.6 def items(self): return School.objects.filter(status = 2)y luego en el modelo de Escuela definimos:
def get_absolute_url(self): return reverse('schools:school_about', kwargs={'school_id': self.pk})En dicha implementación, tengo un enlace Acerca de para una escuela en sitemap.xml
El problema es que mi escuela tiene varias páginas: Acerca de, Profesores, Alumnos y otras, y me gustaría que todas se muestren en sitemap.xml
¿Cuál es el mejor enfoque para hacerlo?
Puede trabajar con el hecho de que los items pueden devolver cualquier cosa que se pueda pasar a los otros métodos de un Sitemap :
import itertools class SchoolSitemap(Sitemap): # List method names from your objects that return the absolute URLs here FIELDS = ("get_absolute_url", "get_about_url", "get_teachers_url") changefreq = "weekly" priority = 0.6 def items(self): # This will return you all possible ("method_name", object) tuples instead of the # objects from the query set. The documentation says that this should be a list # rather than an iterator, hence the list() wrapper. return list(itertools.product(SchoolSitemap.FIELDS, School.objects.filter(status = 2))) def location(self, item): # Call method_name on the object and return its output return getattr(item[1], item[0])() Si el número y los nombres de los campos no están predeterminados, optaría por un enfoque completamente dinámico: permita que los modelos tengan un método get_sitemap_urls que devuelva una lista de URL absolutas y use un Sitemap que ejecute este método. Es decir, en el caso más simple en el que no necesita tener acceso a los objetos en los métodos de prioridad/cambiofreq/lastmod:
class SchoolSitemap(Sitemap): changefreq = "weekly" priority = 0.6 def items(self): return list( itertools.chain.from_iterable(( object.get_sitemap_urls() for object in School.objects.filter(status = 2))) ) def location(self, item): return item