【问题标题】:Django Sitemaps : Get only pages of the current websiteDjango Sitemaps:仅获取当前网站的页面
【发布时间】:2012-03-22 07:10:03
【问题描述】:

我想使用 Django 站点地图创建一个特定于站点的站点地图。

我的想法是做这样的事情:

def items(self):
    current_site = Site.objects.get_current(self.request)
    return current_site.pages.filter(draft=False)

但是我有两个问题:

  1. self.request 未定义,有没有办法在站点地图中获取真正的 current_site
  2. 商品的网址不对,应该以正确的current_site开头

我想,我必须将正确的查询集直接传递给我的站点地图,但我该怎么做呢?

谢谢,

雷米

【问题讨论】:

  • 为什么你将self.request 传递给get_current 方法?只需致电 Site.objects.get_current() 这将为您提供当前站点!

标签: django django-models django-sites django-sitemaps


【解决方案1】:

您可以通过这种方式传递特定于站点的查询集。

def items(self):   
  return YourModel.objects.by_site()

by_siteYourModel的经理功能,

def by_site(self, site=None, **kwargs):
    """Get all pages for this site"""
    if not site:
        site = Site.objects.get_current()

    site = site.id

    return self.filter(site__id__exact = site, **kwargs)

【讨论】:

  • 是的,但在这种情况下 Site.objects.get_current() 将返回 settings.SITE_ID 一个而不是 RequestSite
【解决方案2】:

听起来sites 框架的使用方式有误

sites 框架并非旨在根据请求动态切换站点。它适用于从同一数据库运行的多个单独部署。

问题 1:

要修复items() 函数,需要在settings.py 中设置SITE_ID,这样Site.objects.get_current() 可以在任何地方工作,而无需request 对象。

问题 2:

域名应该包含在网址中。站点地图是从域请求的,因此已知所有内容都在该域中。

这适用于 django 中的所有 url。

要修复它,请确保模型上的 get_absolute_url() 方法返回以 "/" 开头的字符串。与域名无关。

使用get_absolute_url() 或通过调用Sitemap.location() 生成项目的网址。 location() 的文档关于 URL 应该采用什么格式的示例。

有关更多信息,请查看此bug ticket,关于同一问题。

【讨论】:

  • 实际上,我使用 Site 的方式是我的 SaaS 所需的。但我认为使用SITE_ID 只是使用这个contrib 应用程序的一种简单方式。
  • SITE_ID 是使用contrib.sites 方式。替代的RequestSite/get_current_site(request) 只是在不使用contrib.sites 时的一种方便后备。如果你想以这种方式使用它,你必须重写 Sitemap 类中的一些方法,这些方法将来可能会改变和中断。
  • 好的,我也可以分叉站点地图应用程序并创建一个可以使用的应用程序。
猜你喜欢
  • 1970-01-01
  • 2014-05-26
  • 2011-05-07
  • 1970-01-01
  • 2012-12-04
  • 2019-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多