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

Django视图与模板布尔逻辑处理问题求助

问题1:根据Boolean字段控制表单是否保存

问题分析

原代码直接调用form.save(),无论用户选择"Yes"还是"No"都会保存数据,还存在拼写错误(sub.sumit应为sub.submit),且缺少核心的条件分支逻辑。正确逻辑应该是:先验证表单有效性,再根据submit字段的值决定是否保存,未保存时返回编辑页面。

修正后的views.py代码

def submit(request):
    if request.method == 'POST':
        form = submitForm(request.POST)
        if form.is_valid():
            # 先获取表单中的submit字段值,暂不保存
            should_submit = form.cleaned_data['submit']
            if should_submit:
                # 选择Yes时保存数据并跳转
                form.instance.user = request.user
                form.save()
                messages.info(request, 'You have submitted your form successfully')
                return redirect('home')
            else:
                # 选择No时不保存,提示继续编辑
                messages.info(request, 'Continue editing your data')
                return render(request, 'portal/home/submit.html', {'form': form})
        # 表单验证失败时返回原页面
        return render(request, 'portal/home/submit.html', {'form': form})
    form = submitForm()
    context = {'form': form}
    return render(request, 'portal/home/submit.html', context)

问题2:根据Boolean字段控制模板按钮显示

问题分析

原代码中sub = SubmitData.objects.filter(user_id=user)返回的是QuerySet对象,模板中{% if sub %}只要用户有SubmitData记录就会隐藏Save/Update按钮,但实际需要判断用户是否存在submit=True的记录。此外,若用户有多条记录,应取最新的一条来判断状态。

步骤1:修正user_info视图代码

def user_info(request):
    user = request.user
    try:
        personal = Personalinfo.objects.get(user_id=user)
    except Personalinfo.DoesNotExist:
        messages.error(request, 'Please fill in all data')
        personal = None
    
    # 获取用户最新的SubmitData记录(按提交时间倒序取第一条)
    sub = SubmitData.objects.filter(user_id=user).order_by('-date_submited').first()

    if request.method == "POST":
        form = usersForm(request.POST, request.FILES, instance=personal)
        if form.is_valid():
            form.instance.user = request.user
            form.save()          
            messages.success(request, 'User data saved successful! Click next to proceed')
            return redirect('user_info')
        else:
            messages.error(request, 'Error! Check your data')
            return redirect('user_info')
      
    form = usersForm(instance=personal)
    context = {
        "form": form,
        'sub': sub,
    }
    return render(request, 'portal/home/user_info.html', context)

步骤2:修正模板判断逻辑

模板需要判断sub是否存在且sub.submit为True,此时隐藏Save/Update按钮;其他情况显示所有按钮:

{% if sub and sub.submit %}
<div class="col-md-4 col-sm-3">
    <div class="text-center">
        <a class="btn btn-dark text-decoration-none text-white bg-dark mt-4 mb-0" href="{% url 'academy' %}">Next</a>      
    </div>
</div>
{% else %}
<div class="row">
    <div class="col-md-10 col-sm-10 mx-auto ">
        <button type="submit" name="register" class="text-white btn bg-dark mt-4 mb-0">
            Save
        </button>
        <a class="btn btn-dark text-decoration-none text-white btn bg-dark mt-4 mb-0" href="{% url 'user_update' request.user.pk %}"> Update </a>      
        <a class="btn btn-dark text-decoration-none text-white bg-dark mt-4 mb-0" href="{% url 'academy' %}">Next</a>    
    </div>
</div>
{% endif %}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 04:30:50