django - python:使用reverse失败:没有反向匹配

时间:2016-08-12 15:04:36

标签: python django django-urls

我有以下观点:

def default_new (request):
    if request.method == "POST":
        post = EquipmentForm(request.POST)
        if form.is_valid():
            post.save()
            return HttpResponseRedirect(reverse('calbase:default_detail', args=(id,)))
    else:
        form = EquipmentForm()
    return render(request, 'calbase/default_edit.html', {'form':form})

class default_detail (generic.DetailView):
    model = Equipment
    template_name = 'calbase/default_detail.html'

并且网址:

urlpatterns = [
    url(r'^$', views.default, name = 'default'),
    url(r'^default/((?P<id>\d+)/$)', views.default_detail.as_view(), name = 'default_detail'),
    url(r'^default/new/$', views.default_new, name = 'default_new'),
]

我想在这里做的只是接受表单输入,保存,然后重定向到其详细视图。但是,虽然表单已正确保存,但它总是给我错误:

NoReverseMatch at /calbase/default/new/
Reverse for 'default_detail' with arguments '(<built-in function id>,)' and keyword arguments '{}' not found. 1 pattern(s) tried: ['calbase/default/((?P<id>\\d+)/$)']

有人可以帮我弄清楚这里有什么不对吗?

1 个答案:

答案 0 :(得分:3)

问题是您使用的是id,这是一个内置功能。<​​/ p>

当您致电form.save()时,它会返回Post个实例。如果您愿意,可以使用post.id(或post.pk)来获取帖子的ID。

def default_new(request):
    if request.method == "POST":
        form = EquipmentForm(request.POST)
        if form.is_valid():
            post = form.save()
            return HttpResponseRedirect(reverse('calbase:default_detail', args=(post.id,)))

您的网址格式中也有太多括号。它应该是:

url(r'^default/(?P<id>\d+)/$', views.default_detail.as_view(), name = 'default_detail'),