Проблема упорядочения встроенного набора форм в Django при редактировании - PullRequest
0 голосов
/ 04 ноября 2019

Я пытаюсь использовать встроенный набор форм 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']

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

Есть идеи, что я делаю не так? Попытался повторно создать carousel_formset после сохранения, но это выглядит неприятно и на самом деле не работает

1 Ответ

1 голос
/ 04 ноября 2019

Сейчас вы все еще возвращаете тот же набор запросов (уже оцененный и упорядоченный) в наборе форм. Что вам нужно, это получить данные, которые вы только что сохранили и обновить набор форм с ним. Я думаю, что у вас есть два варианта, которые должны работать.

  1. Создайте заново carousel_formset, как вы сказали. Это может быть не совсем то, что вы хотите, но это кажется более вероятным, чем мое второе предложение. Вы сказали, что попробовали это, и это не сработало. Если ваш код выглядит так же, как мой, вы можете пропустить этот подход.
            carousel_formset.save()
            carousel_formset = SlideCarouselInlineFormSet(
                instance=city, 
                queryset=city.slidecarousel_set.order_by("order"),
            )
Обычно после сохранения формы (набора) я перенаправляю на успешный URL. В этом случае это снова будет тот же путь.
            carousel_formset.save()
            return redirect(request.path)

Третий вариант, о котором я понятия не имею, сработает ли он, но вы могли бы попытаться без особых усилий, - это повторноустановите атрибут carousel_formset.queryset.

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