Django Sitemaps:仅获取当前网站的页面

问题描述 投票:0回答:3

我想使用 Django 站点地图创建站点特定站点地图。

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

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

但我有两个问题:

  1. self.request
    未定义,有没有办法在Sitemap中获取真实的
    current_site
  2. 商品网址不正确,应该从右边开始
    current_site

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

谢谢,

雷米

django django-models django-sites django-sitemaps
3个回答
0
投票

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

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)

0
投票

覆盖视图

要访问 items 方法内的请求对象,您需要覆盖 Django 的默认站点地图索引和站点地图视图。

sitemap_views.py

创建一个站点地图视图文件,其中包含两个覆盖的视图。

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.py

从刚刚创建的文件中导入新的站点地图视图,并在注册 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",
    ),
]

站点地图.py

您现在可以从 Sitemap 类的实例方法访问请求对象。

from django.contrib.sitemaps import Sitemap

class CustomSitemap(Sitemap):

    def items(self):
        # You can now access the request object.
        print(self.request)

-3
投票

听起来

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 应采用何种形式的示例的文档。

有关更多信息,请查看此

错误票,关于同一问题。

© www.soinside.com 2019 - 2024. All rights reserved.