【问题标题】:Django Error passing URL argument from Template to View: NoReverseMatch Reverse not found. 1 pattern(s) triedDjango 错误将 URL 参数从模板传递到视图:NoReverseMatch 未找到反向。已尝试 1 种模式
【发布时间】:2015-12-31 04:49:30
【问题描述】:

我正在尝试像这样传递配置 URL:

/details/12345

模板 HTML:

    <div class="row">
    {% if article_list %}
    {% for article in article_list %}
    <div>
      <h2>{{ article.title }}</h2>
      <p>{{ article.body }}</p>
      <p><a class="btn btn-default" href="{% url 'details' article.id %}" role="button">View details &raquo;</a></p>
    </div><!--/.col-xs-6.col-lg-4-->
    {% endfor %}
    {% endif %}
  </div><!--/row-->

urls.py(完整):

    from django.conf import settings
from django.conf.urls import include, url
from django.conf.urls.static import static
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'^$', 'news_readr.views.home', name='home'),
    url(r'^details/(?P<article_id>\d+)/$', 'news_readr.views.details', name='details'),
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

if settings.DEBUG:
    urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

views.py:

from django.shortcuts import render
from .models import Article

# Create your views here.
def home(request):
    title = "Home"
    article_list = Article.objects.all()
    for article in article_list:
        print(article.id)
    context = {
               "title": title,
               "article_list": article_list,
               }
    return render(request, "home.html", context)

def details(request, article_id = "1"):
    article = Article.objects.get(id=article_id)
    return render(request, "details.html", {'article': article})

我收到一条错误消息:

 NoReverseMatch at /

Reverse for 'details' with arguments '()' and keyword arguments '{}'
not found. 1 pattern(s) tried: ['details/(?P<article_id>\\d+)/$']

我在 Django 工作一周大,我认为我的 URL 命名组配置有问题。请帮忙!蒂亚!

更新:如果我删除 URL 配置并将其更改回:

url(r'^details/$', 'news_readr.views.details', name='details'),

错误变为:

使用参数“(1,)”和关键字参数“{}”反转“详细信息” 未找到。尝试了 1 种模式:['details/$']

因此,在这种情况下,它似乎正在接受通过 1 传递的参数。所以这似乎是正则表达式的问题。我在 Pythex 尝试了这个表达式,但即使在那里,这个表达式似乎也不匹配任何东西。

【问题讨论】:

  • arguments '()' 是我在使用{% url 'details' article.id %} 时遇到的错误与我在{% url 'details' %}/article.id 上遇到的完全相同的错误这就是为什么我认为它与 RegEx 或 URLConf 有关
  • {% url 'details' article.id %} 匹配 url 模式,只要 article.id 是一个有效的 id。作为测试,尝试删除 url 标签并在循环中包含 {{ article }}{{ article.id}} 以查看它们的输出。
  • articlearticle.id 都很好。我尝试在 url 标签外的屏幕上打印它们。我仍然认为它必须与 URLConf 有关。也许进口或缺少什么我不知道!
  • 我应该将视图导入到我的 urls.py 中吗?
  • 推荐的方法是在你的 urls.py 中导入视图,但这不是问题所在。在 Django 1.10 之前使用该字符串。

标签: python regex django urlconf


【解决方案1】:

对于网址格式

url(r'^details/(?P<article_id>\d+)/$', 'news_readr.views.details', name='details'),

标签的正确使用方式是

{% url 'details' article.id %}

这是因为details url 模式有一个组article_id,所以你必须将它传递给标签。

如果您有上述 url 模式,并且 {{ article.id}} 在模板中正确显示,则上述模板标签不应给出错误 Reverse for 'details' with arguments '()'。这表明你没有更新代码,或者你没有在更改代码后重新启动服务器。

如果您将 url 模式更改为

url(r'^details/$', 'news_readr.views.details', name='details')

那么您需要从 url 标记中删除 article.id

{% url 'details' %}

【讨论】:

  • 感谢您的评论!不过,我不太明白您答案的第一部分。 {% url 'details' article.id %} 与我使用的相同。我在这里错过了什么吗?
  • 如果您查看问题,我已经提到:“我尝试更改参数传递给的方式:{% url 'details' article.id %}”这没有帮助: (在问题中也改变了这一点
  • 我确实看过这个问题 - 你说你尝试了两种方法,所以我告诉你哪个是正确的,并试图解释原因。如果还是不行,不代表url标签错了,问题可能出在其他地方。
  • 对。我明白。我只是想了解 urlconfig 有什么问题
  • 我应该将视图导入到我的 urls.py 中吗?
【解决方案2】:

我猜你的模式是错误的。(不是正则表达式专家)。 试试这个

url(r'^details/((?P<article_id>[0-9]+)/$', 'news_readr.views.details', name='details'),

【讨论】:

  • 括号不平衡不是吗?我删除了额外的开放括号并尝试了url(r'^details/(?P&lt;article_id&gt;[0-9]+)/$', 'news_readr.views.details', name='details'),但这并没有做任何事情
  • 是的,括号不平衡。如果不是这种情况,请检查文章 id 是否正确传递并设置了 id。您也可以使用 article.pk 而不是 id 进行检查。这是一些小错误,其他一切都很好。
  • article.pk 给出了完全相同的错误。我现在确信问题出在 views.py 或 urls.py .. url 标签似乎没问题。您还发现其他可能出错的地方吗?
  • 我应该将视图导入到我的 urls.py 中吗?
  • 是的,您应该将视图导入 urls.py。我通常从 news_readr.view import * url(r'^details/(?P[0-9]+)/$', details, name='details'),
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-13
  • 1970-01-01
  • 2018-11-18
  • 2018-02-08
  • 1970-01-01
  • 1970-01-01
  • 2021-02-03
相关资源
最近更新 更多