Django sitemap框架报错:ArticleSitemap类型对象无filter属性如何解决
问题原因
你混用了Django Sitemap的两种使用方式,触发了报错:
GenericSitemap的queryset参数需要接收Django模型的查询集对象,你传入了自定义的ArticleSitemap类,该类本身没有filter方法,因此抛出AttributeError。- 另外你的
ArticleSitemap类里的时间方法名写错了,Django约定的回调名是lastmod而非lastmodified,写错会导致站点地图里的最后更新时间不生效。
修复步骤
1. 优先使用已定义的自定义Sitemap(推荐)
你已经在sitemaps.py里配置了更新频率、优先级、最后更新时间规则,直接用它即可,修改urls.py代码:
from django.urls import path from django.contrib.sitemaps.views import sitemap from MArticles.sitemaps import ArticleSitemap app_name='MArticles' urlpatterns = [ path('sitemap.xml', sitemap, {'sitemaps': {'blog': ArticleSitemap}}, name='django.contrib.sitemaps.views.sitemap'), # 其余原有路由保持不变 path('articles/',article,name="articles"), path('article_detail/<int:pk>/<slug:slug>/',article_detail,name="article_detail"), path('articles/tag/<slug:slug>/', articletags, name="article-tags"), ]
2. 修复ArticleSitemap的方法名
修改sitemaps.py里的方法名:
from django.contrib.sitemaps import Sitemap from .models import Article class ArticleSitemap(Sitemap): changefreq = "weekly" priority = 0.8 def items(self): return Article.modelmanager.all() # 把原来的lastmodified改成标准名lastmod def lastmod(self, obj): return obj.last_updated
(可选)如果你确实想用GenericSitemap的写法,就把info_dict的queryset改成文章查询集即可,不过这种方式会丢失你自定义的更新频率、最后更新时间配置,不推荐:
info_dict = { 'queryset': Article.modelmanager.all(), }
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

