from django.db import models class superModel: def _serialize(self): fields = self._meta.fields # fields that can't be null and are not 'id' nnf = [f for f in fields if not f.null and f.name != 'id'] d = {} for f in nnf: if not isinstance(f, models.ForeignKey): d[f.name] = getattr(self, f.name) else: d[f.name] = getattr(self, f.name).id return d def _default(cls): """Returns a dictionary with defaults for blank/default fields and None for required fields.""" fields = cls._meta.fields nnf = [f for f in fields if not f.null and f.name != 'id'] d = {} for f in nnf: # check if it's an auto_now_add DateTimeField if isinstance(f, models.DateTimeField): if f.auto_now_add: continue # if f has a default lets use it... if f.has_default(): d[f.name] = f.default elif f.blank: d[f.name] = '' else: d[f.name] = None return d # by default, we'll do nothing to the value def _filter_value(key, value): return value def _flatten_post(post): "Takes a mutable copy of a serialized POST and returns it with correct keys." for key,val in post.items(): try: post[key.split('_')[1]] = val del post[key] except: pass return post def _merge_post(c, request, obj=None): post = c._flatten_post(request.POST.copy()) if obj == None: obj = c._default() else: obj = obj._serialize() for key,value in obj.items(): if post.has_key(key): post[key] = c._filter_value(key, post[key]) else: post[key] = obj[key] return post _default = classmethod(_default) _merge_post = classmethod(_merge_post) _flatten_post = staticmethod(_flatten_post)