没有关联对象的Django站点地图(只是一个视图)

时间:2010-08-11 03:35:01

标签: django django-urls sitemap

我正在设置一些Django站点地图。它对我拥有的所有对象都非常有效,但是如果我想在没有与之关联的对象的站点地图中放置一些东西,我很好奇我应该怎么做。

例如,我有一个类别列表,我只能返回所有类别的查询集。网址是example.com/cats/12或者你有什么。我还有一种与类别对象无关的伪根类别。该页面(example.com/cats/)只是一个包含所有没有父项的子类别和产品列表的视图。点是,我不能使用get_absolute_url,因为没有“root”对象。我的解决方案是将查询集作为列表,添加“无”对象,然后获取相应的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 个答案:

答案 0 :(得分: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])

对此或前一种解决方案的任何意见?

答案 1 :(得分: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]