examples - ¿Usando{% url ??? %} en plantillas django
django templates examples (6)
He buscado mucho en google para obtener respuestas sobre cómo usar la etiqueta ''url'' en las plantillas solo para encontrar muchas respuestas que dicen ''Simplemente inserta en tu plantilla y apúntala a la vista para la que quieres la url''. Bueno, no hay alegría para mí :( He intentado cada permutación posible y he recurrido a publicar aquí como último recurso.
Asi que aqui esta. Mi urls.py se ve así:
from django.conf.urls.defaults import *
from login.views import *
from mainapp.views import *
import settings
# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('''',
# Example:
# (r''^weclaim/'', include(''weclaim.foo.urls'')),
(r''^login/'', login_view),
(r''^logout/'', logout_view),
(''^$'', main_view),
# Uncomment the admin/doc line below and add ''django.contrib.admindocs''
# to INSTALLED_APPS to enable admin documentation:
# (r''^admin/doc/'', include(''django.contrib.admindocs.urls'')),
# Uncomment the next line to enable the admin:
(r''^admin/'', include(admin.site.urls)),
#(r''^static/(?P<path>.*)$'', ''django.views.static.serve'',{''document_root'': ''/home/arthur/Software/django/weclaim/templates/static''}),
(r''^static/(?P<path>.*)$'', ''django.views.static.serve'',{''document_root'': settings.MEDIA_ROOT}),
)
Mi ''views.py'' en mi directorio de ''inicio de sesión'' se ve así:
from django.shortcuts import render_to_response, redirect
from django.template import RequestContext
from django.contrib import auth
def login_view(request):
if request.method == ''POST'':
uname = request.POST.get(''username'', '''')
psword = request.POST.get(''password'', '''')
user = auth.authenticate(username=uname, password=psword)
# if the user logs in and is active
if user is not None and user.is_active:
auth.login(request, user)
return render_to_response(''main/main.html'', {}, context_instance=RequestContext(request))
#return redirect(main_view)
else:
return render_to_response(''loginpage.html'', {''box_width'': ''402'', ''login_failed'': ''1'',}, context_instance=RequestContext(request))
else:
return render_to_response(''loginpage.html'', {''box_width'': ''400'',}, context_instance=RequestContext(request))
def logout_view(request):
auth.logout(request)
return render_to_response(''loginpage.html'', {''box_width'': ''402'', ''logged_out'': ''1'',}, context_instance=RequestContext(request))
y finalmente el main.html al que se parecen los puntos login_view:
<html>
<body>
test! <a href="{% url logout_view %}">logout</a>
</body>
</html>
Entonces, ¿por qué obtengo ''NoReverseMatch'' todo el tiempo?
* (en una nota ligeramente diferente tuve que usar ''context_instance = RequestContext (request)'' al final de todos mis renderizados para responder porque de lo contrario no reconocería {{MEDIA_URL}} en mis plantillas y no podría hacer referencia cualquier archivo css o js. No estoy seguro de por qué es esto. No me parece correcto) *
A juzgar por su ejemplo, ¿no debería ser {% url myproject.login.views.login_view %}
y final de la historia? (reemplace myproject
con su nombre de proyecto real)
Asegúrate (django 1.5 y posteriores) de poner el nombre de la url entre comillas, y si tu url toma parámetros, deberían estar fuera de las comillas (¡pasé horas averiguando este error!).
{% url ''namespace:view_name'' arg1=value1 arg2=value2 as the_url %}
<a href="{{ the_url }}"> link_name </a>
En lugar de importar la función logout_view
, debe proporcionar una cadena en su archivo urls.py
:
Entonces no (r''^login/'', login_view),
pero (r''^login/'', ''login.views.login_view''),
Esa es la forma estándar de hacer las cosas. Luego puede acceder a la URL en sus plantillas usando:
{% url login.views.login_view %}
La etiqueta de la plantilla de url
pasará el parámetro como una cadena y no como una referencia de función a reverse()
. La forma más sencilla de hacerlo funcionar es agregar un name
a la vista:
url(r''^/logout/'' , logout_view, name=''logout_view'')
La respuesta seleccionada está desactualizada y ninguna otra me funcionó (Django 1.6 y [aparentemente] no hay espacio de nombres registrado.)
Para Django 1.5 y posterior (de los documentos )
Advertencia ¡No olvide poner comillas alrededor de la ruta de la función o el nombre del patrón!
Con una URL con nombre, puedes hacer:
(r''^login/'', login_view, name=''login''),
...
<a href="{% url ''login'' %}">logout</a>
Tan fácil si la vista toma otro parámetro
def login(request, extra_param):
...
<a href="{% url ''login'' ''some_string_containing_relevant_data'' %}">login</a>
Me encuentro con el mismo problema.
Lo que encontré en la documentación, debemos usar namedspace.
en tu caso {% url login:login_view %}