通过 null=True 后,禁用字段被标记为必填

disabled field is marked as required after passing null=True

我有一个表格,其中有一个字段,如数量、费率、basic_amount(禁用)、增值税、other_expenses 和 net_amount(禁用)。 basic_amount 字段是根据数量和费率计算的,net_amount 是 basic_amount、other_expenses 和增值税的计算。为此,我使用信号在用户提交表单时保存到数据库。当我提交表单时,我收到一条错误消息,指出 basic_amount 和 net_amount 是必需的,尽管我已经将 blank=True, null=True 属性传递给它们。

我现在如何保存 basic_amount 和 net_amount?

这是我的代码

class PurchaseOrder(models.Model):
    item = models.ForeignKey(Item, blank=True, null=True)
    quantity = models.PositiveIntegerField(default=0)
    rate = models.DecimalField(default=0.0, max_digits=100, decimal_places=2)
    basic_amount = models.DecimalField(default=0.0, max_digits=100, decimal_places=2, blank=True, null=True)
    vat = models.CharField(max_length=10, blank=True, null=True)
    other_expenses = models.DecimalField(default=0.0, max_digits=100, decimal_places=2)
    net_amount = models.DecimalField(default=0.0, max_digits=100, decimal_places=2, blank=True, null=True)

def save_basic_amount_and_net_amount(sender, instance, *args, **kwargs):
    if (instance.quantity and instance.rate):
        instance.basic_amount = instance.quantity * instance.rate
    if (instance.basic_amount and instance.vat and instance.other_expenses):
        instance.net_amount = instance.amount - instance.other_expenses - instance.vat
pre_save.connect(save_basic_amount_and_net_amount, sender=PurchaseOrder)


class PurchaseOrderForm(forms.ModelForm):
    basic_amount = forms.DecimalField(disabled=True)
    net_amount = forms.DecimalField(disabled=True)
    class Meta:
        model = PurchaseOrder
        exclude = ('office', 'timestamp', 'updated', )

def purchase_order(request):
    form = PurchaseOrderForm(request.POST or None)
    if request.method == "POST" and form.is_valid():
        office_instance = OfficeSetup.objects.get(owner=request.user)
        new_form = form.save(commit=False)
        new_form.office = office_instance
        new_form.save()
        messages.success(request, 'Thank you')
        return redirect('purchase-order-lists')
    messages.warning(request, "Correct the errors below")
    context = {
        "form": form,
    }
    return render(request, 'dashboard/purchase_order/purchase_order.html', context)

blank=Truenull=True 与数据库中允许的内容有关,与表单无关。如果表单中的值可以为空,则将 required=False 添加到表单定义中。例如:

class PurchaseOrderForm(forms.ModelForm):
    basic_amount = forms.DecimalField(disabled=True, required=False)
    ...