Reputation: 9672
I have a small resume site that is not rendering a different template upon hitting a reversed URL.
site/scripts/templates/scripts/index.html:
<p>were at main</p>
<a href="{% url 'scripts:python' %}">python</a>
<br/>
<a href="{% url 'scripts:bash' %}">bash</a>
These links 'python' and 'bash' work in the URL bar, they take us to localhost:scripts/bash/ and localhost:scripts/python/, but the exact same webpage is displayed (index.html, or localhost:scripts/)
site/scripts/urls.py:
from django.conf.urls import patterns, include, url
from scripts import views
urlpatterns = patterns('',
url(r'$', views.index, name='index'),
url(r'python/$', views.access_python, name='python'),
url(r'bash/$', views.access_bash, name='bash'),
)
site/scripts/views.py:
from django.shortcuts import render
def index(request):
return render(request, 'scripts/index.html')
def access_python(request):
return render(request, 'scripts/python.html')
def access_bash(request):
return render(request, 'scripts/bash.html')
site/urls.py (main folder w/ settings.py):
from django.conf.urls import patterns, include, url
urlpatterns = patterns('',
url(r'scripts/', include('scripts.urls', namespace='scripts')),
)
clicking 'bash' should retrieve:
site/scripts/templates/scripts/bash.html:
<p>we're at bash</p>
Why would a reverse lookup reach the correct URL, but not call the associated view that that URL pattern wants? Thank you
Upvotes: 0
Views: 816
Reputation: 9672
The index regex was catching any possible pattern, since it matched any end of string. I found out by moving the index pattern after the other 2. It should be:
urlpatterns = patterns('',
url(r'^$', views.index, name='index'),
url(r'^python/$', views.access_python, name='python'),
url(r'^bash/$', views.access_bash, name='bash'),
)
Any blank index urls (r'^$') need both start and end of string, to match the empty string after the first part of that pattern (in this case, 'scripts/')
Upvotes: 3