On Jan 19, 11:23 pm, mrts <m...@mrts.pri.ee> wrote: > The directory-based approach is best, I'll go with it -- but it's yet > uncertain > when as I have to handle pressing matters at work during daytime.
I've implemented some fundamental changes that need review. The commit is at http://github.com/mrts/honza-django/commit/482086df8d24b99f466152c51d2badee6ee6147d . The changes are not finished yet, but they should illustrate the proposed approach. I may fail to see all the negative implications as I've been mostly addressing fields, not the whole picture. Critique most welcome. Changes: 1. consolidate validators and coercers into django/core/validators/ {__init__,typeconverters}.py as suggested by Malcolm 2. make both forms and fields use similar logic in clean(): core.validators: def clean(field_instance, value, all_values, field_container_instance): if value is not None: value = field_instance.to_python(value) field_instance.validate(value, all_values, field_container_instance) return value models.fields: class Field(object): ... def clean(self, value, model_instance): if model_instance is not None: all_values = model_instance.__dict__.copy() else: all_values = {} return validators.clean(self, value, all_values, model_instance) forms.fields: class Field(object): def clean(self, value, form_instance=None): if form_instance is not None: all_values = form_instance.cleaned_data else: all_values = {} return validators.clean(self, value, all_values, form_instance) Rationale: make validators that need to use other fields (e.g. RequiredIfOtherFieldEquals) work uniformly on model and form fields. A side note: the `instance` attribute is not used in validator functions and I can't see a clear use case for it, so it looks like it can be removed -- prove me wrong please (I do see obscure corner cases where it could be useful -- if one needs to distinguish between forms and models in custom validators or do gettatr('something', instance), but these should really be handled in clean() manually). 3. as seen from above, to_python(), validate() and validators are back in form fields as this greatly simplifies code. clean() is still overridable and mostly backwards-compatible. There are a few fields that have been ported to the new logic in forms/fields.py. Form fields accept custom validators in `validators` attribute. 4. typeconverters take additional params, mainly intended for custom/ localized date/time input handling, but also useful when overriding to_python in custom fields: DateField: def to_python(self, value, params=None): typeconverters.to_date(value, params) def to_date(value, params=None): # TODO: use params for date format This is not yet fully implemented in the current changeset. Unfortunately I've been unable to contribute as much time as I would have liked (the fact that the commit is from 2.30 AM my time should say it all), but I hope to drive field validation to completion soon after receiving feedback on the decisions above. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Django developers" group. To post to this group, send email to django-developers@googlegroups.com To unsubscribe from this group, send email to django-developers+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/django-developers?hl=en -~----------~----~----~----~------~----~------~--~---