Geçerli URL'yi bir Django şablonu içinde nasıl edinebilirim?


309

Bir şablonda mevcut URL'yi nasıl alacağımı merak ediyordum.

Mevcut URL’min:

.../user/profile/

Bunu şablona nasıl geri gönderebilirim?



2
Aşağıdaki tüm cevaplar bana requestbir şablonda erişmek için bazı jimnastik yapmam gerektiğini düşündürdü . Django 1.10 sadece {{request.path}}şablon erişim ve çalışır. django.core.context_processors.requestEğer kullandıysanız, varsayılan olarak settings.py startproject
Kullanıcı

Yanıtlar:


232

Django 1.9 ve üstü:

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

Eski:

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

2
Biraz özlü ve doğru değil. Öyle render_to_response, değil render_to_request. Ayrıca TEMPLATE_CONTEXT_PROCESSORS, şablonlarda iyi kullanılabilecek diğer varsayılan işlemcilerden bahsetmeden, settings.py'de yaptığınız gibi tanımlayamazsınız !
RedGlyph

8
2016 itibarıyla artık views.py dosyasına bir şey eklemenize gerek yok. Django.core.context_processors.request, TEMPLATE_CONTEXT_PROCESSORS içine yüklendiği sürece, şablondan {{request.path}} adresine erişebilirsiniz.
Routhinator

8
request.pathgibi sorgu parametrelerini içermez ?foo=bar. request.get_full_pathBunun yerine kullanın .
16'da

@Routhinator seninle aynı fikirde. ancak bunun gerçekleşmesi için bu ara yazılımların dahil edilmesi gerektiğini bilmek güzel.
Marshall X

281

Şablonunuzdaki URL'yi aşağıdaki gibi getirebilirsiniz:

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

veya tarafından

{{ request.path }} ekstra parametrelere ihtiyacınız yoksa.

Bazı kesinlikler ve düzeltmeler hipete ve Igancio'nun cevaplarına getirilmelidir, gelecekteki referans için tüm fikri burada özetleyeceğim.

requestŞablonda değişkene ihtiyacınız varsa , ayarlara 'django.core.context_processors.request' öğesini eklemeniz gerekirTEMPLATE_CONTEXT_PROCESSORS , bu varsayılan olarak değildir (Django 1.4).

Uygulamalarınız tarafından kullanılan diğer bağlam işlemcilerini de unutmamalısınız . Bu nedenle, isteği diğer varsayılan işlemcilere eklemek için, varsayılan işlemci listesinin (daha sonraki sürümlerde çok iyi değişebilen) kodlanmasını önlemek için bunu ayarlarınıza ekleyebilirsiniz:

from django.conf.global_settings import TEMPLATE_CONTEXT_PROCESSORS as TCP

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

Ardından, içeriği yanıtınızda göndermenizrequest şartıyla , örneğin:

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

4
Genişletilmiş bir genel sınıf görünümü requestkullandım ve bağlama eklemek gereksizdi .
Bobort

TCP listesini kodlamaktan kaçınmak için kesinlikle daha temiz, ancak docs.djangoproject.com/en/dev/topics/settings/#default-settings diyor ki:Note that a settings file should not import from global_settings, because that’s redundant
kullanıcı

3
return render(request, 'user/profile.html', {'title': 'User profile'})daha kısa
Richard de Wit

2
urlencode eklemeyi unutmayın, örneğin {{request.get_full_path|urlenode}}, yönlendiriyorsanız
user

get_full_path parametreleri nasıl alınır?
numerah


6

Django şablonunda
Sadece geçerli url'yi alın {{request.path}}
Parametrelerle tam url'yi almak için{{request.get_full_path}}

Not : requestDjango'ya eklemelisinizTEMPLATE_CONTEXT_PROCESSORS


5

Şablona tam istek göndermek biraz gereksiz olduğunu varsayalım. Bu şekilde yaparım

from django.shortcuts import render

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

##template
{{ app_url }}

4

Diğer cevaplar yanlıştı, en azından benim durumumda. request.pathtam url'yi değil, yalnızca göreli url'yi, örn /paper/53. Herhangi bir uygun çözüm bulamadım, bu yüzden görünümde url'nin sabit kısmını birleştirmeden önce hardcoding yaptım request.path.


Tarihe bak. Cevaplar 6 veya 7 yıl önce verildi.
Dotty

3

Her ikisi {{ request.path }} and {{ request.get_full_path }}de geçerli URL'yi döndürür, ancak mutlak URL'yi döndürmez, örneğin:

your_website.com/wallpapers/new_wallpaper

Her ikisi de geri dönecek /new_wallpaper/ (baştaki ve sondaki eğik çizgilere dikkat edin)

Yani böyle bir şey yapmalısın

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

Bununla birlikte, mutlak URL'yi (yukarıdaki cevap sayesinde) alabilirsiniz.

{{ request.build_absolute_uri }}

NOT: dahil etmek gerekmez requestiçinde settings.pyorada zaten var.


1

Bu eski bir soru ama django kaydı kullanıyorsanız bu kadar kolay özetlenebilir.

Oturum Aç ve Oturumu Kapat bağlantınıza (sayfa başlığınızda diyelim) girişe veya oturuma gidecek bağlantıya bir sonraki parametreyi ekleyin. Bağlantınız şöyle görünmelidir.

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

Bu kadar basit, başka bir şey yapılmasına gerek yok, çıkış yapıldıktan hemen sonra bulundukları sayfaya yönlendirilecekler, giriş için formu dolduracaklar ve daha sonra bulundukları sayfaya yönlendirecekler. Yanlış giriş yapsalar bile çalışır.


3
bir url'de ise yolu kodlamalısınız:{{ request.path|urlencode }}
Quentin

0

Yukarıdaki cevaplar doğrudur ve harika ve kısa cevap verirler.

Niyetim etkinleştirmek için olduğu gibi aynı zamanda Django şablonda geçerli sayfanın url almak arıyordu HOME page, MEMBERS page, CONTACT page, ALL POSTS page, istendiğinde.

HTML kod snippet'inin kullanımını anlamak için aşağıda gördüğünüz kısmını yapıştırıyorum request.path. Sen benim görebiliyorum live websitede http://pmtboyshostelraipur.pythonanywhere.com/

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


2
Küçük bir öneri - yaptığınız tek şey, activeher liöğeye sınıfın eklenip eklenmeyeceğini kontrol etmekse, neden yalnızca bu liöğeyi satır içi bir öğe içinde yapmıyorsunuz : <li class="{% if "/contact/" == request.path %}active {% endif %}text-center">....</li>dev bir if / else bloğu yerine li? Bu bir sürü gereksiz kod kurtaracak :)
tatlar

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.