Python 新对象的NoReverseMatch

Python 新对象的NoReverseMatch,python,django,Python,Django,使用Django 1.10.4。我有一个模型流,我为它创建了CreateView。当通过“管理”面板创建对象时,一切正常,但当我使用表单CreateView时,会创建一个对象(无论是在“管理”中还是在数据库中,都与其他对象没有区别),但尝试通过DetailView提供指向该对象的链接会导致错误: NoReverseMatch at / Reverse for 'detail_stream' with arguments '()' and keyword arguments '{'pk': 1

使用Django 1.10.4。我有一个模型流,我为它创建了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])/$']

我怀疑这是我在CreateView没有意识到的,但我无法理解这一点,需要您的帮助

给定路径中的正则表达式是错误的

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

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

给定路由中的正则表达式是错误的

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

其他一些路线也有同样的问题。

我从您的问题中删除了一些似乎与问题无关的细节。如果您认为需要任何内容,请随时将其添加回@yedpodtrzitko,并修复@yedpodtrzitko答案中的正则表达式,您应该将模板中的链接更改为
。使用url标记时,您不需要
/streams
前缀。@Alasdair谢谢您,但我认为我需要它,因为我在主url模式中有此视图,例如,它是相同的,但我希望用户转到/streams,这是非常不寻常的。如果可能的话,我会避免在
/1/
/streams/1/
上使用相同的内容。即使您确实想这样做,您也应该能够使用不同的名称或名称空间,这样您就不必硬编码
/streams
前缀。@Alasdair谢谢您提醒我这一点,它需要重构。我从您的问题中删除了一些似乎与问题无关的细节。如果您认为需要任何内容,请随时将其添加回@yedpodtrzitko,并修复@yedpodtrzitko答案中的正则表达式,您应该将模板中的链接更改为
。使用url标记时,您不需要
/streams
前缀。@Alasdair谢谢您,但我认为我需要它,因为我在主url模式中有此视图,例如,它是相同的,但我希望用户转到/streams,这是非常不寻常的。如果可能的话,我会避免在
/1/
/streams/1/
上使用相同的内容。即使您确实想这样做,您也应该能够使用不同的名称或名称空间,这样您就不必硬编码
/streams
前缀。@Alasdair谢谢您提醒我这一点,它需要重构
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')
url(r'^(?P<pk>[0-9])/$', StreamDetail.as_view(), name='detail_stream')
url(r'^(?P<pk>[0-9]+)/$', StreamDetail.as_view(), name='detail_stream')