Wie erhalte ich die aktuelle URL in einer Django-Vorlage?

309

Ich habe mich gefragt, wie ich die aktuelle URL in einer Vorlage erhalten kann.

Angenommen, meine aktuelle URL lautet:

.../user/profile/

Wie kann ich dies an die Vorlage zurückgeben?

dotty
quelle
3
Mögliches Duplikat des
Lesepfads
2
Alle folgenden Antworten ließen mich denken, dass ich etwas Gymnastik machen musste, um Zugang zu requesteiner Vorlage zu erhalten. In Django 1.10 greife ich einfach auf {{request.path}}die Vorlage zu und es funktioniert. Standardmäßig django.core.context_processors.requestist bereits in settings.py konfiguriert, wenn Siestartproject
Benutzer

Antworten:

232

Django 1.9 und höher:

## template
{{ request.path }}  #  -without GET parameters 
{{ request.get_full_path }}  # - with GET parameters

Alt:

## settings.py
TEMPLATE_CONTEXT_PROCESSORS = (
    'django.core.context_processors.request',
)

## views.py
from django.template import *

def home(request):
    return render_to_response('home.html', {}, context_instance=RequestContext(request))

## template
{{ request.path }}
httpete
quelle
2
Ein bisschen lakonisch und nicht korrekt. Es ist render_to_responseund nicht render_to_request. Und Sie können nicht TEMPLATE_CONTEXT_PROCESSORSwie in settings.py definieren, ohne die anderen Standardprozessoren zu erwähnen, die möglicherweise in den Vorlagen verwendet werden!
RedGlyph
8
Ab 2016 müssen Sie views.py nichts mehr hinzufügen. Solange django.core.context_processors.request in TEMPLATE_CONTEXT_PROCESSORS geladen ist, haben Sie über die Vorlage Zugriff auf {{request.path}}.
Routhinator
8
request.pathenthält keine Abfrageparameter wie ?foo=bar. Verwenden Sie request.get_full_pathstattdessen.
Flimm
@Routhinator stimme dir zu. Aber es ist schön zu wissen, dass diese Middleware enthalten sein muss, um dies zu ermöglichen.
Marshall X
281

Sie können die URL in Ihrer Vorlage folgendermaßen abrufen:

<p>URL of this page: {{ request.get_full_path }}</p>

oder von

{{ request.path }} wenn Sie die zusätzlichen Parameter nicht benötigen.

Einige Präzisionen und Korrekturen sollten zu den Antworten von Hypete und Igancio gebracht werden. Ich werde hier nur die gesamte Idee zusammenfassen, um später darauf zurückgreifen zu können.

Wenn Sie die requestVariable in der Vorlage benötigen , müssen Sie den TEMPLATE_CONTEXT_PROCESSORSEinstellungen die Datei 'django.core.context_processors.request' hinzufügen. Dies ist nicht standardmäßig (Django 1.4).

Sie dürfen auch die anderen von Ihren Anwendungen verwendeten Kontextprozessoren nicht vergessen . Um die Anforderung zu den anderen Standardprozessoren hinzuzufügen, können Sie dies in Ihren Einstellungen hinzufügen, um zu vermeiden, dass die Standardprozessorliste fest codiert wird (dies kann sich in späteren Versionen sehr gut ändern):

from django.conf.global_settings import TEMPLATE_CONTEXT_PROCESSORS as TCP

TEMPLATE_CONTEXT_PROCESSORS = TCP + (
    'django.core.context_processors.request',
)

Vorausgesetzt, Sie senden den requestInhalt Ihrer Antwort , zum Beispiel wie folgt:

from django.shortcuts import render_to_response
from django.template import RequestContext

def index(request):
    return render_to_response(
        'user/profile.html',
        { 'title': 'User profile' },
        context_instance=RequestContext(request)
    )
