Django error while template rendering: NoReverseMatch found
Question: The following piece of code is throwing an error. I searched for the solution,
but couldn't find anything which is pertaining to my scenario. Any help would
be appreciated.

    
    
    #urls.py
    url(r'^password/reset/confirm/(?P<uidb36>[0-9A-Za-z]+)\/(?P<token>.+)/$', 
        app_name.password_reset_confirm,name='auth_password_reset_confirm'),
    

I need to render an email template as a string in my view.

    
    
    #views.py
    from django.template import Context, loader
    t = loader.get_template('app_name/email.html')
    message = t.render(Context({"domain":"foo.com","protocol":"https"}))
    user.email_user(subject, message, settings.DEFAULT_FROM_EMAIL)
    

Following is the html file, simplified for SO:

    
    
    {% load i18n %}{% autoescape off %}
    <html>
        <body>
            {% block reset_link %}<br />
                <a href="{{ protocol }}://{{ domain }}/accounts/password/reset/confirm/{{uid}}/{{token}}">{{ protocol }}://{{ domain }}/accounts/password/reset/confirm/{{uid}}/{{token}}</a>
                <br />
            {% endblock %}
            {% trans "Thanks for using our product!" %}<br /><br />
            {% blocktrans %}Regards, <br />{{ site_name }} team{% endblocktrans %}
        </body>
    </html>
    {% endautoescape %}
    

Error Traceback:

    
    
    NoReverseMatch                            Traceback (most recent call last)
    /usr/local/lib/python2.7/dist-packages/django/core/management/commands/shell.pyc in <module>()
    ----> 1 message = t.render(Context({"domain":"foo.com","protocol":"https"}))
    
    /usr/local/lib/python2.7/dist-packages/django/template/base.pyc in render(self, context)
        138         context.render_context.push()
        139         try:
    --> 140             return self._render(context)
        141         finally:
        142             context.render_context.pop()
    
    /usr/local/lib/python2.7/dist-packages/django/template/base.pyc in _render(self, context)
        132 
        133     def _render(self, context):
    --> 134         return self.nodelist.render(context)
        135 
        136     def render(self, context):
    
    /usr/local/lib/python2.7/dist-packages/django/template/base.pyc in render(self, context)
        828         for node in self:
        829             if isinstance(node, Node):
    --> 830                 bit = self.render_node(node, context)
        831             else:
        832                 bit = node
    
    /usr/local/lib/python2.7/dist-packages/django/template/debug.pyc in render_node(self, node, context)
         72     def render_node(self, node, context):
         73         try:
    ---> 74             return node.render(context)
         75         except Exception as e:
         76             if not hasattr(e, 'django_template_source'):
    
    /usr/local/lib/python2.7/dist-packages/django/template/defaulttags.pyc in render(self, context)
         31         old_setting = context.autoescape
         32         context.autoescape = self.setting
    ---> 33         output = self.nodelist.render(context)
         34         context.autoescape = old_setting
         35         if self.setting:
    
    /usr/local/lib/python2.7/dist-packages/django/template/base.pyc in render(self, context)
        828         for node in self:
        829             if isinstance(node, Node):
    --> 830                 bit = self.render_node(node, context)
        831             else:
        832                 bit = node
    
    /usr/local/lib/python2.7/dist-packages/django/template/debug.pyc in render_node(self, node, context)
         72     def render_node(self, node, context):
         73         try:
    ---> 74             return node.render(context)
         75         except Exception as e:
         76             if not hasattr(e, 'django_template_source'):
    
    /usr/local/lib/python2.7/dist-packages/django/template/loader_tags.pyc in render(self, context)
         52         if block_context is None:
         53             context['block'] = self
    ---> 54             result = self.nodelist.render(context)
         55         else:
         56             push = block = block_context.pop(self.name)
    
    /usr/local/lib/python2.7/dist-packages/django/template/base.pyc in render(self, context)
        828         for node in self:
        829             if isinstance(node, Node):
    --> 830                 bit = self.render_node(node, context)
        831             else:
        832                 bit = node
    
     /usr/local/lib/python2.7/dist-packages/django/template/debug.pyc in render_node(self, node, context)
         72     def render_node(self, node, context):
         73         try:
    ---> 74             return node.render(context)
         75         except Exception as e:
         76             if not hasattr(e, 'django_template_source'):
    
    /usr/local/lib/python2.7/dist-packages/django/template/defaulttags.pyc in render(self, context)
        422                         # the path relative to the project. This makes a
    
        423                         # better error message.
    
    --> 424                         raise e
        425             else:
        426                 if self.asvar is None:
    
    NoReverseMatch: Reverse for 'django.contrib.auth.views.password_reset_confirm' with arguments '()' and keyword arguments '{u'uidb36': '', u'token': ''}' not found.
    


Answer: As FoxMaSk has commented you should replace:

    
    
    {{ protocol }}://{{ domain }}/accounts/password/reset/confirm/{{uid}}/{{token}}
    

with:

    
    
    {{ protocol }}://{{ domain }}{% url 'auth_password_reset_confirm' uid36=uid token=token %}
    

Note the single quotes around the view name in the url, this is required in
Django 1.5+ (not sure what version you are using).

More importantly I believe the error lies here:

    
    
    message = t.render(Context({"domain":"foo.com","protocol":"https"}))
    

You are not passing your uid or token into the context when rendering the
template which is why you are seeing empty values in the traceback message for
these variables:

    
    
    NoReverseMatch: Reverse for 'django.contrib.auth.views.password_reset_confirm' with arguments '()' and keyword arguments '{u'uidb36': '', u'token': ''}' not found.
    

