1

我看到的所有在 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

我的网络应用程序无法做到这一点。我有数千个对应于产品页面的 URL,这些 URL 是使用 django 生成的,基于从直接插入 postgres 数据库的 API 检索的数据。

所以,我正在使用 django 从数据库中检索记录并确定它们的呈现方式,但是我拥有的 URL 不对应于任何 django 模型(这将在未来进行改进和更改)。

那么有没有一种方法,我可以在站点地图中指定特定的 URL 而无需遍历模型?

4

1 回答 1

1

items()可以返回任何 python 对象,它不需要是 Django 模型。默认情况下,每个对象都被传递给location方法,该方法应该返回对象的 URL(在 Django 模型上,它使用get_absolute_url()方法)。

所以基本上,如果你有一个 python 类,它定义了你想在站点地图中显示的每个“页面”(它可能只是一个字符串,也可以是一个字符串元组),并且你定义了一个方法来返回该页面的 URL,您只需要调用该方法location()即可覆盖默认行为。

items也可以只是您将在 url 路径中使用的字符串列表。然后location()reverse()与这些字符串中的每一个一起使用。例如,您的产品页面 url 使用如下正则表达式:

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}) 

有关更多详细信息,请参阅文档

于 2019-03-29T10:11:15.347 回答