RedGlyph
quelle
4
Ich habe eine erweiterte generische Klassenansicht verwendet, und es war nicht erforderlich request, sie dem Kontext hinzuzufügen .
Bobort
Auf jeden Fall sauberer, um ein hartes Codieren der TCP-Liste zu vermeiden, aber docs.djangoproject.com/de/dev/topics/settings/#default-settings sagt:Note that a settings file should not import from global_settings, because that’s redundant
Benutzer
3
return render(request, 'user/profile.html', {'title': 'User profile'})ist kürzer
Richard de Wit
2
Denken {{request.get_full_path|urlenode}}Sie daran, Urlencode einzuschließen, dh wenn Sie umleiten
Benutzer
Wie bekomme ich Parameter von get_full_path?
Numerah
7

Der folgende Code hilft mir:

 {{ request.build_absolute_uri }}
Евгений Шабин
quelle
Dies ist nützlich, da es auch den Hostnamen / die Domain enthält.
Waverider
6

In der Django-Vorlage Holen Sie sich
einfach die aktuelle URL von {{request.path}}
Zum Abrufen der vollständigen URL mit Parametern{{request.get_full_path}}

Hinweis : Sie müssen requestin Django hinzufügenTEMPLATE_CONTEXT_PROCESSORS

Savad KP
quelle
5

Ich nehme an, die vollständige Anfrage zum Senden an die Vorlage ist etwas redundant. Ich mache es so

from django.shortcuts import render

def home(request):
    app_url = request.path
    return render(request, 'home.html', {'app_url': app_url})

##template
{{ app_url }}
Radren
quelle
4

Die anderen Antworten waren zumindest in meinem Fall falsch. request.pathliefert nicht die vollständige URL, sondern nur die relative URL, z /paper/53. Ich habe keine richtige Lösung gefunden, daher habe ich den konstanten Teil der URL in der Ansicht fest codiert, bevor ich sie verkettet habe request.path.

Deleet
quelle
Schau dir das Datum an. Die Antworten wurden vor 6 oder 7 Jahren gegeben.
Dotty
3

Beide {{ request.path }} and {{ request.get_full_path }}geben die aktuelle URL zurück, jedoch keine absolute URL, zum Beispiel:

your_website.com/wallpapers/new_wallpaper

Beide kehren zurück /new_wallpaper/ (beachten Sie die führenden und nachfolgenden Schrägstriche)

Also musst du so etwas tun

{% if request.path == '/new_wallpaper/' %}
    <button>show this button only if url is new_wallpaper</button>
{% endif %}

Sie können die absolute URL jedoch mithilfe von erhalten (dank der obigen Antwort).

{{ request.build_absolute_uri }}

Hinweis: Sie müssen nicht enthalten requestin settings.pyda, es ist schon.

Mujeeb Ishaque
quelle
1

Dies ist eine alte Frage, die sich jedoch genauso einfach zusammenfassen lässt, wenn Sie die Django-Registrierung verwenden.

Fügen Sie in Ihrem Link zum Anmelden und Abmelden (z. B. in Ihrem Seitenkopf) den nächsten Parameter zum Link hinzu, der zum Anmelden oder Abmelden führt. Ihr Link sollte so aussehen.

<li><a href="http://www.noobmovies.com/accounts/login/?next={{ request.path | urlencode }}">Log In</a></li>

<li><a href="http://www.noobmovies.com/accounts/logout/?next={{ request.path | urlencode }}">Log Out</a></li>

Das ist es einfach, nichts anderes muss getan werden. Nach dem Abmelden werden sie sofort auf die Seite umgeleitet, auf der sie sich befinden. Zum Anmelden füllen sie das Formular aus und es wird dann auf die Seite umgeleitet, auf der sie sich befanden. Auch wenn sie fälschlicherweise versuchen, sich anzumelden, funktioniert es immer noch.

Chris Hawkes
quelle
3
Sie sollten den Pfad codieren, wenn er in einer URL enthalten ist:{{ request.path|urlencode }}
Quentin
0

Die obigen Antworten sind korrekt und geben eine gute und kurze Antwort.

