如何保存django内联formset的顺序?

LS5*_*321 8 django django-forms jquery-ui-sortable

在Django中,我can_order = True在一个已order_with_respect_to设置的模型上使用了inlineformset .我在前端设置拖放,这导致Django的自动生成的ORDER表单字段(我隐藏)更改以反映新订单.我已经验证我正在将新订单正确地发布到服务器,但Django似乎忽略了它,并按原始顺序保存模型._order数据库中自动创建的字段永远不会更改.

如何让Django使用formset中指定的顺序保存模型?除了调用save()formset 之外,我还需要做一些特别的事情吗?

sir*_*rex 5

Evan Borgstrom 提出的解决方案不能与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()
Run Code Online (Sandbox Code Playgroud)

  • 如果您使用 `order_with_respect_to` 属性,您还可以使用 `set_RELATED_order()` 方法来设置顺序。我这样使用:`step.set_stepmaterial_order([form.instance.pk for form in self.formset.ordered_forms])` (3认同)

Eva*_*rom 2

我遇到了同样的问题,在深入研究 Django 源代码后发现这是你需要自己做的事情。

我最初的实现看起来像这样:

services = service_formset.save(commit=False)
for service in services:
    # ... do something with m2m relationships ...
    service.save()
Run Code Online (Sandbox Code Playgroud)

然而,正如您所发现的,这并没有设定顺序。所以我的实现现在看起来像:

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

在上面的示例中,“order_order”是我用来跟踪模型订单的字段。

另请记住,您需要指定模型的 Meta 类的“ordering”属性,以确保再次生成表单集时元素的顺序正确。

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