Как сохранить порядок встроенного набора форм Django? - PullRequest
8 голосов
/ 23 июля 2011

В Django я использую набор inlineformset с can_order = True для модели с установленным order_with_respect_to.Я настроил перетаскивание на интерфейсе, в результате чего автоматически сгенерированные Django поля формы ORDER (которые я скрыл) изменились, чтобы отразить новый порядок.Я подтвердил, что правильно размещаю новый заказ на сервере, но Django, похоже, игнорирует его и сохраняет модели в исходном порядке.Автоматически созданные поля _order в базе данных никогда не меняются.

Как заставить Django сохранять модели в порядке, указанном в наборе форм?Нужно ли делать что-то особенное, кроме вызова save() на наборе форм?

Ответы [ 2 ]

4 голосов
/ 07 декабря 2011

Предлагаемое решение Эвана Боргстрома не работает вместе с can_delete = True.

Вот мое решение, которое также работает с 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 голосов
/ 03 августа 2011

У меня была та же проблема, и после поиска источника Django понял, что это то, что вам нужно сделать самостоятельно.

Моя оригинальная реализация выглядела примерно так:

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

Однако, как вы обнаружили, это не устанавливает порядок. Так что вместо этого моя реализация теперь выглядит так:

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

В моем примере выше 'order_order' - это поле, которое я использую для отслеживания порядка в моих моделях.

Также помните, что вам необходимо указать атрибут 'ordering' мета-класса вашей модели, чтобы гарантировать, что при повторном создании набора форм элементы будут в правильном порядке.

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