Gebruik {% url ??? %} in django-sjablonen

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_viewte importeren, moet u een tekenreeks in uw bestand urls.pyopgeven:

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 urlgeeft de parameter door als een tekenreeks en niet als een functieverwijzing naar reverse(). De eenvoudigste manier om dit werkend te krijgen, is door een nametoe 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 myprojectdoor uw werkelijke projectnaam)

Other episodes