﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
32648	New sitemap 'alternates' generation feature is bugged using default values.	Arthur	nobody	"(First time reporting a bug in Django, please be kind)

Hi,

When closing ticket #27395 with the following commit https://github.com/django/django/commit/16218c20606d8cd89c5393970c83da04598a3e04# a bug was added in Django.

If alternates is set to False, or if i18n is disabled on the sitemap, this line https://github.com/django/django/commit/16218c20606d8cd89c5393970c83da04598a3e04#diff-d0316d5baddb3fd017c4a17ac10d784a4668a05ae39bf8a0485ec80da1409c51R189 will not get executed, meaning `url_info` will not have `alternates` set.

Later, when rendering in the template, the inner loop (https://github.com/django/django/commit/16218c20606d8cd89c5393970c83da04598a3e04#diff-a2c649c9d199c72cb1df4204ce54d92a480f4f077e7b423db91ee1ab421895d8R10) will try to access alternates anyway, causing the following stacktrace to be printed


{{{#!python
[DEBUG   ] (base._resolve_lookup) Exception while resolving variable 'alternates' in template 'sitemap.xml'.

Traceback (most recent call last):
  File ""/usr/local/lib/python3.9/site-packages/django/template/base.py"", line 829, in _resolve_lookup
    current = current[bit]
KeyError: 'alternates'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File ""/usr/local/lib/python3.9/site-packages/django/template/base.py"", line 837, in _resolve_lookup
    current = getattr(current, bit)
AttributeError: 'dict' object has no attribute 'alternates'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File ""/usr/local/lib/python3.9/site-packages/django/template/base.py"", line 843, in _resolve_lookup
    current = current[int(bit)]
ValueError: invalid literal for int() with base 10: 'alternates'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File ""/usr/local/lib/python3.9/site-packages/django/template/base.py"", line 848, in _resolve_lookup
    raise VariableDoesNotExist(""Failed lookup for key ""

django.template.base.VariableDoesNotExist: Failed lookup for key [alternates] in {'item': <Item __str__>, 'location': 'https://myurl', 'lastmod': None, 'changefreq': 'always', 'priority': ''}
}}}

A simple fix is the meantime is to redefine the _urls() method in the Sitemap to include the alternates attribute to an empty list : 

{{{#!python
class Sitemap(sitemaps.Sitemap):
    """"""
    Fixes the Exception while resolving variable 'alternates' in template 'sitemap.xml'
    """"""
    def _urls(self, *args, **kwargs):
        urls = super()._urls(*args, **kwargs)

        for url_info in urls:
            url_info['alternates'] = []

        return urls
}}}

That said, the patch is probably a 1-liner, to check if url.alternates exist before using it.
"	Bug	closed	contrib.sitemaps	3.2	Release blocker	fixed	alternates	Carlton Gibson Florian Demmer	Ready for checkin	1	0	0	0	0	0
