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

Django提交表单后保留指定字段(仅清空amount字段)

问题描述

我有一个具备简单“保存并添加另一个”功能的Django视图,提交表单后会重定向到同一页面。

视图代码

def new_planning(request):
    form = PlanningForm(request.POST)
    if form.is_valid():
        form.save()
        if 'another' in request.POST:
            messages.success(request, ('Success!'))
            return redirect('new_planning')
        else:
            return redirect('list_planning')
    return render(request, 'pages/planning/new_planning.html', context={
        'form': form,
    })

表单代码

class PlanningForm(forms.ModelForm):

    accountplan = ModelChoiceField(
        queryset=AccountsPlan.objects.filter(active=True).order_by('code'),
    )

    month = forms.DateField(
        required=True,
        error_messages={'required': '', },
    )

    amount = forms.DecimalField(
        max_digits=9,
        decimal_places=2,
        required=True,
        validators=[
        error_messages={'required': '', },
    )

    class Meta:
        model = Planning
        fields = '__all__'

当前功能可正常运行,但提交后页面会渲染空白表单。我希望仅清空amount字段,保留accountplan和month字段中输入的数据。是否有实现方法?

我查阅了Django文档中的instance相关内容,但这似乎不是我想要的,因为我不想从数据库获取数据,只想保留这两个字段的上次输入值。


解决方案

要实现保留指定字段值、仅清空amount的需求,不需要重定向,直接基于提交的POST数据构建新表单并重置目标字段即可,具体修改如下:

修改视图代码

def new_planning(request):
    if request.method == 'POST':
        form = PlanningForm(request.POST)
        if form.is_valid():
            form.save()
            if 'another' in request.POST:
                messages.success(request, 'Success!')
                # 复制提交的POST数据,清空amount字段
                new_form_data = request.POST.copy()
                new_form_data['amount'] = ''
                # 用处理后的数据构建新表单
                form = PlanningForm(new_form_data)
                # 标记表单为绑定状态,确保模板渲染时保留已填字段值
                form.is_bound = True
    else:
        # GET请求时初始化空表单
        form = PlanningForm()
    
    return render(request, 'pages/planning/new_planning.html', context={
        'form': form,
    })

修复表单语法错误

你的表单代码中amount字段的validators列表存在语法问题(未闭合括号且缺少有效验证器),修正后示例:

amount = forms.DecimalField(
    max_digits=9,
    decimal_places=2,
    required=True,
    error_messages={'required': '', },
    # 若无需额外验证器可删除validators参数,或补充完整验证器列表
    # validators=[MinValueValidator(0.01),],
)

实现原理

  • 取消重定向逻辑,直接复用用户提交的POST数据,仅清空amount字段后重新构建表单
  • 设置form.is_bound = True保证表单处于绑定状态,模板渲染时会自动填充accountplan和month的旧值
  • 全程无需从数据库读取数据,完全基于用户本次提交的内容复用字段值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 22:45:31