Hi, Sorry some time ago I saw this project https://github.com/sikaondrej/django-multi-model-form, but now is not found,
I did a copy of the code, but it is in spanish, I don't have time to translate this now but can be useful. -- You received this message because you are subscribed to the Google Groups "Django users" group. To unsubscribe from this group and stop receiving emails from it, send an email to django-users+unsubscr...@googlegroups.com. To post to this group, send email to django-users@googlegroups.com. Visit this group at http://groups.google.com/group/django-users. To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/CAG%2B5VyOoHVuOH8EQa5HdfWfgqed%2BoaBoBHmnTov45VVZACi%3D2Q%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.
class MultiModeloForm(): ''' Permite construir un formulario con los campos que se le especifiquen dado un `modelo`. La relación del campo con el modelo puede ser tan larga como se desee, mientras se siga el formato campo__campo. Cuando los atributos son relaciones se puede especificar la relación o tomar atributos de la relación así: * modelo__modelo_relacionado Si se quieren atributos de la clase relacionada se puede solicitar nombrandolos: * modelo__modelo_relacionado__atributo .. note:: Cuidado con el guardado de este formulario, ya que no se puede garantizar que todos los campos requeridos para construir los modelos están dentro del formulario, es decir, **NO** haga esto: .. code:: python form = MultiModeloForm(Modelo, [campo1, campo2]) formi = form.get_formulario() formi.save() ''' modelo = None campos_modelos=None campo_buscado=None formulario=None #FIXME inventarse una cache def get_model_form(self, Model, Fields): class ModelForm(forms.ModelForm): class Meta: model = Model fields = Fields return ModelForm def buscar_campo(self, clase, campo): if not '__' in campo: fields = [] fields += clase._meta.fields if hasattr(clase._meta, 'many_to_many') : fields += clase._meta.many_to_many for field in fields: if campo == field.name: if not clase.__name__ in self.campos_modelos: self.campos_modelos[clase.__name__] = [clase] self.campos_modelos[clase.__name__].append((field.name, self.campo_buscado)) return field raise AttributeError else: campo_sp = campo.split('__') campos = get_campos_por_clase(clase) if campo_sp[0] in campos: claser = campos[campo_sp[0]].related.parent_model return self.buscar_campo( claser, '__'.join(campo_sp[1:])) else: raise AttributeError def __init__(self, clase_base, campos): ''' Esta clase es una constructora de formularios, no es el formulario. para obtener el formulario debe hacer form.get_formulario() ''' base = clase_base.__name__ self.campos_modelos = {} self.modelo=clase_base for x in campos: self.campo_buscado = x self.buscar_campo(clase_base, x) formularios = {} base_modelo = None base_campos = None for nombre, valores in self.campos_modelos.items(): modelo = valores[0] fields = [] nombres_campos = SortedDict(valores[1:]) for x,y in nombres_campos.items(): fields.append(x) if nombre == base: base_modelo = modelo base_campos = fields else: form = self.get_model_form(modelo, fields)() # FIXME revisar para que sirve formularios[nombre] #formularios[nombre] =[] for nombre_f, valor in zip(form.fields.keys(), form.fields.values()): if nombre_f in nombres_campos: formularios[nombres_campos[nombre_f]] = valor if not base_modelo: base_modelo = clase_base base_campos = [] class Multi_Model_Form(forms.ModelForm): for nombre, valor in formularios.items() + [(None, None)]: if nombre: exec "%s = valor" % (nombre) else: exec "pass" class Meta: model=base_modelo fields = base_campos self.formulario = Multi_Model_Form def get_formulario(self): ''' Retorma el formulario creado ''' return self.formulario def get_modelo(self): ''' Permite saber el modelo base del formulario ''' return self.modelo