比方说,我有一个模型,可以将水果作为苹果,香蕉和橘子存放在一个篮子里(每个单独的实例都将成为一个篮子)。
class Project(models.Model):
apples = models.DecimalField('Apples!', decimal_places=2, max_digits=7)
oranges = models.DecimalField('Oranges!', decimal_places=2, max_digits=7)
bananas = models.DecimalField('Bananas!', decimal_places=2, max_digits=7)
用例:
数据库中有A,B和C苹果,橘子和香蕉在单独的篮子里。 用户按下单独的篮子进行更新,获取他的苹果,橘子和香蕉田。 他在数据库中输入了X量的苹果,Y量的橘子和Z量的香蕉。
现在有A + X苹果,Y + B橙子和C + Z香蕉。换句话说,不仅仅是更新水果的数量,用户只需添加它们(暂时不减去)
问题是,当尝试覆盖forms.py中的save()方法时,我似乎无法正确访问当前篮子的实例,因此,当前的正确数量 - 把水果放在篮子里。使用我的程序化添加进行更新有效,但我无法获得初始值。我该怎么做?
class BasketForm(ModelForm):
class Meta:
model = Basket
fields = ['apples', 'oranges', 'bananas']
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.helper = FormHelper()
self.helper.add_input(Submit('submit', 'UPDATE'))
def save(self, commit=True):
self.instance.actual_design = self.cleaned_data.get('actual_design') // this didnt work
current_project = self.instance.actual_design // this didnt work
print(self.instance.apples) // returns already inputted X amount of apples
add = super(BasketForm, self).save(commit=False)
if commit:
add.save()
return add
答案 0 :(得分:0)
ModelForm
上有一个名为initial
的属性。这将保存表单的初始值,即字段更改前的值。
它本质上是一个字典,键是模型字段名称,值是它们的初始值(假设您正确地初始化了表单)。您可以使用它来挂接更新前的原始值。
def save(self, commit=True):
self.apples += self.initial['apples']
...
理想情况下,应该避免这种魔法;尝试让FE / API调用发送正确的值;或者在将业务逻辑传递给ModelForm之前编写业务逻辑