BleuBizarre
BleuBizarre

Reputation: 378

Django inline-formset ordering issue when editing

I am trying to use the Django inline-formset.

Forms should be displayed sorted by their order value which is correctly done when I request the form. But if I change the order values and save, the first view is with the previous order (refresh does the trick)

forms:

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']

views:

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

Any idea what I am doing wrong ? Tried to reinstance the carousel_formset after the save but it seems nasty and it actually didn't work

Upvotes: 0

Views: 927

Answers (1)

Jacinator
Jacinator

Reputation: 1413

Right now you're still returning the same queryset (already evaluated and ordered) in the formset. What you need is to get the data that you just saved and update the formset with it. I think that you have two options that should work.

  1. Recreate the carousel_formset like you said. This might not be exactly what you want but it seems more likely than my second suggestion. You said you tried this and it didn't work. If your code looks the same as mine then you might want to skip this approach.
            carousel_formset.save()
            carousel_formset = SlideCarouselInlineFormSet(
                instance=city, 
                queryset=city.slidecarousel_set.order_by("order"),
            )
  1. Usually, after I save a form(set) I would redirect to a success URL. In this case that would be the same path again.
            carousel_formset.save()
            return redirect(request.path)

A third option that I have no idea if it will work, but you could try for very little effort, would be to re-set the carousel_formset.queryset attribute.

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

Upvotes: 1

Related Questions