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

在Django Template中为函数添加条件上下文 解决成功提示默认显示问题

问题根源

你代码的问题出在视图函数的返回逻辑上:

  • 所有未命中「POST提交且表单验证通过」分支的请求,包括首次GET访问、POST提交但表单校验失败的场景,最终都会走到函数末尾的return render语句,而你在这里把successful_submit硬编码为True,所以模板的判断条件始终成立,提示自然一直展示。
  • 同时你在表单校验成功后直接返回render渲染的页面,会存在用户刷新页面重复提交表单的问题。

修复方案

方案1:快速修复现有逻辑

仅修改视图层的传值即可,统一状态初始化逻辑,避免硬编码:

def add__plan(request):
    # 初始化提交状态为失败
    successful_submit = False
    if request.method == 'POST':
        form = infoForm(request.POST)
        if form.is_valid():
            form.save()
            _name = form.cleaned_data.get('Name')
            messages.success(request, f'PDF created for {_name}!')
            # 仅校验成功时修改状态
            successful_submit = True
    else:
        form = infoForm()
        print(form.errors)
    # 所有场景统一返回上下文
    return render(request, 'plan/plan.html', {'form': form, 'successful_submit': successful_submit })

方案2:更规范的重定向方案(推荐)

符合PRG(Post/Redirect/Get)模式,避免用户刷新页面重复提交表单,可直接复用你已经引入的Django messages框架,不需要额外定义successful_submit变量:

视图层修改

from django.shortcuts import redirect, reverse

def add__plan(request):
    if request.method == 'POST':
        form = infoForm(request.POST)
        if form.is_valid():
            form.save()
            _name = form.cleaned_data.get('Name')
            messages.success(request, f'PDF created for {_name}!')
            # 重定向到表单页
            return redirect(reverse('plan:plan'))
    else:
        form = infoForm()
    return render(request, 'plan/plan.html', {'form': form})

模板层修改

直接判断是否存在消息即可,还可以直接展示你设置的动态提示内容:

{% if messages %}
{% for message in messages %}
<!--Grid column-->
<div class="col-md-3 mb-4">
  <div
    class="toast fade show"
    role="alert"
    aria-live="assertive"
    aria-atomic="true"
  >
    <div class="toast-header">
      <strong class="me-auto">MDBootstrap</strong>
      <small>刚刚</small>
      <button
        type="button"
        class="btn-close"
        data-mdb-dismiss="toast"
        aria-label="Close"
      ></button>
    </div>
    <div class="toast-body">
      {{ message }}
    </div>
  </div>
</div>
<!--Grid column-->
{% endfor %}
{% endif %}

内容的提问来源于stack exchange,提问作者A_K

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 14:06:02