【问题标题】:Django url template tag gives NoReverseMatch ErrorDjango url 模板标签给出 NoReverseMatch 错误
【发布时间】: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 需要重新启动。棘手!

标签: django django-urls django-templates django-1.5


【解决方案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 时遇到了类似的错误。一切都很好,除非我发现您需要使用我上面在旧版本中提到的标签。当我放置标签时,事情开始工作了..:)
猜你喜欢
  • 1970-01-01
  • 2012-09-10
  • 1970-01-01
  • 2012-10-10
  • 2012-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-14
相关资源
最近更新 更多