Skip to main content
 首页 » 编程设计

python之新对象的 NoReverseMatch

2025年05月04日15pander-it

使用 Django 1.10.4。我有一个模型 Stream,我为其创建了 CreateView。当通过管理面板创建对象时,一切正常,但是当我使用 CreateView 表单时,创建了一个对象(在管理面板中或在数据库中都没有区别),但尝试通过 DetailView 提供指向它的链接导致错误:

NoReverseMatch at /   
Reverse for 'detail_stream' with arguments '()' and keyword arguments '{'pk': 17}' not found.  
2 pattern(s) tried: ['(?P<pk>[0-9])/$', 'streams/(?P<pk>[0-9])/$'] 

这个错误发生在显示ListView的时候,然后只针对通过CreateView创建的对象。
错误发生的地方:

{% for item in stream_list %} 
    <a href="/streams{% url "detail_stream" pk=item.id %}"> 
    ... 
    </a> 
{% endfor %} 

当您尝试直接转到 DetailView ( http://127.0.0.1:8000/streams/17 ) 404 错误时。
网址.py:

from django.conf.urls import url     
from .views import StreamDetail, StreamUpdate 
 
urlpatterns = [ 
    url(r'^$', StreamList.as_view(), name='streams'), 
    url(r'^(?P<pk>[0-9])/$', StreamDetail.as_view(), name='detail_stream'), 
    url(r'^(?P<pk>[0-9])/update/$', StreamUpdate.as_view()), 
] 

另外,添加到主站点 urlpatterns 的流的 url。

查看:

class StreamCreate(LoginRequiredMixin, CreateView): 
    login_url = '/login/' 
 
    def form_valid(self, form): 
        regex = re.compile('[^a-zA-Z]') 
        newtags = [] 
        for tag in form.cleaned_data['tags']: 
            tag = regex.sub('',tag) 
            newtags.append(tag) 
        form.cleaned_data['tags'] = newtags 
        return super(StreamCreate,self).form_valid(form) 
 
    def form_invalid(self, form): 
        print(form.errors) 
        return super(StreamCreate,self).form_invalid(form) 
 
    def get_success_url(self): 
        return reverse('streams') 

我怀疑我在 CreateView 时没有意识到某些事情,但我无法理解并需要您的帮助。

请您参考如下方法:

您在给定 route 的正则表达式是错误的。

url(r'^(?P<pk>[0-9])/$', StreamDetail.as_view(), name='detail_stream') 

[0-9] 表示它需要一个个位数。 17 有两位数字,因此正则表达式需要考虑到这一点(在此处添加 +)

url(r'^(?P<pk>[0-9]+)/$', StreamDetail.as_view(), name='detail_stream') 

那里的其他一些路由也有同样的问题。