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 错误的主要内容,如果未能解决你的问题,请参考以下文章