我正在构建一个基于django的Web应用程序来索引一些在线学习资源,例如MOOCS。一些MOOCS是“开放的”意味着它们可以随时以学习者自己的速度启动,而其他MOOCS则具有定义的开始和结束日期。对我来说,如果课程是开放的,那么就不需要开始日期,但如果它没有开放,我希望开始日期是必需的。有没有蚂蚁方法在我的model.py中执行此操作,或者是否应该仅使用表单验证来处理它。谢谢你的帮助。
目前:
class Post(models.Model):
user = models.ForeignKey(User)
title = models.CharField(max_length=70)
description = models.CharField(max_length=300)
url = models.URLField()
post_date = models.DateTimeField('date posted')
start_date = models.DateTimeField('date course starts', null=True, blank=True)
open = models.BooleanField(default=False)
....
def __unicode__(self):
return self.title
答案 0 :(得分:3)
您似乎知道如何使用表单验证,以便回答您的问题:
如您所说,您尝试做的最好是使用表单验证完成。现在,如果要在模型级别上执行此操作,以一种您将具有完整性(不是数据库完整性,但逻辑完整性)的方式,您应该覆盖模型的clean
方法。你可以通过以下方式做到这一点:
def clean(self, *args, **kwargs):
if not self.open and not self.start_date:
raise ValidationError('This course is not open, therefore you need a start date')
return super(Post, self).clean()
现在,如果您想要通过命令行强制clean()
模型实例时强制save()
运行,则需要添加逻辑完整性层,您可以在{{self.clean()
中调用save()
1}}模型方法(请注意,这将在非命令行实例中运行self.clean()
两次)。以下是最终代码的示例:
class Post(models.Model):
user = models.ForeignKey(User)
title = models.CharField(max_length=70)
description = models.CharField(max_length=300)
url = models.URLField()
post_date = models.DateTimeField('date posted')
start_date = models.DateTimeField('date course starts', null=True, blank=True)
open = models.BooleanField(default=False)
....
def clean(self, *args, **kwargs):
if not self.open and not self.start_date:
raise ValidationError('This course is not open, therefore you need a start date')
return super(Post, self).clean()
def save(self, *args, **kwargs):
self.clean()
return super(Post, self).save(*args, **kwargs)
def __unicode__(self):
return self.title