我想使用 Django 站点地图创建站点特定站点地图。
我的想法是做这样的事情:
def items(self):
current_site = Site.objects.get_current(self.request)
return current_site.pages.filter(draft=False)
但我有两个问题:
self.request
未定义,有没有办法在Sitemap中获取真实的current_site
?current_site
我想,我必须将正确的查询集直接传递到我的站点地图,但我该怎么做?
谢谢,
雷米
您可以通过这种方式传递站点特定的查询集。
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)
要访问 items 方法内的请求对象,您需要覆盖 Django 的默认站点地图索引和站点地图视图。
创建一个站点地图视图文件,其中包含两个覆盖的视图。
from django.contrib.sitemaps.views import index as django_sitemap_index, sitemap as django_sitemap
def sitemap_index(*args, **kwargs):
for key in kwargs.get('sitemaps', {}).keys():
kwargs['sitemaps'][key].request = args[0]
return django_sitemap_index(*args, **kwargs)
def sitemap(*args, **kwargs):
from django.contrib.sitemaps.views import
for key in kwargs.get('sitemaps', {}).keys():
kwargs['sitemaps'][key].request = args[0]
return django_sitemap(*args, **kwargs)
从刚刚创建的文件中导入新的站点地图视图,并在注册 url 时使用它们而不是 Django 的视图。
from .sitemap_views import sitemap_index, sitemap
urlpatterns = [
path(
"sitemap.xml",
sitemap_index, # This is your custom view.
{"sitemaps": sitemaps},
name="django.contrib.sitemaps.views.index",
),
path(
"sitemap-<section>.xml",
sitemap, # This is your custom view.
{"sitemaps": sitemaps},
name="django.contrib.sitemaps.views.sitemap",
),
]
您现在可以从 Sitemap 类的实例方法访问请求对象。
from django.contrib.sitemaps import Sitemap
class CustomSitemap(Sitemap):
def items(self):
# You can now access the request object.
print(self.request)
听起来
sites
框架的使用方式是错误的
sites
框架并不是为了根据请求动态切换站点。它适用于从同一数据库运行的多个单独部署。
第1期:
要修复您的
items()
功能,需要在 SITE_ID
中设置 settings.py
,这可以让 Site.objects.get_current()
在任何地方工作,而不需要 request
对象。
第2期:
域名不应包含在网址中。站点地图是从域请求的,因此已知所有内容都在该域上。
这适用于 django 中的所有 url。要修复此问题,请确保模型上的
get_absolute_url()
方法返回以
"/"
开头的字符串。与域名无关。项目的 url 是使用
get_absolute_url()
或通过使用该项目调用
Sitemap.location()
生成的。 location()
有关 url 应采用何种形式的示例的文档。有关更多信息,请查看此
错误票,关于同一问题。