我在一个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/