编辑时 Django 内联表单集排序问题

Django inline-formset ordering issue when editing

我正在尝试使用 Django 内联表单集。

表格应该按订单值排序显示,这是在我请求表格时正确完成的。 但是如果我更改订单值并保存,第一个视图是以前的订单(刷新就可以了)

表格:

class SlidesForm(forms.ModelForm):
    order = forms.IntegerField(widget=forms.NumberInput())
    background_image = forms.ImageField(widget=forms.FileInput(attrs={'class': 'custom-file-input'}), required=False)
    text = forms.CharField(max_length=256, widget=forms.Textarea(attrs={'rows': 2, 'class': 'form-control'}), required=False)

    class Meta:
        model = SlideCarousel
        fields = ['order', 'background_image', 'text']

观看次数

def management_form_general(request, city_slug):
    city = City.objects.get(slug=city_slug)
    SlideCarouselInlineFormSet = inlineformset_factory(City, SlideCarousel, form=SlidesForm, extra=0)

    if request.method == 'POST':

        carousel_formset = SlideCarouselInlineFormSet(request.POST, request.FILES, instance=city, queryset=city.slidecarousel_set.order_by("order"))
        if carousel_formset.is_valid():
            carousel_formset.save()

    else:
        carousel_formset = SlideCarouselInlineFormSet(instance=city, queryset=city.slidecarousel_set.order_by("order"))

    return render(request, 'management/form/city_general.html', {'city': city, 'carousel_formset': carousel_formset})

知道我做错了什么吗?尝试在保存后重新实例化 carousel_formset 但它看起来很糟糕而且实际上没有用

现在您仍在表单集中返回相同的查询集(已经评估和排序)。您需要的是获取刚刚保存的数据并使用它更新表单集。我认为您有两个应该可行的选项。

  1. 像你说的那样重新创建 carousel_formset。这可能不是您想要的,但似乎比我的第二个建议更有可能。你说你试过这个但没有用。如果您的代码看起来与我的相同,那么您可能想跳过这种方法。
            carousel_formset.save()
            carousel_formset = SlideCarouselInlineFormSet(
                instance=city, 
                queryset=city.slidecarousel_set.order_by("order"),
            )
  1. 通常,在我保存一个表单(集)后,我会重定向到成功 URL。在这种情况下,这将再次是相同的路径。
            carousel_formset.save()
            return redirect(request.path)

第三个选项,我不知道它是否有效,但你可以尝试很少的努力,就是重新设置 carousel_formset.queryset 属性。

            carousel_formset.save()
            carousel_formset.queryset = city.slidecarousel_set.order_by("order")