2017-02-26 71 views
0

在HTML:Django的表單POST與NoReverseMatch錯誤

<form role="form" method="post" action="{% url 'myapp:add_review' %}" enctype="multipart/form-data"> 
    {% csrf_token %} 
    <div class="form-group"> 
     <div class="col-sm-10"> 
      <input id="review" name="review" type="text"> 
     </div> 
    </div> 
    <button type="submit" class="btn btn-default"> Submit </button> 
</form> 

在訪問量:

def add_reviews(request): 
    if request.method == "POST": 
     print "Post is here:", request.POST['review'] 
     return render(request, 'myapp/single_item.html') 
     //or this?? return redirect('myapp:single_item') 

在urls.py

app_name = 'myapp' 
urlpatterns = [ 
    url(r'^$', views.IndexView.as_view(), name='index'), 

    # register, login, logout 
    url(r'^register/$', views.UserFormView.as_view(), name='register'), 
    url(r'^login/$', views.login_user, name='login'), 
    url(r'^logout/$', views.logout_user, name='logout'), 

    # individual article page 
    url(r'^(?P<item_id>[0-9]+)/$', views.single_item, name='single_item'), 
    url(r'^(?P<item_id>[0-9]+)/add_review/$', views.add_review, name='add_review'), 
] 

真的基本的東西,在每個單件商品頁面,我想要一個表單來撰寫和發佈每個商品的評論,然後返回到相同的商品頁面。

當我在單件商品頁面我,使我有以下錯誤:

Reverse for 'add_review' with arguments '('',)' and keyword arguments '{}' not found. 
1 pattern(s) tried: ['(?P<item_id>[0-9]+)/add_review/$'] 

回答

1

一般來說,這些類型的錯誤表明自己是不是正確與URL,這樣的格局沒有被發現,它錯過了一些參數等等。從這個特定的錯誤,你似乎沒有通過item_id到URL匹配器。因此,Django無法找到合適的URL。你:你寫?P<item_id>[0-9]+)/...,這意味着你必須提供item_id,每當你想這個URL得到解決

url(r'^(?P<item_id>[0-9]+)/add_review/$', views.add_review, name='add_review') 

通知。嘗試添加item_id作爲關鍵字參數:

<form role="form" method="post" action="{% url 'myapp:add_review' item_id= ... %}" enctype="multipart/form-data"> 

這應該構造一個有效的URL(例如,.../1/add_review/),其應當由Django的識別。但是,我相信你的add_review()函數也需要參數item_id,否則由於意外的函數參數你可能得到TypeError

至於返回值,我會使用redirect而不是render,因爲您在成功POST後重定向。雖然您也可能需要通過item_id,因爲您的網址配置指定:a)網址應該有item_id,b)single_item()需要item_id。像這樣的東西應該工作:

def add_review(request, item_id): 
    ... 
    return redirect('myapp:single_item', {'item_id': item_id}) 

single_item簽名應該是這樣的:single_item(request, item_id)

+1

我知道id部分有些問題,無法弄清楚在哪裏以及如何。謝謝你的詳細解釋,現在對我完全有意義。 – viviwill