Django Reverse with arguments '()' and keyword arguments '{}' not found

DjangoDjango Testing

Django Problem Overview


Hi I have an infuriating problem.

I have a url pattern like this:

# mproject/myapp.urls.py

url(r'^project/(?P<project_id>\d+)/$','user_profile.views.EditProject',name='edit_project'),

it works fine in the browser but for testing, when I do this in the shell:

from django.test import Client
from django.core.urlresolvers import reverse

client= Client()
response = client.get(reverse('edit_project'), project_id=4)

I get the dreaded:

NoReverseMatch: Reverse for 'edit_project' with arguments '()' and keyword arguments '{}' not found.

What am I missing here?

Django Solutions


Solution 1 - Django

You have to specify project_id:

reverse('edit_project', kwargs={'project_id':4})

Doc here

Solution 2 - Django

The solution @miki725 is absolutely correct. Alternatively, if you would like to use the args attribute as opposed to kwargs, then you can simply modify your code as follows:

project_id = 4
reverse('edit_project', args=(project_id,))

An example of this can be found in the documentation. This essentially does the same thing, but the attributes are passed as arguments. Remember that any arguments that are passed need to be assigned a value before being reversed. Just use the correct namespace, which in this case is 'edit_project'.

Solution 3 - Django

This problems gave me great headache when i tried to use reverse for generating activation link and send it via email of course. So i think from tests.py it will be same. The correct way to do this is following:

from django.test import Client
from django.core.urlresolvers import reverse

#app name - name of the app where the url is defined
client= Client()
response = client.get(reverse('app_name:edit_project', project_id=4)) 

Solution 4 - Django

The function resolve_url is also more straightforward

from django.shortcuts import resolve_url

resolve_url('edit_project', project_id=4)

Documentation on this shortcut

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionDarwin TechView Question on Stackoverflow
Solution 1 - Djangomiki725View Answer on Stackoverflow
Solution 2 - DjangoSrivats ShankarView Answer on Stackoverflow
Solution 3 - DjangoKRHView Answer on Stackoverflow
Solution 4 - DjangoSebCorbinView Answer on Stackoverflow