Проблема 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)
Приводит к следующему результату, который я надеюсь увидеть:

Однако - когда я добавляю сообщение с запросом
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
Я вижу следующее:
Пожалуйста, кто-нибудь может помочь мне понять, где я ошибся? Я пытался решить это сам, но всегда сталкивался с одной и той же проблемой, как только запрос 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)
При передаче выбранных идентификаторов строк через скрытые поля формы они будут сохраняться при отправке формы.
