Kit Sunde
Kit Sunde

Reputation: 37055

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?

Upvotes: 6

Views: 20560

Answers (2)

Daniel Roseman
Daniel Roseman

Reputation: 599470

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.

Upvotes: 10

DrTyrsa
DrTyrsa

Reputation: 31951

{% url [project_name].landing_pages.views.page page_name='competition' %}

Or better

{% url competition_landing 'competition' %}

Upvotes: 0

Related Questions