Данные модели массажа перед сохранением в Django - PullRequest
1 голос
/ 02 октября 2011

Я не уверен, что это лучший способ сделать это, но у меня есть некоторые данные, которые отправляются с помощью формы.У меня есть ModelForm, который принимает request.POST данных этой формы.Все отправляемые данные - это описание, сумма и депозит (логическое значение).

Когда человек отправляет данные, сумма будет положительным числом, но я хотел бы сохранить ее в базе данных какотрицательное число, если депозит ложен.

Я думал о том, чтобы сделать это либо в Model, либо в ModelForm и что-то вроде массажа перед сохранением ... Итак, где-то в одном из этих классов я хотел бы получить что-то вроде:

if not deposit:
    amount = -amount

... и затем сохраните его как таковой.

Есть ли способ справиться с этим в ModelForm или Model, который избавил бы меня от необходимости выполнять всю эту логику внутри представления

Ответы [ 2 ]

4 голосов
/ 02 октября 2011

Метод save () от ModelForm - хорошее место для этого:

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
2 голосов
/ 02 октября 2011

Метод сохранения перезаписи модели - это решение.Но я предпочитаю делать эти операции чистым методом и смешивать их с бизнес-правилами:

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()

На этомкак правила привязаны к модели, и вам не нужно писать код в каждой форме, в которой эта модель появляется ( здесь, вы можете увидеть это более подробно )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...