2010-08-11 1 views
3

Я настраиваю некоторые файлы Sitemap Django. Он отлично работает для всех объектов, которые у меня есть, но мне интересно, как я должен это делать, если я хочу что-то помещать в карту сайта, у которой нет объекта, связанного с ней.Django sitemaps без связанного объекта (только вид)

Например, у меня есть список категорий, и я могу просто вернуть набор запросов для всех категорий. URL-адреса будут example.com/cats/12 или что у вас есть. У меня также есть своего рода псевдо-корневая категория, которая не связана с объектом категории. Эта страница (example.com/cats/) - это просто представление, которое включает все дочерние категории без родителя и список продуктов. Точка, я не могу использовать get_absolute_url, потому что нет «корневого» объекта. Мое решение было получить QuerySet как список, добавить «None» объект, а затем получить соответствующий 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') 

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

ответ

1

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

Любое мнение по этому вопросу или первое решение?

+0

Кажется довольно хорошим решением для меня. Вы должны видеть, что это включено в модуль sitemaps для django, я думаю, что это довольно универсально полезно. Я не уверен в использовании datetime.datetime.now() как timestamp lastmod, хотя –

+0

Вы можете сделать параметры «priority» и «changefreq» для __init__, хотя, чтобы поддерживать добавление нескольких именованных страниц с разными приоритетами и changefreqs –

1

Незначительное улучшение вашего ответа, который включает в себя приоритет и ChangeFreq для каждой страницы, как часть списка, переданного 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]