使用 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')
那里的其他一些路由也有同样的问题。
