【问题标题】:Django form POST with NoReverseMatch error带有 NoReverseMatch 错误的 Django 表单 POST
【发布时间】:2017-07-17 07:40:18
【问题描述】:

在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/$']

【问题讨论】:

    标签: django forms post


    【解决方案1】:

    通常,这些类型的错误表明 URL 有问题、未找到此类模式、缺少某些参数等等。从这个特定错误看来,您没有将 item_id 传递给 url 匹配器。因此,Django 找不到合适的 URL。你有:

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

    请注意,您写了?P&lt;item_id&gt;[0-9]+)/...,这意味着您必须在想要解析此 URL 时提供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,就像你在成功POST 后重定向一样。尽管您可能还需要传递 item_id,因为您的 URL 配置指定:a) URL 应该有 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)

    【讨论】:

    • 我知道 id 部分有问题,不知道在哪里以及如何。感谢您的详细解释,现在对我来说完全有意义。
    猜你喜欢
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-24
    • 2017-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多