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

时间:2011-07-22 21:23:14

标签: django django-forms jquery-ui-sortable

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

如何让Django使用formset中指定的顺序保存模型?除了在formset上调用{{1}}之外,我还需要做一些特别的事吗?

2 个答案:

答案 0 :(得分:4)

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()

答案 1 :(得分:2)

我遇到了同样的问题,经过挖掘Django的消息来源认为这是你需要自己做的事情。

我原来的实现看起来像这样:

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

但是,正如您所发现的那样,这不会设置ORDER。所以我的实现现在看起来像:

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'是我用来跟踪模型上的顺序的字段。

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

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