使用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错误时 urls.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()),
]
此外,流的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上没有意识到的东西,但我无法理解,需要你的帮助。
答案 0 :(得分:6)
您在给定路线中的正则表达式是错误的。
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')
其他一些路线也有同样的问题。