Django - 在更改通用UpdateView中的用户输入之前获取初始值?

时间:2018-05-18 16:46:22

标签: python django django-forms

比方说,我有一个模型,可以将水果作为苹果,香蕉和橘子存放在一个篮子里(每个单独的实例都将成为一个篮子)。

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

1 个答案:

答案 0 :(得分:0)

ModelForm上有一个名为initial的属性。这将保存表单的初始值,即字段更改前的值。

它本质上是一个字典,键是模型字段名称,值是它们的初始值(假设您正确地初始化了表单)。您可以使用它来挂接更新前的原始值。

def save(self, commit=True):
    self.apples += self.initial['apples'] 
    ...

理想情况下,应该避免这种魔法;尝试让FE / API调用发送正确的值;或者在将业务逻辑传递给ModelForm之前编写业务逻辑