I’ve over-ridden several of the built-in django auth and django-registration templates so I can have my own custom-styled login and registration pages. This all worked fine until i tried to run the built-in django and django_registration test suites, when everything fell apart :
====================================================================== ERROR: test_confirm_different_passwords (django.contrib.auth.tests.views.PasswordResetTest) ---------------------------------------------------------------------- Traceback (most recent call last): File "/Users/dave/Documents/Code/python/loudgallery/django/contrib/auth/tests/views.py", line 124, in test_confirm_different_passwords 'new_password2':' x'}) File "/Users/dave/Documents/Code/python/loudgallery/django/test/client.py", line 313, in post response = self.request(**r) File "/Users/dave/Documents/Code/python/loudgallery/django/core/handlers/base.py", line 92, in get_response response = callback(request, *callback_args, **callback_kwargs) File "/Users/dave/Documents/Code/python/loudgallery/django/contrib/auth/views.py", line 141, in password_reset_confirm return render_to_response(template_name, context_instance=context_instance) File "/Users/dave/Documents/Code/python/loudgallery/django/shortcuts/__init__.py", line 20, in render_to_response return HttpResponse(loader.render_to_string(*args, **kwargs), **httpresponse_kwargs) File "/Users/dave/Documents/Code/python/loudgallery/django/template/loader.py", line 108, in render_to_string return t.render(context_instance) File "/Users/dave/Documents/Code/python/loudgallery/django/test/utils.py", line 29, in instrumented_test_render return self.nodelist.render(context) File "/Users/dave/Documents/Code/python/loudgallery/django/template/__init__.py", line 779, in render bits.append(self.render_node(node, context)) File "/Users/dave/Documents/Code/python/loudgallery/django/template/__init__.py", line 792, in render_node return node.render(context) File "/Users/dave/Documents/Code/python/loudgallery/django/template/loader_tags.py", line 97, in render return compiled_parent.render(context) File "/Users/dave/Documents/Code/python/loudgallery/django/test/utils.py", line 29, in instrumented_test_render return self.nodelist.render(context) File "/Users/dave/Documents/Code/python/loudgallery/django/template/__init__.py", line 779, in render bits.append(self.render_node(node, context)) File "/Users/dave/Documents/Code/python/loudgallery/django/template/__init__.py", line 792, in render_node return node.render(context) File "/Users/dave/Documents/Code/python/loudgallery/django/template/__init__.py", line 946, in render autoescape=context.autoescape)) File "/Users/dave/Documents/Code/python/loudgallery/django/template/__init__.py", line 779, in render bits.append(self.render_node(node, context)) File "/Users/dave/Documents/Code/python/loudgallery/django/template/__init__.py", line 792, in render_node return node.render(context) File "/Users/dave/Documents/Code/python/loudgallery/django/template/loader_tags.py", line 24, in render result = self.nodelist.render(context) File "/Users/dave/Documents/Code/python/loudgallery/django/template/__init__.py", line 779, in render bits.append(self.render_node(node, context)) File "/Users/dave/Documents/Code/python/loudgallery/django/template/__init__.py", line 792, in render_node return node.render(context) File "/Users/dave/Documents/Code/python/loudgallery/django/template/defaulttags.py", line 244, in render return self.nodelist_false.render(context) File "/Users/dave/Documents/Code/python/loudgallery/django/template/__init__.py", line 779, in render bits.append(self.render_node(node, context)) File "/Users/dave/Documents/Code/python/loudgallery/django/template/__init__.py", line 792, in render_node return node.render(context) File "/Users/dave/Documents/Code/python/loudgallery/django/template/defaulttags.py", line 382, in render raise e NoReverseMatch: Reverse for '<function index at 0x1ca9c30>' with arguments '()' and keyword arguments '{}' not found.
There were quite a few more of these, including :
test_activation_success_url (registration.tests.views.RegistrationViewTests) ... ERROR test_activation_template_name (registration.tests.views.RegistrationViewTests) ... ERROR test_registration_disallowed_url (registration.tests.views.RegistrationViewTests) ... ERROR test_registration_extra_context (registration.tests.views.RegistrationViewTests) ... ERROR test_registration_success_url (registration.tests.views.RegistrationViewTests) ... ERROR test_registration_template_name (registration.tests.views.RegistrationViewTests) ... FAIL test_registration_view_closed (registration.tests.views.RegistrationViewTests) ... ERROR test_registration_view_failure (registration.tests.views.RegistrationViewTests) ... FAIL test_registration_view_initial (registration.tests.views.RegistrationViewTests) ... FAIL test_registration_view_success (registration.tests.views.RegistrationViewTests) ... ERROR test_valid_activation (registration.tests.views.RegistrationViewTests) ... ERROR ... test_confirm_complete (django.contrib.auth.tests.views.PasswordResetTest) ... FAIL test_confirm_invalid (django.contrib.auth.tests.views.PasswordResetTest) ... FAIL test_confirm_valid (django.contrib.auth.tests.views.PasswordResetTest) ... FAIL ...
… and so on. After some investigation, it seems these errors occur because I have links to my own views in these custom templates, for example :
<a href="{% url home.views.index}">Cancel</a>
For whatever reason, django doesn’t include my project’s various urls.py files when it runs its tests, so it doesn’t know anything about my URLs. After a few hours I found this solution , which is a little hack-y, but seems to work. Simply add as xxxx at the end of your url call, and output the url as a variable using (for example) {{ index }} . This seems to suppress the errors :
<a href="{% url home.views.index as index %}{{ index }}">Cancel</a>

Thanx for the post. Saved me some time and I now know why it happens.
Thought it was the django-registration module at first.
Regards,
Gerard.
Is this still the only workaround? It sucks because even if the reverse actually is invalid, no error will be raised. I’ll probably submit a ticket about this, because I’ve only seen two places that reference it.