【问题标题】:Django - Getting initial value before altering user input in generic UpdateView?Django - 在通用 UpdateView 中更改用户输入之前获取初始值?
【发布时间】:2018-05-18 16:46:21
【问题描述】:

例如,我有一个模型,将水果作为苹果、香蕉和橙子存储在一个篮子中(每个单独的实例都将是一个篮子)。

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

【问题讨论】:

  • 这通常不是表单的责任,而是视图的责任:您将实例作为参数传递给表单。我觉得你在这里使用Decimals 而不是Integers 很奇怪。
  • 这是我当前任务的要求。所以你是说我在视图中尝试这个比较幸运?

标签: python django django-forms


【解决方案1】:

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

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

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

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

【讨论】:

  • 我的英雄!这就是我要找的!
  • 乐于助人;虽然这有点黑魔法 -> 不是理想的解决方案。请阅读威廉的评论:)
猜你喜欢
  • 2011-07-25
  • 2015-11-17
  • 2019-11-23
  • 2018-03-12
  • 2021-06-17
  • 1970-01-01
  • 2021-03-23
  • 2021-07-15
  • 2015-04-07
相关资源
最近更新 更多