2016-08-12 107 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 +)/ $)']」。我想知道問題是否與網址相關? –