Django表单项目中税值0.17无法写入数据库问题求助
Django表单税率字段无法写入数据库的解决方案
问题根源
你当前代码的核心问题是直接修改了CustomerDetail模型类的tax属性——这是类级别的修改,并非针对当前要保存的实例对象赋值。form.save()保存的是表单绑定的实例,和你修改的类属性毫无关联,所以数据库中tax列始终显示NULL。
修复后的视图代码
方式一:先获取实例再修改保存
def addcustomer_view(request): form = CustomerForm(request.POST or None) if form.is_valid(): taxamount = request.POST.getlist('taxamount') # 获取表单绑定的实例,暂不写入数据库 instance = form.save(commit=False) if taxamount == ['0.17']: print('Tax added to database') instance.tax = 0.17 else: print('Tax not added to database') instance.tax = 0 # 保存修改后的实例到数据库 instance.save() return render(request, "customer.html")
方式二:直接修改表单绑定的实例
def addcustomer_view(request): form = CustomerForm(request.POST or None) if form.is_valid(): taxamount = request.POST.getlist('taxamount') if taxamount == ['0.17']: print('Tax added to database') form.instance.tax = 0.17 else: print('Tax not added to database') form.instance.tax = 0 form.save() return render(request, "customer.html")
其他实现方式
1. 逻辑封装到表单类(推荐)
把税率判断逻辑放在表单里,让视图代码更简洁:
# forms.py from django import forms from .models import CustomerDetail class CustomerForm(forms.ModelForm): # 定义复选框,设置value为0.17 taxamount = forms.BooleanField(required=False, label="是否含税", widget=forms.CheckboxInput(attrs={'value': '0.17'})) class Meta: model = CustomerDetail fields = ['customer_name', 'customer_number', 'Ship_No', 'Cell_qty', 'Cell_price', 'thimble', 'thimble_price', 'Description'] def clean(self): cleaned_data = super().clean() # 根据复选框状态设置tax值 cleaned_data['tax'] = 0.17 if cleaned_data.get('taxamount') else 0 return cleaned_data
视图代码可简化为:
def addcustomer_view(request): form = CustomerForm(request.POST or None) if form.is_valid(): form.save() return render(request, "customer.html")
2. 通过复选框选中状态直接判断
不需要传递具体数值,仅通过复选框是否选中来赋值:
- HTML中复选框name设为
is_taxable - 视图代码:
def addcustomer_view(request): form = CustomerForm(request.POST or None) if form.is_valid(): instance = form.save(commit=False) instance.tax = 0.17 if request.POST.get('is_taxable') else 0 instance.save() return render(request, "customer.html")
内容的提问来源于stack exchange,提问作者Rana Talha
相关产品推荐
相关产品推荐

