Comment obtenir le nom de domaine de mon site actuel à partir d'un modèle Django ? J'ai essayé de regarder dans la balise et les filtres mais rien n'y fait.
Réponses
Trop de publicités?Comme la réponse de l'utilisateur panchicore, voici ce que j'ai fait sur un site web très simple. Il fournit quelques variables et les rend disponibles sur le modèle.
SITE_URL
contiendrait une valeur comme example.com
SITE_PROTOCOL
contiendrait une valeur comme http
o https
SITE_PROTOCOL_URL
contiendrait une valeur comme http://example.com
o https://example.com
SITE_PROTOCOL_RELATIVE_URL
contiendrait une valeur comme //example.com
.
module/context_processors.py
from django.conf import settings
def site(request):
SITE_PROTOCOL_RELATIVE_URL = '//' + settings.SITE_URL
SITE_PROTOCOL = 'http'
if request.is_secure():
SITE_PROTOCOL = 'https'
SITE_PROTOCOL_URL = SITE_PROTOCOL + '://' + settings.SITE_URL
return {
'SITE_URL': settings.SITE_URL,
'SITE_PROTOCOL': SITE_PROTOCOL,
'SITE_PROTOCOL_URL': SITE_PROTOCOL_URL,
'SITE_PROTOCOL_RELATIVE_URL': SITE_PROTOCOL_RELATIVE_URL
}
paramètres.py
TEMPLATE_CONTEXT_PROCESSORS = (
...
"module.context_processors.site",
....
)
SITE_URL = 'example.com'
Ensuite, sur vos modèles, utilisez-les comme suit {{ SITE_URL }}
, {{ SITE_PROTOCOL }}
, {{ SITE_PROTOCOL_URL }}
y {{ SITE_PROTOCOL_RELATIVE_URL }}
Vous pouvez utiliser request.build_absolute_uri()
Par défaut, il renvoie un chemin complet.
Mais si vous passez un paramètre comme celui-ci :
request.build_absolute_uri('/')
Cela renvoie le nom de domaine.
Que pensez-vous de cette approche ? Elle fonctionne pour moi. Elle est également utilisée dans django-registration .
def get_request_root_url(self):
scheme = 'https' if self.request.is_secure() else 'http'
site = get_current_site(self.request)
return '%s://%s' % (scheme, site)
Je pense que ce que nous voulons, c'est une alternative à l'existant. url
alors j'ai écrit une nouvelle balise :
from django.template import Library
from django.urls import reverse
@register.simple_tag(takes_context = True)
def fullURL(context, name, *args, **kwargs):
request = context['request']
return f'{request.scheme}://{request.get_host()}{reverse(name, args = args, kwargs = kwargs)}'
Ensuite, dans votre modèle, vous pouvez avoir ceci...
{% extends "myapp/email/email_base.html" %}
{% load mytags %} {# Replace mytags with whatever the name of your custom tags calss is. #}
{% block content %}
<p>You can use <a href="{% fullURL 'signup' %}">this link</a> to get started with your account. We look forward to seeing you soon!</p>
{% endblock content %}
Ensuite, lorsque vous générez ce fichier, vous devez simplement vous rappeler de passer le paramètre request
dans le context
comme ça...
from django.template.loader import render_to_string
def sendEmail(subject, to, template, **context):
html = render_to_string(f'myapp/email/{template}.html', context | {'subject': subject})
# ... and so on with the rest of my function for sending email...