Как получить домен в шаблоне 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"]
Вернуться на верх