Reputation: 159
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
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