【问题标题】:NoReverseMatch on Django even when kwargs are providedDjango 上的 NoReverseMatch 即使提供了 kwargs
【发布时间】:2018-03-09 00:38:39
【问题描述】:

即使提供了预期的 kwarg,Django 也无法解析 url。

这里是根 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'^media/(?P<path>.*)$','django.views.static.serve',{'document_root': settings.MEDIA_ROOT}),
    url(r'^ckeditor/', include('ckeditor_uploader.urls')),
    url(r'^static/(?P<path>.*)$','django.views.static.serve',{'document_root': settings.STATIC_ROOT}),
    url(r'^(?P<domain>\w+)', include('frontend.urls')),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

这里是前端 urls.py: from django.conf.urls import include,patterns,url

from . import views
from .views import MyprofileView
from .views import SuccessView
from .views import CompanyView
from .views import SubscriptionView


from django.views.decorators.csrf import csrf_exempt

urlpatterns = patterns('',
    url(r'/success(/?)$', SuccessView.as_view(), name='success'),
    url(r'/subscribe(/?)$', SubscriptionView.as_view(), name='subscribe'),
    url(r'^(/?)$', MyprofileView.as_view(), name='home'),
    url(r'/api/v1/', include('cpprofile.api.urls')),
    url(r'/product', include('product_information.urls')),
    url(r'/corporations/(?P<company>\d+)$', CompanyView.as_view(), name='company_page'),
    url(r'^/(?P<subscription>\w+)/product/pay/return/(?P<amount>\d+)/(?P<currency>\w+)/(?P<id>\d+)?$',
        views.payment_return, name='subscription_product_payment_return'),
)

这就是我试图在 view.py MyprofileView 中反向调用它的方式:

context['subscribe_url'] = redirect('subscribe', kwargs={'domain': 'up'})

这里有什么问题?

谢谢


更新 1

这是我得到的错误:

django.core.urlresolvers.NoReverseMatch

NoReverseMatch: Reverse for 'subscribe' with arguments '()' and keyword arguments '{'domain': 'up'}' not found. 1 pattern(s) tried: ['(?P<domain>\\w+)/subscribe(/?)$']

【问题讨论】:

  • 模式/subscribe(/?)$..中没有名为domain的捕获组,(/?)是什么?
  • @AamirAdnan 是用于斜杠的,不过我也试过去掉,没关系,还是没解决。
  • @SachinKukreja 如果你回头看这个问题,我提供了两个 url,一个是 root url conf,其中域被捕获,第二个是前端 urls.py,其中 subscribe 是。
  • @Maverick 你的subscribe url 不需要任何关键字参数。
  • @JahongirRahmonov 看看我的根 urls.py 确实是这样。

标签: django django-views django-urls django-1.8 django-1.11


【解决方案1】:

你必须解压kwargs

解决方案

kwargs = {'domain': 'up'}
redirect('app_name:subscribe', **kwargs)

编辑:这将起作用,无需更改网址。
EDIT2:在 url 名称前添加应用程序名称和冒号。这会在 app 命名空间中找到 url。

参考:Redirect in Django

【讨论】:

  • 不行,这是项目的要求,不能改url。
  • 不,不起作用,kwargs = {'domain': 'up'} context['subscribe_url'] = redirect('subscribe', **kwargs) 和它之间与重定向没有什么不同( '订阅', kwargs={'domain': 'up'})
  • 好的,但无论如何它没有帮助,我已经更新了我遇到的错误。
  • 我之前也试过了,现在你更新后也一样,不,它仍然不适用于命名空间。
【解决方案2】:

我怀疑是因为(/?)。捕获'''/'。所以你必须将它作为非关键字参数传递:

redirect('subscribe', '/', domain='up')

所以这是对 Sachin Kukreja 所说的补充。

【讨论】:

  • 感谢您的回答,但这并没有帮助,它给出了:ValueError ValueError: Don't mix *args and **kwargs in call to reverse()! 我什至尝试了redirect('subscribe', '/', **kwargs),但没有成功同样的错误。
  • 哦,我不知道你不能那样做。在这种情况下,您有三个选择:尝试不带 () 的 /? 是否有效(我不知道),给 / 命名 (?P&lt;slash&gt;/?),或者使用其他人用来处理有或没有路径的重定向中间件斜线...
  • 实际上我删除了那个 (/?) 并且它现在解决了但是使用 Sachins 解决方案,我仍然对这些 kwargs 如何为他工作而不是我们明确提供它感兴趣。
  • 如果你添加 / 添加结尾,Django 应该自动重定向没有斜线的 URL
  • 对于反向,你必须通过 kwargs=,对于重定向 **kwargs。
【解决方案3】:

您需要使用反向来获取正确的 URL,然后重定向到该 URL。

from django.core.urlresolvers import reverse

return redirect(reverse('subscribe', kwargs={'domain': 'up'}))

在您的情况下,您似乎试图将 url 分配给上下文变量,您根本不应该使用重定向。反向解析 URL,重定向返回响应。

context['subscribe_url'] = reverse('subscribe', kwargs={'domain': 'up'})

可能还希望在您的 urlconf 中遵循最佳实践以保持一致性,即以“/”结束所有模式,但不要以“/”开头。正如你在根配置中对大多数人所做的那样:

url(r'^admin/', include(admin.site.urls)), <-- good

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-13
    • 2016-07-24
    • 1970-01-01
    • 1970-01-01
    • 2019-12-12
    • 2022-01-06
    • 1970-01-01
    • 2020-10-01
    相关资源
    最近更新 更多