Bienvenue sur IndexError.

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

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-2018 par Stiquemou (210 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-2018 par Lens
...