【问题标题】:Django inline-formset ordering issue when editing编辑时的 Django inline-formset 排序问题
【发布时间】:2020-02-29 23:22:06
【问题描述】:

我正在尝试使用 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,但看起来很糟糕,实际上没有用

【问题讨论】:

    标签: django django-forms inline-formset


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢! 3 不起作用,但 1 起作用,认为这是一种讨厌的方式,但猜想它是最好的解决方案(我没有正确执行,并且总是在执行 POST 导致不出现问题但在保存之后应该没问题) !
    猜你喜欢
    • 1970-01-01
    • 2020-09-16
    • 2020-12-07
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 2018-04-09
    • 2021-05-06
    • 1970-01-01
    相关资源
    最近更新 更多