Как совместить ListView и UpdateView - PullRequest
0 голосов
/ 06 ноября 2019

В моем веб-приложении у меня есть шаблон с 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>

надеюсь, это кому-нибудь поможет, пожалуйста, дайте мне знать, если у вас есть какие-либо комментарии

...