在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
相关产品推荐
相关产品推荐

