我所看到的所有在Django中生成站点地图的示例似乎都在模型上进行迭代,从而以这种方式生成URL。
例如,来自Django文档:
class BlogSitemap(Sitemap):
changefreq = "never"
priority = 0.5
def items(self):
return Entry.objects.filter(is_draft=False)
def lastmod(self, obj):
return obj.pub_date
我无法通过Web应用程序执行此操作。我有成千上万个与产品页面相对应的URL,这些URL是使用django根据从直接插入到postgres数据库中的API检索的数据生成的。
因此,我正在使用django从数据库中检索记录并调整它们的显示方式,但是我拥有的URL不对应于任何django模型(这将在以后进行改进和更改)。 / p>
那么有没有一种方法可以在站点地图中指定特定的URL而无需遍历模型?
答案 0 :(得分:1)
items()
可以返回任何python对象,它不必是Django模型。默认情况下,每个对象都传递给location
方法,该方法应返回对象的URL(在Django模型上,它使用get_absolute_url()
方法)。
因此,基本上,如果您有一个python类定义要在站点地图中显示的每个“页面”(它可以是一个字符串,也可以是字符串的元组),然后定义一个方法来返回网址该页面,您只需要在location()
中调用该方法即可覆盖默认行为。
items
也可以只是在URL路径中使用的字符串列表。然后location()
将reverse()
与这些字符串一起使用。假设您的产品页面网址使用的正则表达式如下:
path('products/<str:category>/<str:name>', name='product')
,然后在items()
中返回字典列表:
return [{'category': cat, 'name': name} for cat, name in product_searches]
然后您的location(item)
函数将需要返回:
return reverse('product', kwargs={'category': item.category, 'name': item.name})
有关更多详细信息,请参阅docs