Ich war auf der Suche auch die aktuellen Seite URL in Django Vorlage für immer als meine Absicht aktivieren sollte HOME page, MEMBERS page, CONTACT page, ALL POSTS pagewenn sie angefordert werden.

Ich füge den Teil des HTML-Code-Snippets ein, den Sie unten sehen können, um die Verwendung von zu verstehen request.path. Sie können es in meinem live websiteunter http://pmtboyshostelraipur.pythonanywhere.com/ sehen.

<div id="navbar" class="navbar-collapse collapse">
  <ul class="nav navbar-nav">
        <!--HOME-->
        {% if "/" == request.path %}
      <li class="active text-center">
          <a href="/" data-toggle="tooltip" title="Home" data-placement="bottom">
            <i class="fa fa-home" style="font-size:25px; padding-left: 5px; padding-right: 5px" aria-hidden="true">
            </i>
          </a>
      </li>
      {% else %}
      <li class="text-center">
          <a href="/" data-toggle="tooltip" title="Home" data-placement="bottom">
            <i class="fa fa-home" style="font-size:25px; padding-left: 5px; padding-right: 5px" aria-hidden="true">
            </i>
          </a>
      </li>
      {% endif %}

      <!--MEMBERS-->
      {% if "/members/" == request.path %}
      <li class="active text-center">
        <a href="/members/" data-toggle="tooltip" title="Members"  data-placement="bottom">
          <i class="fa fa-users" style="font-size:25px; padding-left: 5px; padding-right: 5px" aria-hidden="true"></i>
        </a>
      </li>
      {% else %}
      <li class="text-center">
        <a href="/members/" data-toggle="tooltip" title="Members"  data-placement="bottom">
          <i class="fa fa-users" style="font-size:25px; padding-left: 5px; padding-right: 5px" aria-hidden="true"></i>
        </a>
      </li>
      {% endif %}

      <!--CONTACT-->
      {% if "/contact/" == request.path %}
      <li class="active text-center">
        <a class="nav-link" href="/contact/"  data-toggle="tooltip" title="Contact"  data-placement="bottom">
            <i class="fa fa-volume-control-phone" style="font-size:25px; padding-left: 5px; padding-right: 5px" aria-hidden="true"></i>
          </a>
      </li>
      {% else %}
      <li class="text-center">
        <a class="nav-link" href="/contact/"  data-toggle="tooltip" title="Contact"  data-placement="bottom">
            <i class="fa fa-volume-control-phone" style="font-size:25px; padding-left: 5px; padding-right: 5px" aria-hidden="true"></i>
          </a>
      </li>
      {% endif %}

      <!--ALL POSTS-->
      {% if "/posts/" == request.path %}
      <li class="text-center">
        <a class="nav-link" href="/posts/"  data-toggle="tooltip" title="All posts"  data-placement="bottom">
            <i class="fa fa-folder-open" style="font-size:25px; padding-left: 5px; padding-right: 5px" aria-hidden="true"></i>
          </a>
      </li>
      {% else %}
      <li class="text-center">
        <a class="nav-link" href="/posts/"  data-toggle="tooltip" title="All posts"  data-placement="bottom">
            <i class="fa fa-folder-open" style="font-size:25px; padding-left: 5px; padding-right: 5px" aria-hidden="true"></i>
          </a>
      </li>
      {% endif %}
</ul>

Hygull
quelle
2
Ein kleiner Vorschlag: Wenn Sie nur prüfen, ob Sie die activeKlasse zu jedem liElement hinzufügen möchten, warum nicht einfach inline innerhalb eines liElements: <li class="{% if "/contact/" == request.path %}active {% endif %}text-center">....</li>Anstelle eines riesigen if / else-Blocks für das Ganze li? Das würde eine ganze Menge redundanten Codes sparen :)
tatlar
0

In Django 3 möchten Sie das URL- Vorlagen-Tag verwenden:

{% url 'name-of-your-user-profile-url' possible_context_variable_parameter %}

Ein Beispiel finden Sie in der Dokumentation

Janne
quelle