2011-07-22 15 views
8

W Django używam inlineformset z can_order = True, w modelu, który ma zestaw order_with_respect_to. Ustawiłem przeciągnij i upuść na interfejsie, co powoduje, że zmienione przez Django pola formularza ORDER (które ukryłem) zmieniają się, odzwierciedlając nowe zamówienie. Sprawdziłem, czy poprawnie umieszczam nowe zamówienie na serwerze, ale Django wydaje się ignorować to i zapisuje modele w oryginalnej kolejności. Automatycznie utworzone pola _order w bazie danych nigdy się nie zmieniają.Jak zapisać kolejność wbudowanego zestawu formularzy django?

Jak mogę zmusić Django do zapisywania modeli przy użyciu kolejności określonej w zestawie? Czy muszę zrobić coś specjalnego poza wywołaniem save() w zestawie?

Odpowiedz

2

Miałem ten sam problem i po przekopaniu się przez źródło Django zorientowałem się, że jest to coś, co musisz zrobić samemu.

Moja oryginalna realizacja wyglądała mniej więcej tak:

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

Jednakże, jak już znajdziesz to nie ustawić kolejność. Zamiast tego moja implementacja wygląda następująco:

W powyższym przykładzie "order_order" to pole, którego używam do śledzenia zamówienia w moich modelach.

Należy również pamiętać, że należy określić atrybut "zamawiania" klasy Meta modelu, aby zapewnić, że po wygenerowaniu zestawu ponownie elementy są we właściwej kolejności.

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

Zaproponowane rozwiązanie Evan Borgstrom nie działa razem z can_delete = True.

Oto moje rozwiązanie, które działa również z 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

Jeśli używasz 'własność order_with_respect_to', można również użyć' set_RELATED_order() 'sposób ustawić kolejność. Używam czegoś takiego: 'step.set_stepmaterial_order ([form.instance.pk dla formularza w self.formset.ordered_forms])' –

Powiązane problemy