2012-03-22 56 views
2

我想使用Django站点地图创建站点特定的站点地图。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. 的项目URL是不正确的,应该用正确的current_site

我想,我必须直接向右查询集传递给我的网站地图开始,但我怎么能做到这一点?

感谢,

雷米

+0

为什么你将'self.request'传递给'get_current'方法?只需调用'Site.objects。get_current()'这会给你当前的网站! – Ahsan 2012-05-14 06:48:30

回答

1

您可以通过这种方式传递网站具体查询集。

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

by_site是的YourModel管理器功能,

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) 
+1

是的,但在这种情况下,Site.objects.get_current()将返回settings.SITE_ID而不是RequestSite – Natim 2012-06-05 08:29:14

-1

这听起来像sites框架正在使用的sites框架不打算动态切换为基础的网站走错了路

请求。它用于从同一数据库运行的多个单独部署。

问题1:

要解决你的items()功能,SITE_ID需要在settings.py其中任何地方可以让Site.objects.get_current()工作进行设置,而无需request对象。

问题2:

域名应该列入的URL。网站地图是从域中请求的,因此所有信息都在该域中。

这适用于django内的所有网址。

要解决该问题,请确保模型上的get_absolute_url()方法返回一个以"/"开头的字符串。不涉及域名。

产品的网址是通过get_absolute_url()或通过致电Sitemap.location()产生的。有关location()有关URL的内容的示例的文档

欲了解更多信息,请查看此bug ticket,大约相同的问题。

+0

实际上,我正在使用'Site'作为我的SaaS需要的方式。但我认为使用'SITE_ID'只是使用这个contrib应用程序的简单方法。 – Natim 2012-05-14 11:16:28

+0

'SITE_ID'是使用'contrib.sites'的**方法。当不使用'contrib.sites'时,另一个'RequestSite' /'get_current_site(request)'只是一个便利的回退。 如果您想以这种方式使用它,您必须重写“Sitemap”类中的某些方法,这可能会在未来发生变化和破坏。 – 2012-05-14 12:33:27

+0

好的,我也可以分发Sitemap应用程序并创建一个可以工作的程序。 – Natim 2012-05-14 15:37:17