Chas
Chas

Reputation: 159

Django Models and Validators

I created the following model:

class SlideLibrary(models.Model):

CANDIDATE = 'Cand'
AUDIT = 'Audit'
RETIRED = 'Ret'

STATUS_CHOICES = (
    (CANDIDATE,'Candidate'),
    (AUDIT, 'Audit'),
    (RETIRED, 'Retired'),
)


def validate_positive(value):
    if value < 0:
        raise ValidationError(u'%s must be a positive number' % value)

slide_name = models.CharField(max_length=6, primary_key=True)
reference_value = models.FloatField(default='0', validators=[validate_positive])
date_introduced = models.DateField(null=True, blank=True)
date_graduated = models.DateField(null=True, blank=True)
status = models.CharField(max_length=10, choices=STATUS_CHOICES,default='Candidate', blank=True)
last_mean = models.FloatField(default= '0')
esd = models.FloatField(default= '0')
criteria = models.CharField(max_length= 10)

def save(self, *args, **kwargs):
    val = getattr(self, 'slide_name', False)
    if val:
        setattr(self, 'slide_name', val.upper())
    self.esd = self.calculate_esd()
    super(SlideLibrary,self).save(*args, **kwargs)

def calculate_esd(self):
    from math import sqrt
    if self.reference_value:
        try:
            return sqrt((self.reference_value-0.04) * self.reference_value**2)
        except ValueError:
            return 0
    else:
        return 0

def __unicode__(self):
    return self.slide_name

Before I added the three constants 'CANDIDATE', 'AUDIT' & 'RETIRED', 'STATUS_CHOICES', and three additional fields; 'date_introduced', 'date_graduated' and 'status'. Everything was working fine. I have a ModelForm and I can open the form with test data. When I entered a negative value in the 'reference_value' field, I got the appropriate warnings in accordance with my validation rule.

I added the above and now when I 'makemigrations', I get:

ValueError: Could not find function validate_positive in slide_library.models.

For the life of me I cannot see why it will not now find my validator?

Any assistance gratefully received.

Upvotes: 0

Views: 148

Answers (1)

Louis Barranqueiro
Louis Barranqueiro

Reputation: 10228

You have to put your function validate_positive out of your class SlideLibrary.

E.g:

def validate_positive(value):
    if value < 0:
        raise ValidationError(u'%s must be a positive number' % value)

class SlideLibrary(models.Model):
    reference_value = models.FloatField(default=0, validators=[validate_positive])

And you did an other mistake : you are setting a FloatField then use default=0 and not default='0'

Upvotes: 1

Related Questions