django 启用sitemap.xml
2022-10-09 # django

这个还是看官方的说明比较好,https://docs.djangoproject.com/zh-hans/4.1/ref/contrib/sitemaps/#creating-a-sitemap-index 其他的教程就是断章取义,看着反而更晕了。我自己来总结下。

首先要在项目的settings 里注册下django.contrib.sitemaps。

1
2
3
INSTALLED_APPS = [    
...
'django.contrib.sitemaps',]

然后我把代码先都复制过来分析下来,慢慢研究

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
from django.contrib.sitemaps import GenericSitemap
from django.contrib.sitemaps.views import sitemap
from django.contrib import sitemaps
from docu_web.models import Documentary
from django.urls import reverse

doc_dict = { #如果用GenericSitemap的快捷方法则没有 location 方法,但你可以在models中添加get_absolute_url() 方法。默认情况下,location() 调用每个对象的 get_absolute_url() 并返回结果。
'queryset': Documentary.objects.all()[1:100],
'date_field': 'updated',
}

class StaticViewSitemap(sitemaps.Sitemap): #生成一个sitemap类
priority = 0.5
changefreq = 'daily'

def items(self):
return ['index']
#items() 是一个返回 sequence 或 QuerySet 对象的方法。返回的对象将被传递给对应于站点地图属性的任何可调用方法(location,lastmod,changefreq 和 priority)。

def location(self, item):
return reverse(item)


urlpatterns = [
path('admin/', admin.site.urls),
path('', views.index, name='index'),
path('subject/<int:id>/', views.subject, name='subject'),
path('list/', views.list, name='list'),
path('director/<int:id>/', views.director, name='director'),
path('sitemap.xml', sitemap, {'sitemaps': {'doc': GenericSitemap(doc_dict, priority=0.6, changefreq='monthly') ,'static':StaticViewSitemap}}, name='django.contrib.sitemaps.views.sitemap'), #这个要写到最后
]

get_absolute_url 方法如下,加在 class Documentary(models.Model): 里

1
2
3
4
# 为sitemap类返回网址
def get_absolute_url(self):
from django.urls import reverse
return reverse('subject', args=(self.id,))