使用站点框架生成 Django 站点地图
Generate Django sitemap while using site framework
我正在使用带有 RequestSite
(未设置 SITE_ID
)的站点框架来生成基于域的内容。我需要为每个域生成具有不同结果的站点地图,但我没有找到使这两个框架协同工作的方法。有没有办法在Sitemap
中获取当前请求的Site
? (从 SITE_ID
配置中获取它对我来说不是一个选项)。
这是我想做的一个例子:
from django.contrib.sitemaps import Sitemap
from blog.models import Entry
class BlogSitemap(Sitemap):
def items(self, request):
return Entry.objects.filter(is_draft=False, site=request.site)
但这是不可能的,因为items()
中没有request
。有没有其他方法可以根据站点过滤站点地图中的项目?
试试下面的例子:
from django.contrib.sitemaps import Sitemap
from django.contrib.sitemaps.views import sitemap
from blog.models import Entry
class BlogSitemap(Sitemap):
_cached_site = None
def items(self):
return Entry.objects.filter(is_draft=False, site=self._cached_site)
def get_urls(self, page=1, site=None, protocol=None):
self._cached_site = site
return super(BlogSitemap, self).get_urls(page=page, site=site, protocol=protocol)
并且在urls.py
urlpatterns = [
url('sitemap.xml', sitemap, {
'sitemaps': {'blog': BlogSitemap}
}, name='django.contrib.sitemaps.views.sitemap'),
# ...
# other your urls
]
现在应该可以了。如果您有任何问题,请告诉我。
我正在使用带有 RequestSite
(未设置 SITE_ID
)的站点框架来生成基于域的内容。我需要为每个域生成具有不同结果的站点地图,但我没有找到使这两个框架协同工作的方法。有没有办法在Sitemap
中获取当前请求的Site
? (从 SITE_ID
配置中获取它对我来说不是一个选项)。
这是我想做的一个例子:
from django.contrib.sitemaps import Sitemap
from blog.models import Entry
class BlogSitemap(Sitemap):
def items(self, request):
return Entry.objects.filter(is_draft=False, site=request.site)
但这是不可能的,因为items()
中没有request
。有没有其他方法可以根据站点过滤站点地图中的项目?
试试下面的例子:
from django.contrib.sitemaps import Sitemap
from django.contrib.sitemaps.views import sitemap
from blog.models import Entry
class BlogSitemap(Sitemap):
_cached_site = None
def items(self):
return Entry.objects.filter(is_draft=False, site=self._cached_site)
def get_urls(self, page=1, site=None, protocol=None):
self._cached_site = site
return super(BlogSitemap, self).get_urls(page=page, site=site, protocol=protocol)
并且在urls.py
urlpatterns = [
url('sitemap.xml', sitemap, {
'sitemaps': {'blog': BlogSitemap}
}, name='django.contrib.sitemaps.views.sitemap'),
# ...
# other your urls
]
现在应该可以了。如果您有任何问题,请告诉我。