2011-10-02 77 views
1

我不確定這是否是這樣做的最佳方式,但是我有一些由窗體發送的數據。我有一個ModelForm,它採用該形式數據的request.POST。所有正在發送的數據都是描述,金額和存款(布爾)。保存在Django中之前的按摩模型數據

當個人提交數據時,金額將爲正數,但如果存款爲False,我想將其作爲負數存儲在數據庫中。

我在這些類的一個思想無論是在模型或的ModelForm和保存之前那種按摩這一數額這樣做的......所以,冥冥之中,我想有這樣的:

if not deposit: 
    amount = -amount 

...然後保存它。

有沒有在ModelForm或Model中處理這個問題的方法,它可以避免我不必在視圖內部執行所有邏輯?

回答

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 
+0

夠簡單。謝謝! – intargc

2

覆蓋模型保存方法是一個解決方案。但我prefear使清潔方法作業本,並與業務規則混合:

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

相關問題