2016-08-12 87 views
1

我有以下几点看法:Django的 - 蟒蛇:利用反向失败:没有反向匹配

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' 

和URL:

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+)/$)'] 

可能有人帮我搞清楚什么是错在这里请?

回答

3

问题是您正在使用id,这是一个内置函数。

当您致电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模式中也有太多括号。它应该是:

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

谢谢,但是当我试过了,它给了我“‘EquipmentForm’对象有没有属性‘身份证’” –

+1

我没有当场说'POST'是一种形式,而不是' POST'。这很混乱!使用'form'作为你的表单,'post'作为'Post'实例,它会让你的代码更易于理解!我已经更新了答案。 – Alasdair

+0

对不起,我感到困惑。并非常感谢您的帮助。我尝试了你的更新,它现在是“反向'default_detail'参数'(28,)'和关键字参数'{}'没有找到。''calbase/default /((?P \\ d +)/ $)']”。我想知道问题是否与网址相关? –