在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/$']
答案 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)
。