Django:在form_valid中调用类函数

时间:2018-06-11 23:35:02

标签: django django-class-based-views

我有一个基于类的视图。我希望在保存时更新模型中的字段。该字段不是由用户设置的;它是一个字段,表示表单数据已更改,需要重新批准。我正在考虑解决这个问题的一种方法是在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)

2 个答案:

答案 0 :(得分:0)

使用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()方法。只需使用普通{{1}}。

答案 1 :(得分:0)

不要从那里获取对象,从form.instance获取。 update是查询集的方法,而不是模型实例;只需直接分配属性。

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