Django: вызвать функцию класса в form_valid - PullRequest
0 голосов
/ 12 июня 2018

У меня есть представление на основе классов.Я хочу обновить поле в модели всякий раз, когда оно сохраняется.Это поле не установлено пользователем;это поле, в котором говорится, что данные формы были изменены и требуют повторного утверждения.Один из способов думать об этом - в 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 голосов
/ 12 июня 2018

Не берите оттуда объект, получите его от form.instanceupdate - это метод для наборов запросов, а не экземпляров модели;просто назначьте атрибут напрямую.

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)
0 голосов
/ 12 июня 2018

Вместо 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().

...