Django - How to delete a object directly from a button in a table

Viewed 16152

(sorry for my bad english)

I need to delete an object, but directly from a list of the objects that y have in my template.

I have a work orders, that have spare parts but i don't know how to create the deleteview for the spare parts using only a buton in the detailview of the work order. The idea is that the user make click in the Delete button.

This is the model of the Spare Parts

class OrderSparePart(models.Model):
    # Relations
    workorder = models.ForeignKey(
            WorkOrder,
            verbose_name=_('order'),
        )
    # Attributes - Mandatory
    spare_part = models.CharField(
            max_length=80,
            verbose_name=_('spare part'),
        )
    # Attributes - Optional
    price = models.DecimalField(
            max_digits=6,
            decimal_places=2,
            null=True,
            blank=True,
            verbose_name=_('price'),
        ) 
    # Object Manager
    # Custom Properties
    # Methods
    def get_absolute_url(self):
        return reverse('work_orders:detail', kwargs={'order_id': self.workorder.id})

    # Meta and String
    class Meta:
        verbose_name = _("order spare part")
        verbose_name_plural = _("order spare parts")

This is where is showed in the template

                  {% if spare_parts %}
                  <table class="table">
                    <thead>
                      <tr>
                        <th>{% trans "Spare Part" %}</th>
                        <th>{% trans "Price" %}</th>
                        <th>{% trans "Delete" %}</th>
                      </tr>
                    </thead>
                    <tbody>
                      {% for part in spare_parts %}
                      <tr>
                        <td><i class="fa fa-gear"></i> {{ part.spare_part }}</td>
                        {% if part.price %}
                        <td>$ {{ part.price }}</td>
                        {% else %}
                        <td></td>
                        {% endif %}
                        <td><a href="#"><i class="fa fa-trash"></i></a></td>
                      </tr>
                      {% endfor %}
                    </tbody>
                  </table>
                {% else %}
                <p>NO HAY REPUESTOS ASENTADOS AÚN</p>
                {% endif %}

The the idea is use the to delete the spare part.

how i have to make the deleteview and the link to this???

Thanks!

3 Answers

My solutions works best for django 4.0.3 and is the combination of gahan and Abi waqas answers. Use this one if you are using django 3 or above

Add the following to views.py

def delete_object_function(request, id):
    # OrderSparePart is the Model of which the object is present

    ob = OrderSparePart.objects.get(id=id)
    ob.delete()
    return redirect('page-delete.html') # for best results, redirect to the same page from where delete function is called

Add the following to urls.py

path('page-delete/<int:id>', views.delete_object_function, name='delete_object'),

Add the following code to the django template from where the delete function is to be called.

Let's say page-delete.html

<form action="{% url 'delete_object' id=part.id %}" method="post">
   {% csrf_token %}
   <button class="btn btn-danger" type="submit" ><i class="fa fa-trash"></i></button>
</form>

This works as I've used this solution in my own code.

Related