Django与NoReverseMatch错误形成POST

时间:2017-02-26 19:25:54

标签: django forms post

在html中:

<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 个答案:

答案 0 :(得分:1)

通常,这些类型的错误表明某些内容与URL不匹配,未找到此类模式,错过某些参数等等。从这个特定错误看来,您似乎没有将item_id传递给url匹配器。因此,Django无法找到合适的URL。你有:

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

请注意,您编写了?P<item_id>[0-9]+)/...,这意味着只要您希望解析此网址,就必须提供item_id。尝试添加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,因为你很好,在成功发布后重定向。虽然您可能也需要传递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)