Проблема Django ModelFormset_Factory с формой рендеринга

Я просмотрел другие вопросы и ответы, изучил документацию по django и следовал руководствам, но я не могу заставить мой набор форм model корректно отображаться.

Пока что у меня нормально работает следующее:

forms.py

class BulkUpdateForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(BulkUpdateForm, self).__init__(*args, **kwargs)
        self.helper = FormHelper(self)
        self.helper.form_method = "post"
        self.helper.layout = Layout(
            Row(
                Column("slug"),
            ),
            Row(
                Column("registered"),
                Column("start_date"),
                Column("end_date"),
                Column("achieved"),
                Column("pfr_start"),
                Column("pfr_end"),
            ),
        )

        self.fields["slug"].label = ""

    class Meta:
        model = LearnerInstance
        fields = ["id","slug","registered","start_date","end_date","achieved","pfr_start","pfr_end",
        ]

        widgets = {
            "slug": forms.TextInput(
                attrs={
                    "readonly": True,
                },
            ),
        }

шаблон

<div class="container d-flex align-items-center flex-column pt-1">
  <div class="card text-dark bg-light mb-3 p-3" style="max-width: 95rem;">
    <br>
      <form action="" method="post">
        {% csrf_token %}
        {{ formset.management_form }}
          {% for form in formset %}
             {% crispy form %}
             <hr>
              {% endfor %}

            </div>
        <input type="submit" name='registered', class="btn btn-primary" value="Update">
        </form>
  </div>

views.py

def bulk_update(request):
    context = {}
    selected_rows = request.POST.getlist("select") #posted from previous page with a table and checkboxes to select the queryset I need to update
    
    BulkFormset = modelformset_factory(
        LearnerInstance, form=BulkUpdateForm, edit_only=True, extra=0)
    
    queryset = LearnerInstance.objects.filter(id__in=selected_rows)

    formset = BulkFormset(queryset=queryset)

    context["formset"] = formset

    return render(request, "learner/bulk_update.html", context)

Приводит к следующему результату, который я надеюсь увидеть: output

Однако - когда я добавляю сообщение с запросом

BulkFormset = modelformset_factory(
        LearnerInstance, form=BulkUpdateForm, edit_only=True, extra=0
    )
    queryset = LearnerInstance.objects.filter(id__in=selected_rows)

    if request.method == "POST":
        formset = BulkFormset(
            request.POST,
            queryset=queryset,
        )
        if formset.is_valid():
            formset.save()
    else:
        formset = BulkFormset(queryset=queryset)

    context["formset"] = formset

Я вижу следующее:

enter image description here

Пожалуйста, кто-нибудь может помочь мне понять, где я ошибся? Я пытался решить это сам, но всегда сталкивался с одной и той же проблемой, как только запрос post добавлялся в представление.

Когда вы отправляете набор форм, Django создает новый POST запрос, который не содержит исходных selected_rows данных с вашей предыдущей страницы. Это приводит к тому, что набор запросов становится пустым, поэтому в нем не отображаются формы.

Вы можете добавить скрытые входные данные в свой шаблон, чтобы сохранить в вашей форме выбранные идентификаторы строк, подобные этому:

<form action="" method="post">
    {% csrf_token %}
    {{ formset.management_form }}
    
    <!-- Add these hidden inputs -->
    {% for row_id in selected_rows %}
        <input type="hidden" name="selected_rows" value="{{ row_id }}">
    {% endfor %}
    
    {% for form in formset %}
        {% crispy form %}
        <hr>
    {% endfor %}
    <input type="submit" name="registered" class="btn btn-primary" value="Update">
</form>

Затем обновите свое представление, чтобы оно обрабатывало как ПОЛУЧЕНИЕ, так и ПУБЛИКАЦИЮ

def bulk_update(request):
    # Get selected rows from GET or POST
    if request.method == "GET":
        selected_rows = request.GET.getlist("select")
    else:
        selected_rows = request.POST.getlist("selected_rows")
    
    BulkFormset = modelformset_factory(
        LearnerInstance, form=BulkUpdateForm, edit_only=True, extra=0)
    
    queryset = LearnerInstance.objects.filter(id__in=selected_rows)

    if request.method == "POST":
        formset = BulkFormset(request.POST, queryset=queryset)
        if formset.is_valid():
            formset.save()
    else:
        formset = BulkFormset(queryset=queryset)

    context = {
        "formset": formset,
        "selected_rows": selected_rows  # Add this
    }
    return render(request, "learner/bulk_update.html", context)

При передаче выбранных идентификаторов строк через скрытые поля формы они будут сохраняться при отправке формы.

Вернуться на верх