Карта сайта Django без связанного объекта (только вид) - PullRequest
3 голосов
/ 11 августа 2010

Я настраиваю некоторые карты сайта 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')

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

Ответы [ 2 ]

1 голос
/ 23 августа 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]
1 голос
/ 11 августа 2010

Может быть, я нашел лучший способ сделать это, что, безусловно, будет полезно в будущем с другими именованными представлениями, у которых нет связанных объектов. В 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])

Есть мнение по поводу того или иного решения?

...