【问题标题】:Django NoReverseMatch errorDjango NoReverseMatch 错误
【发布时间】:2011-06-07 17:53:22
【问题描述】:

我是 Django 新手,已经开始从事一个成熟的 Django 项目。

我想向用户帐户屏幕添加一个新页面,并链接到它。但我收到 NoReverseMatch 错误。

到 /users/urls.py 我添加了:

url(r'^panel/history$',
    'theproject.users.views.history',
    name='account_history'
),

...与上面一行一致:

url(r'^panel$',
    'theproject.users.views.control_panel',
    name='account_panel'
),

到 /users/views.py 我添加了:

@login_required
def history(request):
    return render_to_response('users/ourbrand_history.html', {},
    context_instance=RequestContext(request))

...与上面一行一致:

@login_required
def control_panel(request):
    return render_to_response('users/ourbrand_panel.html', {},
    context_instance=RequestContext(request))

到 /templates/users/ourbrand_panel.html 我添加了:

<a href="{% url account_history %}">History</a>

...与上面一行一致:

<a href="{% url account_panel %}">Home</a>

现在当我加载 /panel 时,我得到一个 TemplateSyntaxError: NoReverseMatch。

Reverse for 'account_history' with arguments '()' and keyword arguments '{}' not found.

更新:作为测试,我删除了模板中的链接——并且 /panel 加载正常。如果我然后删除 /users/urls.py 和 /users/views.py /panel 仍然加载。我已删除所有 cookie、历史记录等。我是否必须在终端上运行命令(如 ruby​​ 中的 rake)才能提交对 urls.py 的更改?还是应该改变“正常工作”?

【问题讨论】:

  • 据我所知,一切看起来都是正确的(尽管尾随斜杠是个好主意,正如@pastylegs 所说)。是否有一些你没有剪切/粘贴的东西,另一行中的一些小语​​法错误可能会影响它?可能是一个额外的引号 " 或者改变模板读取方式的东西?
  • 而且(尽管我假设您剪切/粘贴代码并且显示的内容是正确的) - 您可能会仔细检查您是否始终在任何地方使用下划线 _,并且没有意外使用连字符- :) 我只是在测试我的命名 URL,切换我用于下划线的连字符(这有效)。但是当我混合它们时,它产生了同样的错误。
  • 如果您正在运行 Django 开发服务器,所有文件更改都会导致服务器重新加载文件,因此您无需提交任何内容。但是,在模板中 - 如果一个变量不存在,它只会计算为一个空字符串,它不会给您任何错误,因此页面将正常加载。
  • 根据@pastylegs 的回答,我确实添加了斜杠。我三重检查了所有语法:没有额外的引号或连字符而不是下划线。您说“在模板中 - 如果变量不存在......页面将正常加载。”如果这是真的,为什么 Django 抱怨在 urlpatterns 中找不到 account_history 的反向?
  • Wups,你是对的 - 它不是像 {{ foo }} 这样的变量,它是一个 标签{% url foo %}。我把那些搞混了。 :) 其他可以尝试的东西:from django.core.urlresolvers import reverse,在返回之前的某个地方,print reverse('account_history')

标签: django


【解决方案1】:

试试:

{% url users.views.control_panel %}
{% url users.views.history %}

在模板中修改:

url(r'^panel/history/$','theproject.users.views.history',name='account_history'),
url(r'^panel/$','theproject.users.views.control_panel',name='account_panel'),

           ^

在网址中。 (注意第一个参数中的尾部斜杠。)

【讨论】:

    【解决方案2】:

    如果你使用的是 mod_wsgi,那么很简单:

    $ touch /path/to/your/wsgi_file.wsgi
    

    应该可以解决问题(无需重新启动服务器)。

    【讨论】:

      【解决方案3】:

      移动这个:

      url(r'^panel/history/$',
          'theproject.users.views.history',
          name='account_history'
      ),
      

      users/urls.py 到项目级urls.py

      可能是users/urls.py 没有链接到主urls.py,它也定义了/panel/ 的视图

      【讨论】:

      • 如果是这样,那么他最好在主urls.py 中做一个include('users.urls'),并将URL 保留在users/urls.py,而不是移动该URL。
      • 我试过了,但仍然收到NoReverseMatch 错误。至于/users/urls.py是否被主urls.py调用,我相信是:urlpatterns = patterns('',(r'^accounts/', include('theproject.users.urls')))
      【解决方案4】:

      回答我自己的问题(基于here 提供的帮助)...

      由于服务器处于生产状态,因此对 urls.py 的更改在服务器重新启动之前不会产生任何影响。目前我没有su 访问权限,所以不能apachectl restart 但看来这将解决问题。

      【讨论】:

        猜你喜欢
        • 2015-10-24
        • 2017-08-05
        • 1970-01-01
        • 1970-01-01
        • 2013-10-15
        • 2017-07-30
        • 2017-03-14
        • 2017-07-27
        相关资源
        最近更新 更多