在django中提交表单后,没有调用View函数



我在一个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"),
]

视图.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

不能将两个视图附加到相同的URL。{% url ... %}模板标记,仅为该路径生成URL。但是,如果存在">url冲突",则请求可能最终出现在另一个视图中。

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

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

这就是著名的Post/Rerect/Getweb开发设计模式[wiki]。这通常比直接在POST中返回HTTP响应要好,因为如果用户执行刷新,POST将执行

正如@williem在评论中提到的,您在urls.py.中定义了两个路径((

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

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

最新更新