You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:47:42