2017-02-26 87 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