def default(self, form_cls, **kwargs): form_data = {} form_files = {} form_fields, fields_args = split_model_kwargs(kwargs) for name, field in form_cls.base_fields.iteritems(): if name in form_fields: form_data[name] = kwargs[name] else: form_data[name] = self.field_generator(field, **fields_args[name]) return form_data, form_files
def _fill_model_fields(self, model, **kwargs): model_fields, fields_args = split_model_kwargs(kwargs) # Fill in virtual fields. for field in model._meta.virtual_fields: if field.name in model_fields: object = kwargs[field.name] model_fields[field.ct_field] =\ kwargs[field.ct_field] = ContentType.objects.get_for_model(object) model_fields[field.fk_field] =\ kwargs[field.fk_field] = object.pk # Fill in local fields. for field in model._meta.fields: if field.name in model_fields: if isinstance(kwargs[field.name], Q): # Lookup ForeingKey field in DB. key_field = model._meta.get_field(field.name) value = key_field.rel.to.objects.get(kwargs[field.name]) setattr(model, field.name, value) else: # TODO support any_model call setattr(model, field.name, kwargs[field.name]) elif isinstance(field, models.OneToOneField)\ and field.rel.parent_link: # Skip link to parent instance. pass elif isinstance(field, models.fields.AutoField): # Skip primary key field. pass elif isinstance(field, models.fields.related.ForeignKey) \ and field.model == field.rel.to: # Skip self relations. pass else: setattr(model, field.name, self.field_generator(field, **fields_args[field.name])) # Process OneToOne relations. one_to_ones = [(relation.var_name, relation.field)\ for relation in model._meta.get_all_related_objects()\ if relation.field.unique] # TODO and not relation.field.rel.parent_link ?? for field_name, field in one_to_ones: if field_name in model_fields: # TODO support any_model call setattr(model, field_name, kwargs[field_name])