Django Sitemap类alternates属性致sitemap.xml渲染异常
Django StaticViewSitemap启用alternates=True后XML渲染异常的解决方法
问题原因
给StaticViewSitemap添加alternates=True属性后,Django会调用alternate_hreflangs方法生成备用语言URL,但你的items方法返回的是视图名称字符串(比如'index'),代码里却试图访问obj.alternative_object_url——字符串对象不存在该属性,会触发AttributeError,导致XML渲染流程崩溃,最终输出异常的拼接字符串。
修复代码
修改alternate_hreflangs方法,针对视图名称字符串生成对应语言的URL:
from django.urls import reverse from django.contrib import sitemaps class StaticViewSitemap(sitemaps.Sitemap): priority = 0.5 changefreq = 'weekly' protocol = 'https' i18n = True alternates = True def alternate_hreflangs(self, obj): # obj是items返回的视图名称,用reverse生成en-us语言的备用URL return [ ('en-us', reverse(obj, locale='en-us')) ] def items(self): return ['index','about', 'contact', 'why', 'product', 'tender-management', 'e-sourcing', 'network', 'faq'] def location(self, item): return reverse(item)
关键说明
- 因为
items返回的是视图名称而非模型实例,不能通过obj的属性获取URL,必须用reverse配合locale参数生成对应语言的地址。 - 确保Django项目已正确配置国际化支持:添加
LocaleMiddleware中间件、配置LOCALE_PATHS、设置支持的语言列表等,否则reverse的locale参数无法正常工作。 - 若需生成其他语言的备用URL,直接在
alternate_hreflangs的返回列表中添加对应的语言代码和URL即可。
内容的提问来源于stack exchange,提问作者Diego Bianchi
相关产品推荐
相关产品推荐

