首页 > 解决方案 > Django:在form_valid中调用类函数

问题描述

我有一个基于类的视图。我想在保存模型时更新模型中的字段。该字段不是用户设置的;这是一个表示表单数据已更改并需要重新批准的字段。我正在考虑的一种方法是def form_valid查询模型并将字段设置为我需要的值。我正在运行的查询也在此类上定义的函数中。我可以运行这个函数def form_valid而不是真实地运行它吗?我所有的尝试都被证明是徒劳的。

class CUpdateView(LoginRequiredMixin, UpdateView):

    def get_object(self):
        qs = C.objects.filter(
                    c_id = self.kwargs.get('c_id')
                )

        if qs.count() == 1:
            if self.request.user == qs.first().a.user or self.request.user == qs.first().inhouselandmanager.user:
                pass
            else:
                raise PermissionDenied 
            return qs.first()
        raise Http404

    def form_valid(self, form): 
        if self.object.status != 'initiated':
            return HttpResponseRedirect(reverse('c:detail', kwargs={'c_id': str(self.object.c_id) }))
        qs = super().get_object()
        qs.update(approved=False)

        return super().form_valid(form)

标签: djangodjango-class-based-views

解决方案


而不是super().get_object()调用get_objects父类,使用self.get_object()

def form_valid(self, form): 
    if self.object.status != 'initiated':
        return HttpResponseRedirect(reverse('c:detail', kwargs={'c_id': str(self.object.c_id) }))
    qs = self.get_object()
    qs.approved=False
    qs.save() 

    return super().form_valid(form)

此外,由于qs是单个对象,因此您不能update()对它使用方法。只需使用正常save()的 .


推荐阅读