Python3-Django1.9:提交文章创建请求为何触发多次创建尝试?
解决Django创建文章时同时显示成功/失败提示的问题
嘿,我之前也碰到过类似的坑,咱们一步步拆解问题根源和解决方案:
问题核心原因
你当前的视图逻辑在**GET请求(用户首次打开创建页面)**时就触发了错误提示:
当用户通过GET访问post_create页面时,form = PostForm(request.POST or None)会生成一个未绑定的空表单,此时form.is_valid()返回False,代码会执行else分支添加「创建失败」的提示消息。这个消息会存在Django的session中,直到被页面渲染展示。
当用户填写表单提交(POST请求)成功后,视图会重定向到文章详情页,此时session里同时存着GET请求时的失败提示和POST成功后的成功提示,最终就出现了两种提示同时显示的异常。
修复方案1:区分GET/POST请求处理逻辑
修改views.py中的post_create函数,只在用户提交表单(POST请求)且验证失败时,才添加错误提示:
from django.contrib import messages from django.http import HttpResponseRedirect from django.shortcuts import render from .forms import PostForm from .models import Post def post_create(request): if request.method == 'POST': # 仅处理POST提交的表单 form = PostForm(request.POST) if form.is_valid(): instance = form.save(commit=False) instance.save() messages.success(request, "Successfully Created") return HttpResponseRedirect(instance.get_absolute_url()) else: messages.error(request, "Not Successfully Created") else: # GET请求时生成空表单,不添加任何提示 form = PostForm() context = { "form": form, } return render(request, "post_form.html", context)
修复方案2:保留原有结构但增加判断
如果你不想大幅改动现有代码,也可以在添加错误提示前判断请求方法:
def post_create(request): form = PostForm(request.POST or None) if form.is_valid(): instance = form.save(commit=False) instance.save() messages.success(request, "Successfully Created") return HttpResponseRedirect(instance.get_absolute_url()) elif request.method == 'POST': # 仅POST请求验证失败时才提示错误 messages.error(request, "Not Successfully Created") context = { "form": form, } return render(request, "post_form.html", context)
额外小修复:表单标签闭合
你的post_form.html里<form>标签没有闭合,虽然不是当前问题的直接原因,但可能导致浏览器解析异常,建议补上闭合标签:
<!--DOCTYPE html --> <html> <head> <title>Create Post</title> </head> <body> <h1>Create New Post</h1> <form method="POST" action="">{% csrf_token %} {{ form.as_p }} <input type="submit" value="Create Post"/> </form> <!-- 补上闭合标签 --> </body> </html>
这样修改后,用户首次打开创建页面时不会触发错误提示,只有提交无效表单时才会显示失败提示,成功提交后只会展示成功提示,就不会出现两种提示同时显示的情况了。
内容的提问来源于stack exchange,提问作者BrightHalo
相关产品推荐
相关产品推荐

