Карты сайта Django без связанного объекта (только представление)

Я настраиваю некоторые карты сайта Django. Это работает очень хорошо для всех объектов, которые у меня есть, но мне любопытно, как мне это сделать, если я хочу поместить в карту сайта что-то, с чем не связан ни один объект.

Например, у меня есть список категорий, и я могу просто вернуть набор запросов всех категорий. URL-адреса будут иметь вид example.com/cats/12 или что-то еще. У меня также есть своего рода псевдокорневая категория, которая не связана с объектом категории. Эта страница (example.com/cats/) представляет собой просто представление, включающее все подкатегории без родителя и список продуктов. Дело в том, что я не могу использовать get_absolute_url, потому что нет "корневого" объекта. Мое решение состояло в том, чтобы получить набор запросов в виде списка, добавить объект «Нет», а затем получить соответствующий URL-адрес:

class CatsSitemap(Sitemap):
    changefreq = "weekly"
    priority = 0.4

    def items(self):
        cats = list(Category.objects.all())
        cats.append(None)
        return cats

    def location(self, obj):
        if(obj != None):
            return reverse('cats_sub_category', args=[obj.pk])
        else:
            return reverse('cats_root')

Кто-нибудь видит в этом проблему? Будет ли возвращение их в виде списка убивать производительность? На самом деле у нас будет, возможно, сотни категорий, но, вероятно, не намного больше. Перебор?


person CaptainThrowup    schedule 11.08.2010    source источник


Ответы (2)


Возможно, я нашел лучший способ сделать это, который, безусловно, будет полезен в будущем с другими именованными представлениями, у которых нет связанных объектов. В файле sitemaps.py поместите:

class NamedURLSitemap(Sitemap):
    priority = 1.0
    changefreq = "daily"

    def __init__(self, names):
        self.names = names

    def items(self):
        return self.names

    def lastmod(self, obj):
        return datetime.datetime.now()

    def location(self, obj):
        return reverse(obj)

И в urls.py поместите:

'cat-roots': NamedURLSitemap(['cats_root']),

Это упрощает код Sitemap для категорий:

class CatsSitemap(Sitemap):
    changefreq = "weekly"
    priority = 0.4

    def items(self):
        return Category.objects.all()

    def location(self, obj):
        return reverse('cats_sub_category', args=[obj.pk])

Любое мнение об этом или предыдущем решении?

person CaptainThrowup    schedule 11.08.2010
comment
Мне кажется, неплохое решение. Вы должны увидеть, что это включено в модуль карты сайта django, я думаю, что это довольно универсально полезно. Я не уверен в использовании datetime.datetime.now() в качестве временной метки lastmod. - person Chris Lawlor; 23.08.2010
comment
Тем не менее, вы можете сделать параметры «priority» и «changefreq» для init, чтобы поддерживать добавление нескольких именованных страниц с разными приоритетами и changefreqs. - person Chris Lawlor; 23.08.2010

Небольшое улучшение вашего ответа, которое включает приоритет и частоту изменений для каждой страницы как часть списка, переданного в init:

class NamedURLSitemap(Sitemap):

    def __init__(self, pages):
        """
        Parameters:
        ``pages``
            A list of three-tuples containing name, priority, and changefreq:

            e.g. [('home', 0.5, 'daily'), ('search', 0.5, 'never')]
        """
        self.pages = pages

    def items(self):
        return self.pages

    def lastmod(self, obj):
        return datetime.datetime.now()

    def location(self, obj):
        return reverse(obj[0])

    def priority(self, obj):
        return obj[1]

    def changefreq(self, obj):
        return obj[2]
person Chris Lawlor    schedule 23.08.2010