示例#1
0
    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
示例#2
0
    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])