Как обновить несколько объектов одного типа с помощью factory_formset django? - PullRequest
0 голосов
/ 30 мая 2019

Я хочу обновить несколько объектов (formset).У меня есть модель, и я могу создать несколько объектов с этим:

class FormSeguridadView(CreateView):
    v = 0
    insp = 0
    form_class = RespFormSeguridad
    RespFormset = formset_factory(RespFormSeguridad, extra=0)
    template_name = 'formularios/formSeguridad.html'

    def get_context_data(self, **kwargs):
        v = self.v
        insp = self.insp
        context = super(FormSeguridadView, self).get_context_data(**kwargs)
        context['pregDocuObra'] = PRG.objects.filter(PRG_TIP=1)
        context['seguridad_form'] = self.RespFormset(initial=[
            {'RESP_INSP': insp, 'RESP_FORM': v, 'RESP_PRG': 11},
            {'RESP_INSP': insp, 'RESP_FORM': v, 'RESP_PRG': 12},
            {'RESP_INSP': insp, 'RESP_FORM': v, 'RESP_PRG': 13},
            {'RESP_INSP': insp, 'RESP_FORM': v, 'RESP_PRG': 14},
            {'RESP_INSP': insp, 'RESP_FORM': v, 'RESP_PRG': 19},
            {'RESP_INSP': insp, 'RESP_FORM': v, 'RESP_PRG': 20},
            {'RESP_INSP': insp, 'RESP_FORM': v, 'RESP_PRG': 21},
            {'RESP_INSP': insp, 'RESP_FORM': v, 'RESP_PRG': 22},
        ])

        return context

    def post(self, request, *args, **kwargs):
        resp_formset = self.RespFormset(self.request.POST, self.request.FILES)

        if resp_formset.is_valid():
            for respuestas in resp_formset:
                respuestas.save()

            return HttpResponseRedirect(reverse("index"))
        else:
            print(resp_formset.errors)
            return HttpResponseRedirect(reverse("index"))

И это моя часть из моей формы.код:

class FormSeguridadUpdateView(UpdateView):
    form_class = RespFormSeguridad
    template_name = 'formularios/formSeguridadUpdate.html'
    queryset = RESP.objects.all()

    def get_object(self, queryset=None):
        id_ = self.kwargs['pk']
        return get_list_or_404(RESP, RESP_INSP=2)

    def form_valid(self, form):
        print(form.cleaned_data)
        return super().form_valid(form)

Но это не работает.Выдает ошибку:

Traceback:

File "C:\Users\usuario\Desktop\Proyectos\inspecciones-moneleg\venv\lib\site-packages\django\core\handlers\exception.py" in inner
  34.             response = get_response(request)

File "C:\Users\usuario\Desktop\Proyectos\inspecciones-moneleg\venv\lib\site-packages\django\core\handlers\base.py" in _get_response
  115.                 response = self.process_exception_by_middleware(e, request)

File "C:\Users\usuario\Desktop\Proyectos\inspecciones-moneleg\venv\lib\site-packages\django\core\handlers\base.py" in _get_response
  113.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "C:\Users\usuario\Desktop\Proyectos\inspecciones-moneleg\venv\lib\site-packages\django\views\generic\base.py" in view
  71.             return self.dispatch(request, *args, **kwargs)

File "C:\Users\usuario\Desktop\Proyectos\inspecciones-moneleg\venv\lib\site-packages\django\views\generic\base.py" in dispatch
  97.         return handler(request, *args, **kwargs)

File "C:\Users\usuario\Desktop\Proyectos\inspecciones-moneleg\venv\lib\site-packages\django\views\generic\edit.py" in get
  190.         return super().get(request, *args, **kwargs)

File "C:\Users\usuario\Desktop\Proyectos\inspecciones-moneleg\venv\lib\site-packages\django\views\generic\edit.py" in get
  133.         return self.render_to_response(self.get_context_data())

File "C:\Users\usuario\Desktop\Proyectos\inspecciones-moneleg\venv\lib\site-packages\django\views\generic\edit.py" in get_context_data
  66.             kwargs['form'] = self.get_form()

File "C:\Users\usuario\Desktop\Proyectos\inspecciones-moneleg\venv\lib\site-packages\django\views\generic\edit.py" in get_form
  33.         return form_class(**self.get_form_kwargs())

File "C:\Users\usuario\Desktop\Proyectos\inspecciones-moneleg\app\forms.py" in __init__
  37.        super(RespFormSeguridad, self).__init__(*args, **kwargs)

File "C:\Users\usuario\Desktop\Proyectos\inspecciones-moneleg\venv\lib\site-packages\django\forms\models.py" in __init__
  292.             object_data = model_to_dict(instance, opts.fields, opts.exclude)

File "C:\Users\usuario\Desktop\Proyectos\inspecciones-moneleg\venv\lib\site-packages\django\forms\models.py" in model_to_dict
  82.     opts = instance._meta

Exception Type: AttributeError at /inspections/1/updateFormSeguridad/
Exception Value: 'list' object has no attribute '_meta'

Я не знаю, как решить эту проблему.Может быть, это не решение для редактирования нескольких объектов.Если кто-то знает, как решить эту проблему, пожалуйста, прокомментируйте здесь.

1 Ответ

0 голосов
/ 31 мая 2019

Ошибка возникает из-за того, что вы возвращаете список из метода get_object(), но этот метод должен возвращать экземпляр модели (экземпляр подкласса models.Model).

def get_object(self, queryset=None):
    ...
    return get_list_or_404(RESP, RESP_INSP=2)   # this causes the ERROR

Связанный связанный вопрос , упомянутый в комментарии к вопросу, также указывает на это.

Я прочитал ваш комментарий о том, что вы хотите обновить множество экземпляров, а не только один, но я не думаю, что переопределение get_object() является правильным способом сделать это. При этом я не знаю, как решить вашу проблему, я просто добавил этот ответ, чтобы объяснить, откуда исходит ошибка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...