Как получить домен в шаблоне django
Я пытаюсь создать ссылку для отписки в шаблоне письма, но проблема в том, что я использую отдельную функцию в моем файле utilites.py для рендеринга шаблона и не имею доступа к запросу. Эта функция вызывается планировщиком в бэкенде. Я пробовал request.build_absolute_uri и другие вещи, но не смог создать ссылку на отписку
шаблоны
<body>
<section class="tour section-wrapper container" id="notify-form">
<table id='datatable'></table>
{{ content|safe }}
{# <a href="{{ request.build_absolute_uri}}{% url 'delete' %}?email={{ sub_email }}">Unsubscribe</a>#}
{# <a href="{% if request.is_secure %}https:/{% else %}http:/{% endif %}{{ request.get_host }}{{ request.build_absolute_uri }}{{ object.get_absolute_url }}{% url 'delete' %}?email={{ sub_email }}">Unsubscribe</a>#}
<a href="{% if request.is_secure %}https://{% else %}http://{% endif %}{{ domain }}{% url 'delete' %}?email={{ sub_email }}">Unsubscribe</a>
</section> <!-- /.tour </body> -->
прокомментированный код - это то, что я пробовал пробовал использовать Sites framework, но это дает doamin как example.com, а не то, что я ожидал
метод утилиты
def send_notification(dataframe, email):
subject = 'That’s your subject'
from_email = 'xxxx@gmail.com' # 'from@example.com'
text_content = 'That’s your plain text.'
subscriber_email = QueryDetails.objects.get(email=email)
domain = Site.objects.get_current().domain
html_content = get_template('mail_template.html').render({'content': dataframe.to_html(classes=["table-bordered", "table-striped", "table-hover"]),'sub_email': subscriber_email, 'domain': domain})
Ожидаемый результат, если в локальном домене будет http://127.0.0.1/unsub/?email=xxxx@gmail.com если в производстве, то http://whateverproductiondomain.com/unsub/?email=xxxx@gmail.com
Но если я запускаю программу с одним из закомментированных кодов в шаблоне, то генерируется url /unsub/email=xxxx@gmail.com. а с Sites framework это http://example.com/unsub/?email=xxxx@gmail.com. Есть предположения как это сделать, send_notification не вызывается из views, поэтому не может передать запрос в него.
Я сделал это с SITE_URL='http://127.0.0.1/' в settings.py (у вас разные настройки в production и в development)
поэтому вам нужно передать его в шаблон:
from app.settings import SITE_URL
def send_notification(dataframe, email):
subject = 'That’s your subject'
from_email = 'xxxx@gmail.com' # 'from@example.com'
text_content = 'That’s your plain text.'
subscriber_email = QueryDetails.objects.get(email=email)
domain = SITE_URL
html_content = get_template('mail_template.html').render({'content': dataframe.to_html(classes=["table-bordered", "table-striped", "table-hover"]),'sub_email': subscriber_email, 'domain': domain})
А в шаблоне:
<a href="{{ domain }}{% url 'delete' %}?email={{ sub_email }}">Unsubscribe</a>
Чтобы получить его динамически, вы можете использовать request.get_host()
.
Например, в функции представления вы можете передать ее в контекст с помощью context['host'] = request.get_host()
и вызвать переменную в шаблонах с помощью {{ host }}
.
Когда я запускаю его локально, я получаю 'localhost:8000', а когда на производстве, я получаю, например, 'domain.com'. Затем вы можете рассматривать его как строку, чтобы добавить или дополнить этот URL тем, что вам нужно, чтобы сделать его полезным (например, добавить http://
впереди или /whatever/path
сзади).
Я предпочитаю этот способ, а не альтернативный, например, жесткое кодирование имени домена в переменной окружения и вызов ее, потому что это более муторно в управлении.
Пропустить его через функцию просмотра
domain = request.META["HTTP_HOST"]