模板渲染时出现Django错误:找到NoReverseMatch

时间:2013-08-29 06:46:35

标签: python django django-templates

以下代码抛出错误。我搜索了解决方案,但找不到任何与我的场景有关的内容。任何帮助将不胜感激。

#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'),

我需要在我的视图中将电子邮件模板呈现为字符串。

#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)

以下是html文件,简化为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 %}

错误追溯:

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.

1 个答案:

答案 0 :(得分:0)

正如FoxMaSk评论你应该替换:

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

使用:

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

请注意url中视图名称周围的单引号,这在Django 1.5+中是必需的(不确定您使用的是哪个版本)。

更重要的是,我认为错误在于:

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

在呈现模板时,您没有将uid或令牌传递到上下文中,这就是为什么在这些变量的traceback消息中看到空值的原因:

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