В моем веб-приложении у меня есть шаблон с ListView, который показывает список записей таблицы, который работает нормально. Теперь я хочу разрешить пользователю обновлять поля для каждой строки таблицы. Одним из "простых" решений является создание страницы обновления с использованием UpdateView и размещение ссылки на нее в каждой строке. Затем пользователь может нажать обновить, открыть страницу обновления ... Но мне интересно, есть ли способ обновить поля в той же таблице, не открывая новую страницу. Надеюсь, мой вопрос понятен. спасибо за вашу помощь
ОБНОВЛЕНИЕ ( и "мое" решение )
Мне удалось сделать это с помощью formset:
в forms.py
class IssueForm(forms.ModelForm):
class Meta:
model=Issue
fields=('__all__')
IssueFormset=inlineformset_factory(IssuesList, Issue, form=IssueForm,extra=0)
в views.py
class IssuesListUpdateView(UpdateView):
model=IssuesList
fields='__all__'
# ovewrite get_context_data to add formset as an additionnal parameter
def get_context_data(self, **kwargs):
context = super(IssuesListUpdateView, self).get_context_data(**kwargs)
if self.request.POST:
# if Save All issues button submitted
if 'save_all' in self.request.POST.keys():
formset = IssueFormset(self.request.POST, instance=self.object)
# sending formset to the template
context['issues_formset'] = formset
# save in the DB (saves only what has changed)
#https://docs.djangoproject.com/en/2.1/topics/forms/modelforms/#saving-objects-in-the-formset
# if formset.is_valid():
formset.save()
# re-update context with new formset, this is need to refresh table in case of deleting an object
# without this, issue is deleted but still visible in the table
context['issues_formset'] = IssueFormset(instance=self.object)
else:
# sending formset to the template
context['issues_formset'] = IssueFormset(instance=self.object)
return context
В шаблоне:
<form method="post">{% csrf_token %}
<!-- Below line is important to avoid django exception:
[django 'ManagementForm data is missing or has been tampered with] -->
{{ issues_formset.management_form }}
<input name="save_all" type="submit" value="Save All Issues">
<div class="">
<table id="formset" class="form" border="1">
{% for form in issues_formset.forms %}
{% if forloop.first %}
<thead><tr>
{% for field in form.visible_fields %}
<th>{{ field.label|capfirst }}</th>
{% endfor %}
</tr></thead>
{% endif %}
<tr>
{% for field in form.visible_fields %}
<td>
{# Include the hidden fields in the form #}
{% if forloop.first %}
{% for hidden in form.hidden_fields %}
{{ hidden }}
{% endfor %}
{% endif %}
{{ field.errors.as_ul }}
{{ field }}
</td>
{% endfor %}
</tr>
{% endfor %}
</table>
</div>
</form>
надеюсь, это кому-нибудь поможет, пожалуйста, дайте мне знать, если у вас есть какие-либо комментарии