Форматирование амперсанда добавляет неожиданные символы

Используя Djoser, я пытаюсь создать правильный URL для моего интерфейса. У меня должен быть амперсанд в строке URL-адреса, и Djoser должен отформатировать этот URL-адрес перед отправкой на мой веб-интерфейс. URL выглядит так:

https://localhost:4200/activate?id=MjA&token=540-cad5f834d5508ebdd78e

Но конечный результат, который я получаю, выглядит как примечание "amp;"после &:

http://localhost:4200/activate?id=MjE&token=541-c0437e0afd6261fd4833

Я пробовал следующие решения, но ни одно из них не работает(\u0026, {\u0026}, {\u0026:c}, &&):

print("https://localhost:4200/activate?id={uid}\u0026token={token}".format(uid="MjA", token="540-cad5f834d5508ebdd78e"))
print("https://localhost:4200/activate?id={uid}{\u0026}token={token}".format(uid="MjA", token="540-cad5f834d5508ebdd78e")) <-- returns KeyError: '&'
print("https://localhost:4200/activate?id={uid}{\u0026:c}token={token}".format(uid="MjA", token="540-cad5f834d5508ebdd78e")) <-- returns KeyError: '&'

ПРИМЕЧАНИЕ: я не могу напрямую изменить код вformat()частично, это будет обрабатываться Djoser. Часть, которую я могу передать, на самом деле только присваивает строковое значение URL активации, как здесь:'ACTIVATION_URL': 'activate?id={uid}{\u0026:c}token={token}',Поэтому я должен написать свое решение в этой строке.

ПРИМЕЧАНИЕ 2: Я попробовал это в Юпитере, там все отлично работает, я получаю правильный URL, когда я делаю это следующим образом:

print("https://localhost:4200/activate?id={uid}\u0026token={token}".format(uid="MjA", token="540-cad5f834d5508ebdd78e"))

Непосредственно добавление & возвращает к интерфейсу тот же URL с amp;позади&

ОБНОВЛЕНИЕ перезаписи шаблона Djoser

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        ...
    },
]

1 ответ

Решение

После некоторых обсуждений выясняется, что Djoser хочет отправить электронное письмо с кодом активации, а содержимое создается из шаблона Django. Проблема в том, что Django по умолчанию выполняет экранирование HTML, поэтому & символ преобразуется в сущность HTML, &amp;что не то, что здесь желательно.

Ответ заключается в том, чтобы пометить URL как безопасный HTML, пропустив его через фильтр. Это фактически означает замену {{ url }} с {{ url|safe }}, Лучший способ сделать это - создать новый шаблон, который переопределит шаблон, предоставленный Djoser, и вставить необходимый контент. Этот шаблон должен находиться в области шаблонов проекта как "email/ активации.html". В Django есть некоторая документация о том, как это сделать тоже.

Как только шаблон работает правильно, URL-адрес должен генерироваться напрямую, без экранирования.

Другие вопросы по тегам