Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django NoReverseMatch

I have the following setup:

/landing_pages
    views.py
urls.py

In urls.py I have the following which works when I try to access /competition:

from django.conf.urls.defaults import *
from django.conf import settings
from django.views.generic.simple import direct_to_template

from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
    url(r'^competition$', 'landing_pages.views.page', {'page_name': 'competition'}, name="competition_landing"),
)

My views.py has something like this:

def page(request, page_name):
    return HttpResponse('ok')

Then in a template I'm trying to do this:

{% load url from future %}
<a href="{% url 'landing_pages.views.page' page_name='competition'%}">
    Competition
</a>

Which I apparently can't do:

Caught NoReverseMatch while rendering: Reverse for 'landing_pages.views.page' with arguments '()' and keyword arguments '{'page_name': u'competition'}' not found.

What am I doing wrong?

like image 326
Kit Sunde Avatar asked Jul 29 '11 09:07

Kit Sunde


1 Answers

You ask in your comment to DrTyrsa why you can't use args or kwargs. Just think about it for a moment. The {% url %} tag outputs - as the name implies - an actual URL which the user can click on. But you've provided no space in the URL pattern for the arguments. Where would they go? What would the URL look like? How would it work?

If you want to allow the user to specify arguments to your view, you have to provide a URL pattern with a space for those arguments to go.

like image 133
Daniel Roseman Avatar answered Sep 19 '22 00:09

Daniel Roseman