【问题标题】:Perform update query after delete in django cbv在 django cbv 中删除后执行更新查询
【发布时间】:2017-12-04 02:54:17
【问题描述】:

成功删除数据后,我正在尝试更新其他表。下面是我的 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)

在我的urls.py

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

我的当前代码成功删除了该项目,但未能更新另一个表。

我的模特

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)

更新 1:

我关注this想出了

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)

但它返回了context must be a dict rather than int.

【问题讨论】:

    标签: python django


    【解决方案1】:

    我认为def get_form_kwargs(self): 没有执行,因为它用于FormMixin。但是,您也可以在 get() 函数中处理它。

    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)
    

    更多信息请参见https://ccbv.co.uk/projects/Django/1.11/django.views.generic.edit/DeleteView/


    编辑:

    如果在使用get() 方法时仍然遇到问题,请使用以下解决方案。

    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)
    

    【讨论】:

    • 感谢您的快速回复。我更新了上面的问题以应用我的建议,但我得到了回复 context must be a dict rather than int.
    • 它在kswargs['id'] 中返回了一个错误,我认为它必须是pk 所以我更改它并返回The view attendee.views.AttendeeDeleteView didn't return an HttpResponse object. It returned None instead.
    • 上面写着KeyError at /alumni/delete/16'id'
    • 只需将 kwargs['id'] 更改为 kwargs['pk'],请参阅我的更新。这是因为您的 urls.py 使用了 pk
    • 我使用 id = kwargs['pk'] 而不是 id = kwargs['id'] 。它删除了该项目,但没有发生更新。
    猜你喜欢
    • 2019-07-16
    • 2014-11-07
    • 2012-09-01
    • 2013-04-18
    • 1970-01-01
    • 2014-09-23
    • 1970-01-01
    • 1970-01-01
    • 2011-02-27
    相关资源
    最近更新 更多