206 votes

Comment puis-je obtenir le nom de domaine de mon site dans un modèle Django ?

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.

6voto

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 }}

5voto

Kyle.Ng Points 56

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.

4voto

Dos Points 533

Dans un modèle Django, vous pouvez faire :

<a href="{{ request.scheme }}://{{ request.META.HTTP_HOST }}{{ request.path }}?{{ request.GET.urlencode }}" >link</a>

1voto

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)

1voto

ArtOfWarfare Points 2345

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...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X