2011-06-16 29 views
17

Quiero crear TodayOrLaterDateField() que podría subcategorizar el campo DateField() ya que estoy usando esta condición en muchos lugares. El propósito de este campo sería evitar poner fechas del pasado.Validador de campo personalizado Django vs.

¿Cuál es la forma más directa de hacer esto? Estoy confundido con el validador vs. el método limpio. He intentado con clean() pero al comparar el valor con datetime.date.today() obtengo el error "compare unicode object to date".

estoy usando Django 1.3

+0

muestra el código que da el error. –

Respuesta

2

Puede extender models.DateField y anular to_python método. No se probó en Django 1.3 pero debería funcionar.

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 
+0

La condición se aplicaría solo en frontend. Los administradores pueden usar fechas del pasado, así que no iría con modelos aquí. (Sí, lo siento, no lo mencioné). Intentaremos con to_python() y subclases de forms.DateField. ¡Gracias! – Robert

28

Los validadores solo validan, no devuelven el formato mejorado; Los métodos de limpieza validan y devuelven un valor (a veces modificado).

Creo que el camino a seguir aquí es utilizar un DateField con un validador como una clase heredada de DateField con un conjunto de validadores predeterminados.

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,] 

edición: Se puede aplicar el mismo validador a sus campos de formulario, así si lo que desea es allí y no en toda la aplicación.

+0

La primera oración lo explica todo. Gracias D4V360! – Robert

+0

Lo que no entiendo es cuándo y dónde se llaman 'validate' y' clean', en otros lugares de django ... – thnee

Cuestiones relacionadas