当前位置:  开发笔记 > 编程语言 > 正文

NoReverseMatch用于新对象

如何解决《NoReverseMatch用于新对象》经验,为你挑选了1个好方法。

使用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[0-9])/$', 'streams/(?P[0-9])/$']

显示ListView时会发生此错误,然后仅对通过CreateView创建的对象发生此错误.
发生错误的地方:

{% for item in stream_list %}
    
    ...
    
{% endfor %}

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

from django.conf.urls import url    
from .views import StreamDetail, StreamUpdate

urlpatterns = [
    url(r'^$', StreamList.as_view(), name='streams'),
    url(r'^(?P[0-9])/$', StreamDetail.as_view(), name='detail_stream'),
    url(r'^(?P[0-9])/update/$', StreamUpdate.as_view()),
]

此外,流的url添加到主站点urlpatterns.

视图:

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上没有意识到的东西,但我无法理解,需要你的帮助.



1> yedpodtrzitk..:

您在给定路线中的正则表达式是错误的.

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

[0-9]意味着它需要一位数的数字.17有两位数,所以正则表达式需要考虑到这一点(在+那里添加)

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

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

推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有