2011-07-22 16 views
8

En Django, estoy usando un Inlineformset con can_order = True, en un modelo que tiene order_with_respect_to conjunto. Configuré arrastrar y soltar en el front end, lo que hace que los campos de formulario ORDER autogenerados de Django (que he ocultado) cambien para reflejar el nuevo orden. He verificado que estoy PUBLICANDO el nuevo pedido correctamente en el servidor, pero Django parece ignorarlo y guarda los modelos en el orden original. Los campos _order creados automáticamente en la base de datos nunca cambian.¿Cómo se guarda el orden de un formset en línea django?

¿Cómo puedo obtener Django para guardar los modelos usando el orden especificado en el formset? ¿Debo hacer algo especial que no sea llamar al save() en el formset?

Respuesta

2

Tuve el mismo problema y después de indagar sobre la fuente de Django pensé que era algo que tenía que hacer por su cuenta.

Mi implementación original se veía algo como esto:

services = service_formset.save(commit=False) 
for service in services: 
    # ... do something with m2m relationships ... 
    service.save() 

Sin embargo, como usted ha encontrado esto no establecer el orden. Así que en lugar de mi aplicación ahora se ve así:

for form in service_formset: 
    service = form.save(commit=False) 
    # ... do something with m2m relationships ... 
    service.order_order = form.cleaned_data['ORDER'] 
    service.save() 

En mi ejemplo anterior 'order_order' es el campo que estoy usando para rastrear el fin de mis modelos.

Recuerde también que debe especificar el atributo 'orden' de la clase Meta de su modelo para asegurarse de que cuando vuelva a generar el formset los elementos estén en el orden correcto.

class Service(models.Model): 
    # ... 
    order_order = models.IntegerField(default=0) 
    class Meta: 
     ordering = ['order_order',] 
4

La solución propuesta de Evan Borgstrom no funciona junto con can_delete = True.

Aquí está mi solución, que también trabaja con can_delete = True:

for instance in formset.save(commit=False): 
    # ... do something with m2m relationships ... 
for form in formset.ordered_forms: 
    form.instance.order = form.cleaned_data['ORDER'] 
    form.instance.save() 
+2

Si está utilizando la propiedad 'order_with_respect_to', también se puede usar' 'método set_RELATED_order() para establecer el orden. Uso smth así: 'step.set_stepmaterial_order ([form.instance.pk for form in self.formset.ordered_forms])' –

Cuestiones relacionadas