2012-05-12 1 views
1

Я должен определить схему императивно в представлении, поскольку «отсутствует» должен быть динамичным:определения «не хватает» для colander.SchemaNode динамически

# ... 
    now = datetime.datetime.utcnow() 
    delta = datetime.timedelta(days=range) 

    schema = SchemaNode(Mapping()) 
    schema.add(SchemaNode(Date(), name='to', missing=now)) 
    schema.add(SchemaNode(Date(), name='from', missing=now - delta)) 
    # ... 

Это некрасиво. Есть ли лучший способ помимо определения настраиваемого типа?

ответ

5

Использование schema binding.

@colander.deferred 
def deferred_now(node, kw): 
    now = kw['now'] 
    return now 

@colander.deferred 
def deferred_now_delta(node, kw): 
    return kw['now'] - kw['delta'] 

class MySchema(MappingSchema): 
    to = SchemaNode(Date(), missing=deferred_now) 
    frm = SchemaNode(Date(), missing=deferred_now_delta) 

def aview(request): 
    schema = MySchema().bind(now=now(), delta=somedelta) 
+0

Согласно документации [1] можно используемые схемы связывания для 'default' атрибутов тоже пока пирамида не может упасть отложенную функцию в тех случаях, вызывая ошибку рендеринга (пытается отрендерить' colander.deferred 'объект). Как бы настроить твой ответ на использование 'default' вместо' missing'? [1] http://docs.pylonsproject.org/projects/colander/en/latest/binding.html – hamx0r