2012-05-27 22 views
1

在Django中,我有一個包含一些常用字段的父抽象類以及一些添加更多字段的子類。在其中一些子類中,我想添加驗證父類上的字段的自定義驗證器。如何在驗證Django中的父字段的子類中添加自定義驗證程序

class Template(models.Model): 
    text = models.CharField(max_length=200) 

class GlobalTemplate(Template): 
    function = models.ManyToManyField(Function, null=True, blank=True) 

我可以輕鬆地添加他們在球場上的父類是這樣的:

class Template(models.Model): 
    text = models.CharField(max_length=200, validators=[validate_custom]) 

但在這種情況下,我想驗證添加到我的孩子上課GlobalTemplate,但它連接到文本字段。

這在Django中可能嗎?

謝謝!

+0

讓我看看,如果我的理解:你想提出一個自定義的驗證場上'text',但只有在'GlobalTemplate'子類,並沒有重新定義'text'。對? – borges

+0

是的,這是正確的。 – brandon

回答

1

字段驗證器存儲在field.validators,它是一個列表,所以你基本上需要在那裏附加你的驗證器。

要訪問字段實例,你必須發揮一點點與你的對象的屬性_meta(請注意,你不應該這個屬性的發揮,所以當你更新Django的,你」必須檢查它沒有改變)。這裏是你如何能做到這一點:

def get_fields_dict(self): 
    return dict((field.name, field) for field in self._meta.fields) 

def __init__(self, *args, **kwargs): 
    super(GlobalTeplate, self).__init__(*args, **kwargs) 
    text_field = self.get_fields_dict()['text'] 
    text_field.validators.append(validate_custom) 
+0

但是我會在哪裏添加?我無法在models.py中爲我的子類添加text.validators = [calidate_custom],所以添加到子類驗證程序列表的正確位置在哪裏? – brandon

+0

你的模型的'__init__'方法將會很好。儘管如此,不要忘記「超級」電話。 –

+0

Hrm ...也許我完全錯過了一些基本的東西,但是試圖在init方法中添加'self.text.validators = [validate_custom]'給了我一個''unicode'對象沒有屬性'validators'「錯誤 – brandon