Ik heb veel op Google gezocht naar antwoorden over het gebruik van de ‘url’-tag in sjablonen, maar ik vond veel reacties met de tekst ‘Voeg het gewoon toe aan uw sjabloon en wijs het naar de weergave waarvoor u de url wilt hebben’. Nou, geen vreugde voor mij 🙁 Ik heb elke mogelijke permutatie geprobeerd en heb mijn toevlucht genomen tot het posten hier als laatste redmiddel.
Dus hier is het. Mijn urls.py ziet er als volgt uit:
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}),
)
Mijn ‘views.py’ in mijn ‘login’ directory ziet er als volgt uit:
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))
en tot slot de main.html waarnaar de login_view verwijst:
<html>
<body>
test! <a href="{% url logout_view %}">logout</a>
</body>
</html>
Dus waarom krijg ik elke keer ‘NoReverseMatch’?
*(op een iets andere noot moest ik ‘context_instance=RequestContext(request)’ gebruiken aan het einde van al mijn render-to-respons’s omdat het anders {{ MEDIA_URL }} niet zou herkennen in mijn sjablonen en ik kon ‘verwijs niet naar css- of js-bestanden. Ik weet niet zeker waarom dit zo is. Lijkt me niet juist)*
Antwoord 1, autoriteit 100%
Het geselecteerde antwoord is verouderd en geen andere werkten voor mij (Django 1.6 en [blijkbaar] geen geregistreerde naamruimte.)
Voor Django 1.5 en hoger (van de documenten)
Waarschuwing
Vergeet niet om aanhalingstekens rond het functiepad of de patroonnaam te zetten!
Met een benoemde URL kunt u het volgende doen:
(r'^login/', login_view, name='login'),
...
<a href="{% url 'login' %}">logout</a>
Net zo eenvoudig als de weergave een andere parameter nodig heeft
def login(request, extra_param):
...
<a href="{% url 'login' 'some_string_containing_relevant_data' %}">login</a>
Antwoord 2, autoriteit 54%
In plaats van de functie logout_view
te importeren, moet u een tekenreeks in uw bestand urls.py
opgeven:
Dus niet (r'^login/', login_view),
maar (r'^login/', 'login.views.login_view'),
Dat is de standaardmanier om dingen te doen. Vervolgens kunt u de URL in uw sjablonen openen met:
{% url login.views.login_view %}
Antwoord 3, autoriteit 44%
Zorg ervoor (django 1.5 en hoger) dat u de url-naam tussen aanhalingstekens plaatst, en als uw url parameters gebruikt, moeten ze buitende aanhalingstekens staan (ik heb uren besteed aan het uitzoeken van deze fout!) .
{% url 'namespace:view_name' arg1=value1 arg2=value2 as the_url %}
<a href="{{ the_url }}"> link_name </a>
Antwoord 4, autoriteit 16%
De sjabloontag url
geeft de parameter door als een tekenreeks en niet als een functieverwijzing naar reverse()
. De eenvoudigste manier om dit werkend te krijgen, is door een name
toe te voegen aan de weergave:
url(r'^/logout/' , logout_view, name='logout_view')
Antwoord 5, autoriteit 11%
Ik loop tegen hetzelfde probleem aan.
Wat ik in de documentatie heb gevonden, moeten we namespace gebruiken.
in jouw geval {% url login:login_view %}
Antwoord 6
Afgaande op uw voorbeeld, zou het niet {% url myproject.login.views.login_view %}
en einde verhaal moeten zijn? (vervang myproject
door uw werkelijke projectnaam)