我在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
答案 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。