Ich habe viel bei Google nach Antworten gesucht, wie das "URL" -Tag in Vorlagen verwendet werden kann, um nur viele Antworten zu finden, die sagen: "Sie fügen es einfach in Ihre Vorlage ein und zeigen auf die Ansicht, für die Sie die URL möchten." Nun, keine Freude für mich :( Ich habe jede mögliche Permutation ausprobiert und als letztes Mittel hier gepostet.
Hier ist es also. Meine urls.py sieht so aus:
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}),
)
Meine 'views.py' in meinem 'Login'-Verzeichnis sieht folgendermaßen aus:
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))
und schließlich die main.html, auf die die login_view zeigt:
<html>
<body>
test! <a href="{% url logout_view %}">logout</a>
</body>
</html>
Warum bekomme ich jedes Mal 'NoReverseMatch'?
* (etwas anders musste ich 'context_instance = RequestContext (request)' am Ende aller meiner Render-to-Response-Anwendungen verwenden, da es sonst {{MEDIA_URL}} in meinen Vorlagen nicht erkennen würde und ich nicht referenzieren konnte CSS- oder JS-Dateien. Ich bin mir nicht sicher, warum das so ist. Scheint mir nicht richtig) *
quelle
context_instance=RequestContext(request)
ist richtig. Dies ist erforderlich, um der Vorlage den Zugriff auf die Kontextvariablen zu ermöglichen, die für alle Vorlagen bereitgestellt werden. Dies erfolgt standardmäßig für alle allgemeinen Ansichten, Sie müssen dies jedoch selbst in Ihren benutzerdefinierten Ansichten tun.Antworten:
Anstatt die
logout_view
Funktion zu importieren , sollten Sie eine Zeichenfolge in Ihrerurls.py
Datei angeben:So nicht
(r'^login/', login_view),
aber
(r'^login/', 'login.views.login_view'),
Das ist die Standardmethode. Anschließend können Sie auf die URL in Ihren Vorlagen zugreifen, indem Sie:
quelle
Die ausgewählte Antwort ist veraltet und keine anderen haben für mich gearbeitet (Django 1.6 und [anscheinend] kein registrierter Namespace.)
Für Django 1.5 und höher (aus den Dokumenten )
Mit einer benannten URL können Sie Folgendes tun:
(r'^login/', login_view, name='login'), ... <a href="{% url 'login' %}">logout</a>
Genauso einfach, wenn die Ansicht einen anderen Parameter annimmt
def login(request, extra_param): ... <a href="{% url 'login' 'some_string_containing_relevant_data' %}">login</a>
quelle
{% load url from future %}
im Moment in 1.4. Guter OrtStellen Sie sicher (Django 1.5 und höher), dass Sie den URL-Namen in Anführungszeichen setzen. Wenn Ihre URL Parameter enthält, sollten diese außerhalb der Anführungszeichen liegen (ich habe Stunden damit verbracht, diesen Fehler herauszufinden!).
{% url 'namespace:view_name' arg1=value1 arg2=value2 as the_url %} <a href="{{ the_url }}"> link_name </a>
quelle
{% url app_views.client client.id %}
(keine Anführungszeichen) in 1.4,{% url 'app_views.client' client.id %}
(mit Anführungszeichen) in 1.5 -1.7 und{% url 'app-views-client' client.id %}
(keine Unterstriche oder Punkte, nur Bindestriche) in 1.8.Das
url
Template-Tag übergibt den Parameter als Zeichenfolge und nicht als Funktionsreferenz aufreverse()
. Der einfachste Weg, dies zum Laufen zu bringen, ist das Hinzufügen von aname
zur Ansicht:url(r'^/logout/' , logout_view, name='logout_view')
quelle
reverse()
definiert?Ich habe das gleiche Problem.
Was ich aus der Dokumentation herausgefunden habe, sollten wir namedspace verwenden.
in deinem Fall
{% url login:login_view %}
quelle
Nach Ihrem Beispiel zu urteilen, sollte es nicht das
{% url myproject.login.views.login_view %}
Ende der Geschichte sein? (durchmyproject
Ihren tatsächlichen Projektnamen ersetzen )quelle