Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Delete sur inlineformset_factory

0 votes

Bonjour,

J'utilise Django pour gérer mes devis, il y a une table devis et une table devisrow qui contient chaque entrée relative a un devis. L'édition des lignes du devis fonctionne correctement, cependant je ne parviens pas a supprimer une ligne.

Au niveau de mon template, j'ai ajouté {% if form.instance.pk %}{{ form.DELETE }}{% endif %} :

    <tbody>
  {% for form in devisrows_formset.forms %}
        <tr id="{{ form.prefix }}-row">
      {% if form.id %}
      {% bootstrap_field form.id show_label=False show_help=False %}
      {% endif %}
      <td>{% if form.instance.pk %}{{ form.DELETE }}{% endif %}{% bootstrap_field form.description show_label=False show_help=False %}</td>
      <td>{% bootstrap_field form.quantite show_label=False show_help=False field_class="form-group quantite" %}</td>
      <td>{% bootstrap_field form.unites show_label=False show_help=False %}</td>
      <td>{% bootstrap_field form.prix_unitaire show_label=False show_help=False field_class="form-group prix-unite" %}</td>
      <td class="prix_total">€</td>
      <td></td>
    </tr>
  {% endfor %}
</tbody>

Comme j'utilise .save(commit=False), je suis la documentation de Django pour supprimer chaque champs via deleted_objects dans mon views.py :

        DevisRowFormset = inlineformset_factory(Devis, DevisRow, fields=(
            'description', 'quantite', 'unites', 'prix_unitaire'), can_delete=True, extra=0)

        devis_row_formset = DevisRowFormset(request.POST, instance=devis)
        if devis_row_formset.is_valid():
            devis_row_formset = devis_row_formset.save(commit=False)
            for obj in devis_row_formset.deleted_objects:
                obj.delete()
            for devis_row in devis_row_formset:
                devis_row.devis = devis
                devis_row.subtotal = devis_row.prix_unitaire * devis_row.quantite
                devis_row.save()

Lorsque je valide la modification, cela pète une erreur :

'list' object has no attribute 'deleted_objects'

Si je fais un print devis_row_formset, je vois bien le champs HTML correspondant avec une valeur a "checked" :

 <tr><th><label for="id_devisrow_set-3-DELETE">Supprimer :</label></th><td><input checked="checked" id="id_devisrow_set-3-DELETE" name="devisrow_set-3-DELETE" type="checkbox" />

Je ne vois pas où se trouve le problème, si quelqu'un a une idée :)
Merci

demandé 5-Jan par Stiquemou (206 points)

1 Réponse

0 votes

il faut renommer la varable devisrowformset pour pouvoir garder le formset originale et apeller deleted_objects depuis le formset et non pas les instances non sauvegadées récupérées depuis le save(commit=False).

répondu 18-Mar par Lens
...