在Django中提交表单后未调用View函数

时间:2018-12-15 10:04:44

标签: python django

我在html文件中做了一个简单的表单,其路径为 www.site.com/posts/5 。无论何时提交表单,它都会重定向回同一页面,即 www.site.com/posts/5 ,显示用户在表单中给出的消息。

但是,无论何时提交表单,它都不会调用foobar视图。

urls.py,views.py和html文件如下:-

urls.py

urlpatterns = [
path('posts/<int:foo>',user_views.display, name="display",
path('posts/<int:foo>',user_views.foobar, name="makefoo"),
]

views.py

def foobar(request, foo):
    #do something

html文件

<form name="fooform" action= "{% url 'makefoo' 5 %}" method = "post">
    {% csrf_token %}
    <input type="text" name="FOO_BODY" maxlength="300" required>
    <input type="submit" value="comment">
    <input type="reset" value="clear">
</form>

编辑:user_views只是from user import views as user_views

2 个答案:

答案 0 :(得分:1)

您不能将两个视图附加到相同 URL。 {% url ... %}模板标记只会为该路径生成一个URL。但是,如果存在“ URL冲突”,则请求可能会在另一个视图中结束。

因此,您应该定义另一个URL,或在post视图中对display逻辑进行编码。如果有POST请求,则可以首先采取必要的步骤,然后例如将重定向返回到页面,以便我们可以再次呈现页面:

def display(request, foo):
    if request.method == 'POST':
        # do something
        return redirect(display, foo=foo)
    #do something else (original code)
    return HttpResponse(..)

这是著名的Post/Redirect/Get web development design pattern [wiki]。通常,这比直接在POST中返回HTTP响应要好,因为如果用户执行刷新,则POST将执行 second 次。

答案 1 :(得分:0)

如@williem的评论中所述,您在urls.py中定义了两个path()。

始终会从url路由表中选择第一个匹配的路由。因此,每当请求r ^'posts /'时,它将从user_views调用display(),因此它将永远不会进入foobar()。使用display()删除路线或更改顺序。另外,我假设您导入了user_views。

参考: https://docs.djangoproject.com/en/2.1/topics/http/urls/