Django自定义字段验证器与清洁

时间:2011-06-16 15:20:22

标签: django validation forms field

我想创建TodayOrLaterDateField(),它将继承DateField()字段,因为我在许多地方使用这个条件。这个领域的目的是避免过去的日期。

最直接的做法是什么?我对验证器与清洁方法感到困惑。 我已尝试使用clean()但是在将值与datetime.date.today()进行比较时,我得到“将unicode对象与日期进行比较”错误。

我正在使用Django 1.3

2 个答案:

答案 0 :(得分:29)

验证器仅验证,它们不返回改进的格式; 清洁方法既验证又返回(有时修改)值。

我认为这里的方法是使用带有验证器的DateField作为DateField的继承类,并设置default_validators。

import datetime
from django.core import exceptions
from django.db import models
from django.utils.translation import ugettext_lazy as _

def validate_date_today_or_later(value):
    'Place this in validators.py and import it to keep your model a bit cleaner'
    if value < datetime.date.today():
        raise exceptions.ValidationError(_('Date must be today or later'))

class TodayOrLaterDateField(models.DateField):
    default_validators = [validate_date_today_or_later,]

编辑: 您可以将相同的验证器应用于表单字段,如果您只是想要它而不是整个应用程序。

答案 1 :(得分:2)

您可以扩展models.DateField并覆盖to_python方法。没有在Django 1.3上测试但应该可以工作。

import datetime
from django.core import exceptions
from django.db import models

class TodayOrLaterDateField(models.DateField):
    def to_python(self, value):
        value = super(TodayOrLaterDateField, self).to_python(value)
        if value < datetime.date.today():
            raise exceptions.ValidationError(u'Date must be today or later')
        return value