Встроенная ссылка отображается при жестком кодировании, но не отображается при передаче в качестве переменной

У меня следующая проблема в моем проекте django при попытке отобразить встроенную ссылку на google maps на моей странице. Это работает (отображает iframe Google Maps с заполненной картой), когда я жестко кодирую URL src, но не работает, когда я передаю его в моем контексте, хотя они приводят к одной и той же текстовой строке.

Это мой html detailview.html:

        {% if maps_link is not None %}
          <iframe
            src="https://maps.google.com/maps?q=-28.4457436,21.268374&hl=en&z=14&amp;output=embed"            
            loading="lazy"
            referrerpolicy="no-referrer-when-downgrade"
          ></iframe>
        {% endif %}

URL src, как показано выше, отображается так, как я хочу, но когда я делаю следующее:

        {% if maps_link is not None %}
          <iframe
            src="{{ maps_link }}"    <!-- This gets blocked -->   
            loading="lazy"
            referrerpolicy="no-referrer-when-downgrade"
          ></iframe>
        {% endif %}

тогда мой браузер выдает следующее предупреждение:

Для защиты вашей безопасности www.google.com не позволит Firefox отобразить эту страницу, если она встроена в другой сайт. Чтобы увидеть эту страницу, вам нужно открыть ее в новом окне.

Вот мой views.py, где генерируется контекст. Я пытался обойти это, применяя исключения из xframes, но это ничего не изменило:

from django.views.decorators.clickjacking import xframe_options_exempt
from django.http import Http404, HttpResponse

@xframe_options_exempt
def detail(request, database_reference):
    try:
        obj = Consolidated.objects.get(database_reference=database_reference)
    except Consolidated.DoesNotExist:
        raise Http404("This database object does not exist: " + database_reference)

    context = {
        "content" : content_list,
        "maps_link": obj.location_link
    }

    print(context['maps_link'])
    print(type(context['maps_link']))

    template = loader.get_template("home/detailview.html")
    return HttpResponse(template.render(context, request))

print(context['maps_link']) приводит к https://maps.google.com/maps?q=-25.797944,28.307176&hl=en&z=14&amp;output=embed

и

print(type(context['maps_link'])) приводит к следующему виду <class 'str'>

Таким образом, при выводе значения {{ maps_link }} получается точно такая же строка, как и жестко закодированный URL. Может ли кто-нибудь объяснить мне, почему это происходит (в чем разница между строкой, закодированной в html, и строкой, переданной в качестве параметра), и, что более важно, как я могу это обойти? Спасибо

В HTML символ &amp; автоматически преобразуется в символ &. Поэтому URL

https://maps.google.com/maps?q=-28.4457436,21.268374&hl=en&z=14&amp;output=embed

на самом деле

https://maps.google.com/maps?q=-28.4457436,21.268374&hl=en&z=14&output=embed.

Однако, когда Django выполняет подстановку, он НЕ заменяет специальную последовательность &amp;. Поэтому посещаемый URL будет другим.

Чтобы решить проблему, вы можете произвести замену самостоятельно. Заменить

context = {
    "content" : content_list,
    "maps_link": obj.location_link
}

с

context = {
    "content" : content_list,
    "maps_link": obj.location_link.replace('&amp;', '&')
}

и это должно решить проблему.

Вернуться на верх