Встроенная ссылка отображается при жестком кодировании, но не отображается при передаче в качестве переменной
У меня следующая проблема в моем проекте 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&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&output=embed
и
print(type(context['maps_link']))
приводит к следующему виду <class 'str'>
Таким образом, при выводе значения {{ maps_link }} получается точно такая же строка, как и жестко закодированный URL. Может ли кто-нибудь объяснить мне, почему это происходит (в чем разница между строкой, закодированной в html, и строкой, переданной в качестве параметра), и, что более важно, как я могу это обойти? Спасибо
В HTML символ &
автоматически преобразуется в символ &
. Поэтому URL
https://maps.google.com/maps?q=-28.4457436,21.268374&hl=en&z=14&output=embed
на самом деле
https://maps.google.com/maps?q=-28.4457436,21.268374&hl=en&z=14&output=embed
.
Однако, когда Django выполняет подстановку, он НЕ заменяет специальную последовательность &
. Поэтому посещаемый URL будет другим.
Чтобы решить проблему, вы можете произвести замену самостоятельно. Заменить
context = {
"content" : content_list,
"maps_link": obj.location_link
}
с
context = {
"content" : content_list,
"maps_link": obj.location_link.replace('&', '&')
}
и это должно решить проблему.