Карта сайта и объект с несколькими URL

Обычный способ использования карты сайта в Django:

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)

а затем в модели школы мы определяем:

  def get_absolute_url(self):
      return reverse('schools:school_about', kwargs={'school_id': self.pk})

В такой реализации у меня есть одна ссылка About для одной школы в sitemap.xml

Проблема в том, что в моей школе есть несколько страниц: «О», «Учителя», «Ученики» и другие, и я хотел бы, чтобы все материалы отображались на сайте sitemap.xml

Как лучше всего это сделать?

16 голосов | спросил Alexander Tyapkov 12 FebruaryEurope/MoscowbSun, 12 Feb 2017 14:11:15 +0300000000pmSun, 12 Feb 2017 14:11:15 +030017 2017, 14:11:15

1 ответ


0

Вы можете работать с тем, что items может вернуть все, что может быть передано другим методам 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])()

Если число и имена полей не определены заранее, я бы выбрал полностью динамический подход: разрешить моделям иметь get_sitemap_urls метод, который возвращает список абсолютных URL-адресов и использует Sitemap, который выполняет этот метод. То есть в простейшем случае, когда вам не нужно иметь доступ к объектам в методах priority /changefreq /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
ответил Phillip 15 FebruaryEurope/MoscowbWed, 15 Feb 2017 13:39:59 +0300000000pmWed, 15 Feb 2017 13:39:59 +030017 2017, 13:39:59

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132