Como obter o URL atual dentro de um modelo do Django?


309

Eu queria saber como obter o URL atual dentro de um modelo.

Digamos que meu URL atual seja:

.../user/profile/

Como faço para retornar isso ao modelo?


3
possível duplicata do caminho Reading em modelos
Mark Mikofski

2
Todas as respostas abaixo me fizeram pensar que eu precisava fazer ginástica para ter acesso a requestum modelo. No Django 1.10, basta acessar {{request.path}}o template e ele funciona. Por padrão, django.core.context_processors.requestjá está configurado em settings.py se você usou.startproject
User

Respostas:


232

Django 1.9 e acima:

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

Velho:

## 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
Um pouco lacônico, e incorreto. É render_to_responsee não é render_to_request. E você não pode definir TEMPLATE_CONTEXT_PROCESSORScomo define o arquivo settings.py, sem mencionar os outros processadores padrão que podem ser usados ​​nos modelos!
RedGlyph

8
A partir de 2016, você não precisará mais adicionar nada ao views.py. Contanto que o django.core.context_processors.request seja carregado em TEMPLATE_CONTEXT_PROCESSORS - você tem acesso a {{request.path}} no modelo.
Routhinator

8
request.pathnão inclui parâmetros de consulta como ?foo=bar. Use em request.get_full_pathvez disso.
Flimm

@Routhinator concorda com você. mas é bom saber que esse middleware precisa ser incluído para fazer isso acontecer.
Marshall X

281

Você pode buscar o URL no seu modelo assim:

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

ou pela

{{ request.path }} se você não precisar dos parâmetros extras.

Algumas precisões e correções devem ser levadas às respostas de hypete e Igancio , apenas resumirei a idéia aqui, para referência futura.

Se você precisa da requestvariável no modelo, você deve adicionar o 'django.core.context_processors.request' para as TEMPLATE_CONTEXT_PROCESSORSconfigurações, não é por padrão (Django 1.4).

Você também não deve esquecer os outros processadores de contexto usados ​​por seus aplicativos. Portanto, para adicionar a solicitação aos outros processadores padrão, você pode adicioná-lo nas suas configurações, para evitar codificar a lista de processadores padrão (que pode muito bem mudar nas versões posteriores):

from django.conf.global_settings import TEMPLATE_CONTEXT_PROCESSORS as TCP

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

Em seguida, desde que você envie o requestconteúdo em sua resposta , por exemplo, como este:

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
Eu usei uma exibição de classe genérica estendida e não era necessário adicionar requestao contexto.
Bobort

Definitivamente mais limpo para evitar a codificação da lista TCP, mas docs.djangoproject.com/en/dev/topics/settings/#default-settings diz:Note that a settings file should not import from global_settings, because that’s redundant
user

3
return render(request, 'user/profile.html', {'title': 'User profile'})é mais curto
Richard de Wit

2
lembre-se de incluir urlencode ou seja, {{request.get_full_path|urlenode}}se você estiver redirecionando
usuário

como obter parâmetros de get_full_path ??
Numeroh 29/12


6

No modelo django
Basta obter o URL atual de {{request.path}}
Para obter o URL completo com os parâmetros{{request.get_full_path}}

Nota : Você deve adicionar requestno djangoTEMPLATE_CONTEXT_PROCESSORS


5

Suponho que enviar para a solicitação completa do modelo seja um pouco redundante. Eu faço assim

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

As outras respostas estavam incorretas, pelo menos no meu caso. request.pathnão fornece o URL completo, apenas o URL relativo, por exemplo /paper/53. Como não encontrei nenhuma solução adequada, acabei codificando a parte constante do URL no modo de exibição antes de concatená-lo request.path.


Olhe a data. As respostas foram dadas há 6 ou 7 anos.
dotty

3

Ambos {{ request.path }} and {{ request.get_full_path }}retornam o URL atual, mas não o URL absoluto, por exemplo:

your_website.com/wallpapers/new_wallpaper

Ambos retornarão /new_wallpaper/ (observe as barras iniciais e finais)

Então você terá que fazer algo como

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

No entanto, você pode obter o URL absoluto usando (graças à resposta acima)

{{ request.build_absolute_uri }}

NOTA: você não precisa incluir requestnosettings.py , ele já está lá.


1

Esta é uma pergunta antiga, mas pode ser resumida com a mesma facilidade se você estiver usando o django-registration.

No link Login e Logout (digamos no cabeçalho da página), adicione o próximo parâmetro ao link que irá para o login ou logout. Seu link deve ficar assim.

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

Simplesmente, nada mais precisa ser feito; ao sair, eles serão imediatamente redirecionados para a página em que estão, para fazer login, eles preencherão o formulário e, em seguida, serão redirecionados para a página em que estavam. Mesmo que eles tentem entrar incorretamente, ainda funciona.


3
você deve codificar o caminho se ele estiver em um URL:{{ request.path|urlencode }}
Quentin

0

As respostas acima estão corretas e fornecem uma resposta ótima e curta.

Eu também estava olhando para obter o URL da página atual no modelo de Django como minha intenção foi ativar HOME page, MEMBERS page, CONTACT page,ALL POSTS page quando eles são solicitados.

Estou colando a parte do snippet de código HTML que você pode ver abaixo para entender o uso de request.path. Você pode vê-lo na minha live websitena 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
Uma pequena sugestão - se tudo o que você está fazendo é verificar se deseja adicionar a activeclasse a cada lielemento, por que não fazer isso em linha dentro de um lielemento: em <li class="{% if "/contact/" == request.path %}active {% endif %}text-center">....</li>vez de um bloco if / else gigante para o todo li? Isso iria salvar um monte de código redundante :)
tatlar

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.