在Django中保存之前按摩模型数据

时间:2011-10-02 00:21:47

标签: python django forms model

我不确定这是否是最好的方法,但我有一些表格发送的数据。我有ModelForm获取该表单数据的request.POST。正在发送的所有数据都是描述,金额和存款(布尔值)。

当此人提交数据时,金额将为正数,但如果存款为假,我希望将其作为负数存储在数据库中。

我想在模型或模型中进行此操作,并在保存之前进行一定量的按摩......所以,在其中一个类中的某个地方,我希望有类似的东西:

if not deposit:
    amount = -amount

...然后保存。

有没有办法在ModelForm或Model中处理这个问题,这样我就不必在视图中做所有逻辑?

2 个答案:

答案 0 :(得分:4)

ModelForm的save()方法是一个很好的地方:

class MyForm(models.ModelForm):
    ...
    def save(self):
        instance = super(MyForm, self).save(commit=False)
        if not self.deposit:
            self.amount = -self.amount
        instance.save()
        return instance

答案 1 :(得分:2)

覆盖模型保存方法是一种解决方案。但我首先要用干净的方法进行操作,并将其与业务规则混合使用:

models.py:

from django.db import models 
class Issue(models.Model):
    ....
    def clean(self): 
        rules.Issue_clean(self)

from issues import rules
rules.connect()

rules.py:

from issues.models import Issue
def connect():

    from django.db.models.signals import post_save, pre_save, pre_delete
    #issues 
    pre_delete.connect(Issue_pre_delete, sender= Incidencia) 
    pre_save.connect(Issue_pre_save, sender = Incidencia ) 
    post_save.connect(Issue_post_save, sender = Incidencia )

def Incidencia_clean( instance ): 
    #pre save:
    if not instance.deposit:
        instance.amount *= -1 

    #business rules:
    errors = {}

    #dia i hora sempre informats     
    if not instance.account.enoughCredit: 
        errors.append( 'No enough money.' )

    if len( errors ) > 0: 
        raise ValidationError(errors) 

def Issue_pre_save(sender, instance, **kwargs): 
    instance.clean()

这样,规则被绑定到模型,您不需要在每个表单上编写此模型的代码(here, you can see this on more detail