【问题标题】:Django 2.0: NoReverseMatch at /url/ (/pledges/group/7/)Django 2.0:/url/ (/pledges/group/7/) 的 NoReverseMatch
【发布时间】:2018-10-27 02:55:26
【问题描述】:

我刚刚从 Django 1.11 升级到 2.0。这些是我为一个 Django 应用程序提供的网址:

urlpatterns = [
    url(r'^logout/$', views.logout, name='logout'),
    url(r'^$', views.home, name='home'),
    url(r'^pledge/(?P<group_id>[0-9]+)/$',
        views.pledge, name='pledge_by_group'),
    # I have more urls, but I have omitted them since they are not relevant
    url(r'^404/$', views.bad_request, name='404')
]

升级后,我检查一切都很好。然后,我改变了:

url(r'^pledge/(?P<group_id>[0-9]+)/$', views.pledge, name='pledge_by_group')

到:

url('pledge/<int:group_id>/', views.pledge, name='pledge_by_group'),

为了在 Django 2.0 中利用 simplified URL routing syntax。但是,当我尝试访问 http://localhost:8000/pledges/group/7/ 时出现以下错误:

NoReverseMatch 在 /pledges/group/7/ 找不到关键字参数“{'group_id': '7'}”的“pledge_by_group”。尝试了 1 种模式:['pledge//']

这是我的看法:

@login_required(redirect_field_name='')
def group_pledge(request, group_id):
    """Some docstring..."""
    # Some code that is not relevant to the problem

    context = {
        'pledge_url':  reverse('pledges:pledge_by_group',
                        kwargs={'group_id': group_id}),
    } # context has more values, but for practical reasons I don't include them

    return render(request, 'pledges/home.html', context)

根据报错,问题出在这一行:

reverse('pledges:pledge_by_group', kwargs={'group_id': group_id})

谁能告诉我发生了什么以及如何解决它?

【问题讨论】:

    标签: python django django-2.0


    【解决方案1】:

    新语法需要使用path 函数。例如:

    from django.urls import path
    
    ...
    path('pledge/<group_id>/', views.pledge, name='pledge_by_group'),
    

    【讨论】:

    • 天哪,我不敢相信,是的,你完全正确。谢谢!!
    猜你喜欢
    • 1970-01-01
    • 2013-09-26
    • 2013-01-19
    • 2015-07-18
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 2017-03-14
    • 2016-06-04
    相关资源
    最近更新 更多