Django url 模板标签给出 NoReverseMatch 错误

Posted

技术标签:

【中文标题】Django url 模板标签给出 NoReverseMatch 错误【英文标题】:Django url template tag gives NoReverseMatch Error 【发布时间】:2014-07-17 21:34:26 【问题描述】:

我已经尝试了所有方法,并且阅读了有关该主题的所有问题/答案,但没有什么对我有用。我希望有人可以提供另一种可能的解决方案。

我有几个应用程序。其中之一是ManagerApp,其中之一是Accounts

Accounts 应用程序中,有一个名为view_user 的视图。它在 url 文件中被描述为

url(r'^user/view/(?P<username>.+)/$', views.view_user, name='view_user')

base.html 中,有一个带有用户名的标题栏。当他点击他的名字时,我希望他被带到他的个人资料页面。所以它的内容如下;

...
<ul class="nav navbar-nav navbar-right">
          % if user.is_authenticated %
            <li><a href="% url 'accounts.views.view_user' user.username %">user.username</a></li>
          % else %
            <li><a href="#">My Account</a></li>
          % endif %
...

但是当我尝试加载页面时,我得到了一个

**NoReverseMatch at /ManagerApp/main/
Reverse for 'accounts.views.view_user' with arguments '(u'johnny',)' and keyword arguments '' not found.**

为什么会这样?我用引号,语法没问题。 UrlConf 命名正确,等等。我只是看不到问题,已经一个小时了:-(

已添加

这是视图定义:

def view_user(request, username):
    ''' Shows user data '''
    user = get_object_or_404(User, username = username) #check if user name exist    
    groups = Group.objects.filter(users = user)
    context = 'user': user, 'groupsOfUser': groups
    return render(request, 'accounts/view_user.html', context)

【问题讨论】:

为什么不使用 url 的参数 name 中的值呢? (即% url 'view_user' username=user.username %。您的参数也称为命名参数,因此您必须通过它的名称(username @yedpodtrzitko 如果我不指定应用名称,Django 怎么知道'view_user' 在哪里?请记住,此视图位于不同的应用中。 嗯...我现在唯一能建议的就是系统地测试每个部分。首先删除所有参数要求,然后使用url(r'^user/view/$', views.view_user, name='view_user')。修改您的视图函数以删除参数:def view_user(request):。如果它仍然不起作用,您需要更深入地挖掘 URL 未加载的原因。如果它有效,那么它可能与正则表达式有关。就个人而言,我总是在 URL 中使用数字 ID,而不是用户名,因为它们可能包含有趣的字符。哦,还要删除所有视图装饰器以将它们隔离为一个原因 ....问题是....我没有关闭并重新启动服务器。当我这样做时,使用此处推荐的设置,它起作用了。谢谢大家的建议。 哈哈,这也发生在我身上。特别是因为修改模板文件不需要重新启动,但修改视图/url 需要重新启动。棘手! 【参考方案1】:

您需要在url 模板标签内传递一个username 关键字参数:

% url 'view_user' username=user.username %

另外,正如@yedpodtrzitko 建议的那样,您可以使用视图名称而不是完整路径。

不要忘记重新启动服务器,以便更改生效。

【讨论】:

这就是我不喜欢 URL 中的命名参数的原因。 @Imray 嗯,好的,现在的错误信息是什么? (请包括完整的追溯)谢谢。 @Imray 按照 yedpodtrzitko 的建议尝试使用 % url 'view_user' username=user.username %。看起来您提供的名称无效:accounts.views.view_user 即使在@user193130 建议之后,仍然出现错误:Reverse for 'view_user' with arguments '()' and keyword arguments 'u'username': u'johnny'' not found. @Imray 只是想知道是否实际加载了包含url(...) 的urlconf...如果您访问url http://127.0.0.1:8000/user/view/johnny/,它会呈现您预期的模板还是404 错误?【参考方案2】:

您使用的是哪个版本的 django。如果它的旧版本意味着 1.3,那么您可能必须在顶部的模板文件中使用以下行

% load url from future %

如果您使用的是 django 1.5,那么 alecxe 解决方案是完美的,因为除此之外,我在代码/流程中看不到任何错误

【讨论】:

我正在使用问题中标记的 1.5 他肯定在使用 1.5+,因为如果他尝试在 % url '...' % 中使用引号,django 会给出不同的错误... @user193130 实际上我在使用旧版本的 django 时遇到了类似的错误。一切都很好,除非我发现您需要使用我上面在旧版本中提到的标签。当我放置标签时,事情开始工作了..:)

以上是关于Django url 模板标签给出 NoReverseMatch 错误的主要内容,如果未能解决你的问题,请参考以下文章

django url 模板标签的问题,% url %

Django:URL模板标签中的模型参数

django 模板标签 url 仅在最后一个空 url 模式时有效

模板 url 标签无法识别 Django 命名的 url

Django:URL conf、url 模板标签的最佳实践

django 模板 URL 标签错误