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

2024-03-28 18:37:45 发布

您现在位置:Python中文网/ 问答频道 /正文

下面的代码段抛出一个错误。我寻找解决方案,但找不到任何与我的方案有关的东西。任何帮助都将不胜感激。在

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

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

^{pr2}$

以下是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.

Tags: djangoinselfnodeiflibpackagesusr
1条回答
网友
1楼 · 发布于 2024-03-28 18:37:45

正如FoxMaSk评论的那样,您应该替换:

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

有:

^{pr2}$

注意url中视图名的单引号,这在django1.5+中是必需的(不确定您使用的是哪个版本)。在

更重要的是,我认为错误就在这里:

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

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

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

相关问题 更多 >