我有以下模型关系:
class Section(models.Model):
section = models.CharField(max_length=200, unique=True)
name = models.CharField(max_length=200, blank = True)
class Article (models.Model):
url = models.CharField(max_length = 30, unique=True)
is_published = models.BooleanField()
section = models.ForeignKey(Section)
我需要为文章创建一个站点地图,其中包含部分的站点地图文件。我在这里阅读关于它的django文档http://docs.djangoproject.com/en/dev/ref/contrib/sitemaps/
但是没有设法找到答案我怎么能:
答案 0 :(得分:6)
如果我理解正确,你想使用站点地图索引,它指向每个部分的单独的站点地图xml文件。
Django通过providing a separate sitemap view为索引站点地图支持此功能。
之前没有使用过该功能,但以下内容可能适用于您的情况。
### sitemaps.py
from django.contrib.sitemaps import GenericSitemap
from models import Section
all_sitemaps = {}
for section in Section.objects.all():
info_dict = {
'queryset': section.article_set.filter(is_published=True),
}
sitemap = GenericSitemap(info_dict,priority=0.6)
# dict key is provided as 'section' in sitemap index view
all_sitemaps[section.name] = sitemap
### urls.py
from sitemaps import all_sitemaps as sitemaps
...
...
...
urlpatterns += patterns('',
(r'^sitemap.xml$', 'django.contrib.sitemaps.views.index', {'sitemaps': sitemaps}),
(r'^sitemap-(?P<section>.+)\.xml$', 'django.contrib.sitemaps.views.sitemap', {'sitemaps': sitemaps}),
)
答案 1 :(得分:1)
对我来说,接受的答案是影响开发和测试周期速度,因为它使python manage.py
命令运行得更慢 - 我在数据库中做了一些比这个例子更多的事情。
以下是我为缓解而做出的更改(适用于该示例)。尚未对它进行战斗测试,但这似乎可以解决问题(Python3):
### sitemaps.py
class SitemapLookup():
"""
Instantiated class replaces the dictionary of {'sitemap-section': Sitemap} for urls.py
Speeds up application load time by only querying the DB when a sitemap is first requested.
"""
def __init__(self):
self.sitemaps = {}
def __iter__(self):
self._generate_sitemaps_dict()
return self.sitemaps.__iter__()
def __getitem__(self, key):
self._generate_sitemaps_dict()
return self.sitemaps[key]
def items(self):
self._generate_sitemaps_dict()
return self.sitemaps.items()
def _generate_sitemaps_dict(self):
if self.sitemaps:
return
for section in Section.objects.all():
info_dict = {
'queryset': section.article_set.filter(is_published=True),
}
# dict key is provided as 'section' in sitemap index view
self.sitemaps[section.name] = GenericSitemap(info_dict, priority=0.6)
### urls.py
from sitemaps import SitemapLookup
...
...
...
sitemaps = SitemapLookup()
urlpatterns += patterns('',
(r'^sitemap.xml$', 'django.contrib.sitemaps.views.index', {'sitemaps': sitemaps}),
(r'^sitemap-(?P<section>.+)\.xml$', 'django.contrib.sitemaps.views.sitemap', {'sitemaps': sitemaps}),
)
答案 2 :(得分:0)
Django==2.2
Python==3.6
这是在Django中使用站点地图索引的更好,更简便的方法,
将django.contrib.sitemaps
安装到项目中,方法是将其添加到INSTALLED_APPS
的{{1}}中。
在您的应用中编写sitemaps.py文件,并根据需要定义类。在 settings.py
网站地图类中扩展django.contrib.sitemap.Sitemap
的示例,以获取静态URL,请确保您所有的静态URL都具有StaticViewSitemap
查找的名称(从URL名称获取URL)< / p>
reverse
将所有站点地图导入urls.py
从# app/sitemap.py
from django.contrib import sitemaps
from django.urls import reverse
class StaticViewSitemap(sitemaps.Sitemap):
priority = 0.6
changefreq = 'monthly'
def items(self):
# URLs names
return ['index', 'aboutus', 'ourstory',]
def location(self, item):
return reverse(item)
导入站点地图和索引
然后用站点地图创建字典
django.contrib.sitemaps.views
这里您将拥有两个站点地图1. sitemaps.xml 2. sitemaps-static.xml 运行服务器打开的URL:http://localhost:8000/sitemap.xml
# urls.py
from django.contrib.sitemaps.views import sitemap, index
from app.sitemaps import StaticViewSitemap
# add as many as sitemap you need as one key
sitemaps = {
"static" : StaticViewSitemap,
}
urlpatterns = [
# sitemap.xml index will have all sitemap-......xmls index
path('sitemap.xml', index, {'sitemaps': sitemaps}, name='django.contrib.sitemaps.views.index'),
# sitemap-<section>.xml here <section> will be replaced by the key from sitemaps dict
path('sitemap-<section>.xml', sitemap, {'sitemaps': sitemaps}, name='django.contrib.sitemaps.views.sitemap'),
]
Django现在自动创建了站点地图索引,现在打开URL:http://127.0.0.1:8000/sitemap-static.xml
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<sitemap>
<loc>http://127.0.0.1:8000/sitemap-static.xml</loc>
</sitemap>
</sitemapindex>