I’ve over-ridden several of the built-in django auth and {{ “bitbucket.org/ubernostrum/django-registration/” | ext_link: “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>