即使提供了 kwargs,Django 上的 NoReverseMatch
NoReverseMatch on Django even when kwargs are provided
Django 无法解析 url,即使提供了预期的 kwarg。
这是根 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:
来自 django.conf.urls 导入包括,模式,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(/?)$']
您必须解压 kwargs
。
解决方法:
kwargs = {'domain': 'up'}
redirect('app_name:subscribe', **kwargs)
编辑:这会起作用,无需更改 url。
EDIT2:在 url 名称前加上应用程序的名称和冒号。这会在应用命名空间中找到 url。
我怀疑是因为 (/?)
。捕获 ''
或 '/'
。所以你必须将其作为非关键字参数传递:
redirect('subscribe', '/', domain='up')
所以这是对 Sachin Kukreja 所说内容的补充。
您需要使用反向来获得正确的 URL,然后重定向到那个。
from django.core.urlresolvers import reverse
return redirect(reverse('subscribe', kwargs={'domain': 'up'}))
在您的情况下,您似乎试图将 url 分配给上下文变量,您根本不应该使用重定向。反向解析 URL,重定向 returns 一个响应。
context['subscribe_url'] = reverse('subscribe', kwargs={'domain': 'up'})
可能还希望遵循 urlconf 的最佳实践以保持一致性,即所有模式都以“/”结尾,但不要以“/”开头。正如您在根配置中对它们中的大多数所做的那样:
url(r'^admin/', include(admin.site.urls)), <-- good
Django 无法解析 url,即使提供了预期的 kwarg。
这是根 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: 来自 django.conf.urls 导入包括,模式,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(/?)$']
您必须解压 kwargs
。
解决方法:
kwargs = {'domain': 'up'}
redirect('app_name:subscribe', **kwargs)
编辑:这会起作用,无需更改 url。
EDIT2:在 url 名称前加上应用程序的名称和冒号。这会在应用命名空间中找到 url。
我怀疑是因为 (/?)
。捕获 ''
或 '/'
。所以你必须将其作为非关键字参数传递:
redirect('subscribe', '/', domain='up')
所以这是对 Sachin Kukreja 所说内容的补充。
您需要使用反向来获得正确的 URL,然后重定向到那个。
from django.core.urlresolvers import reverse
return redirect(reverse('subscribe', kwargs={'domain': 'up'}))
在您的情况下,您似乎试图将 url 分配给上下文变量,您根本不应该使用重定向。反向解析 URL,重定向 returns 一个响应。
context['subscribe_url'] = reverse('subscribe', kwargs={'domain': 'up'})
可能还希望遵循 urlconf 的最佳实践以保持一致性,即所有模式都以“/”结尾,但不要以“/”开头。正如您在根配置中对它们中的大多数所做的那样:
url(r'^admin/', include(admin.site.urls)), <-- good