Валидатор пользовательских полей Django против чистого - PullRequest
18 голосов
/ 16 июня 2011

Я хотел бы создать TodayOrLaterDateField (), который бы наследовал поле DateField (), поскольку я использую это условие во многих местах. Цель этого поля - избежать установки дат из прошлого.

Какой самый прямой способ сделать это? Я запутался с валидатором против чистого метода. Я пытался с clean (), но при сравнении значения с datetime.date.today () я получаю сообщение об ошибке «сравнить объект Юникод с датой».

Я использую Django 1.3

Ответы [ 2 ]

29 голосов
/ 16 июня 2011

Валидаторы только проверяют, они не возвращают улучшенный формат;Чистые методы проверяют и возвращают (иногда измененное) значение.

Я думаю, что путь здесь заключается в том, чтобы просто использовать 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,]

edit: Вы также можете применить тот же валидатор к полям формы, если вы просто хотите, чтобы он был там, а не во всем приложении.

2 голосов
/ 16 июня 2011

Вы можете расширить 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...