Carlos Fabiera
Carlos Fabiera

Reputation: 79

Perform update query after delete in django cbv

I'm trying to update other table after successful delete of of data. Below is my views.py

class AttendeeDeleteView(DeleteView):
    model = Attendee
    success_url = reverse_lazy('index')

    def get_form_kwargs(self):
        id = self.kwargs['id']  # get value of enr
        Payment.objects.filter(pk=id).update(registered=0)

In my urls.py

url(r'^delete/(?P<pk>\d+)$', AttendeeDeleteView.as_view(template_name="includes/attendee_delete.html"), name='attendee_delete',),

My Current code successfully delete the item but failed to update the other table.

my model

class Payment(models.Model):
    id = models.AutoField(primary_key=True)
    payee = models.CharField(max_length=200, blank=True, null=True)
    contact = models.CharField(max_length=200,blank=True, null=True)
    batch = models.CharField(max_length=200, null=True, blank=True)
    ticketNumber = models.CharField(max_length=200)
    ticketType = models.CharField(max_length=200, choices=TICKET_CHOICES, default='paid')
    date = models.DateField('Date Paid (MM/DD/YYYY)', max_length=200,  null=True, blank=True)
    remarks = models.CharField(max_length=200 ,blank=True, null=True)
    registered = models.BooleanField(default=False)
    def __str__(self):
        return  self.payee



class Attendee(models.Model):
    id = models.AutoField(primary_key=True)
    payment = models.OneToOneField(Payment, on_delete=models.CASCADE,  null=True, blank=True)
    name = models.CharField(max_length=200)
    batch = models.CharField(max_length=200, blank=True, null=True)
    department = models.CharField(max_length=200, choices=DEPT_CHOICES, default='')
    remarks = models.CharField(max_length=200, blank=True, null=True)

UPDATE 1:

I followed this came up with

def get(self, request, *args, **kwargs):
        id = kwargs['pk']  # get value of enr
        context = Payment.objects.filter(pk=id).update(registered=0)
        return self.render_to_response(context)

but it returned context must be a dict rather than int.

Upvotes: 0

Views: 512

Answers (1)

binpy
binpy

Reputation: 4194

I think def get_form_kwargs(self): doesn't executed, because it used for FormMixin. But, you can also handle it inside get() function.

def get(self, request, *args, **kwargs):
    attendee = self.get_object()
    Payment.objects.filter(pk=attendee.payment.pk).update(registered=0)

    context = self.get_context_data(object=attendee)
    return self.render_to_response(context)

See this https://ccbv.co.uk/projects/Django/1.11/django.views.generic.edit/DeleteView/ for more..


Edit:

This solution below if still getting a problem when using get() method.

from django.http import HttpResponseRedirect
....


def delete(self, request, *args, **kwargs):
    """
    Calls the delete() method on the fetched object and then
    redirects to the success URL.
    """
    self.object = self.get_object()
    success_url = self.get_success_url()

    Payment.objects.filter(pk=self.object.payment.pk).update(registered=0)

    self.object.delete()
    return HttpResponseRedirect(success_url)

Upvotes: 1

Related Questions