我正在设置一些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')
有没有人看到这个问题?将它们作为列表杀死性能返回?实际上,我们可能会有数百个类别,但可能并不多。太多了?
答案 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]