2010-11-26 114 views
1

这是一个模型的一个非常简化的版本,我的工作:处理是基于其他领域的Django模型领域的要求

class ClothingTop(models.Model): 

    SWEATER = 0 
    SHIRT = 1 

    TOP_CHOICES = (
     (SWEATER, 'Sweat shirt'), 
     (SHIRT, 'Shirt'), 
    ) 

    name = models.CharField(max_length=32) 
    type = models.PositiveSmallIntegerField(choices=TOP_CHOICES) 
    hoodie = models.BooleanField(default=False) 
    buttons = models.PositiveSmallIntegerField(null=True, blank=True) 

    def __unicode__(self): 
     return self.name 

    @property 
    def type_text(self): 
     if self.type == self.SWEATER: 
      if self.hoodie: 
       return 'Hooded sweatshirt' 
      return 'Plain sweatshirt' 
     elif self.type == self.SHIRT: 
      return 'Shirt' 

我想要求buttons如果type设置为SHIRT 。我的第一个想法是重写save方法,但我不确定这是否是实现这一点的最明智的方法。

任何人有任何建议吗?

回答

1

简单建议,而且我相信这是在实践中最好的一个,是你创造一个ClothingTopModelForm和设置,将做自定义验证表单上的buttons_clean()方法。这种形式也必须设置为ClothingTopModelAdmin

唯一的另一种方法是为buttons字段创建一个自定义模型字段(验证器在此处不起作用,因为它们只获取按钮字段值并且不知道类型和其他模型字段)。做到这一点最简单的方法是:

ButtonsField(models.PositiveSmallIntegerField): 

    def validate(self, value, model_instance): 
     # here we get the buttons field value and can get the type value 
     # exactly what we need! 

     type = getattr(model_instance, 'type') 

     if type == SHIRT and not value: 
      raise ValidationError('Type set to shirt, but buttons value is empty') 

     super(self, ButtonsField).validate(value, model_instance) 

我所提到的自定义字段中的方法对完整性的考虑,我认为你应该跳过创建自定义字段类型除非这是完全通用的,容易重复使用在任何模型。对于这些特殊情况,只需使用表单验证。您的模型应该只确保数据库的完整性,您已经完全覆盖了ClothingTop,业务规则从表单验证中冒出来。

+0

有了这个解决方案,我还必须为管理员应用程序提供正确的表单吗? – 2010-11-27 01:12:11