Объект экземпляра, переданный Django forms, переопределяется в is_valid

#python #django #memory #copy

#python #джанго #память #Копировать

Вопрос:

Я работал над представлением Django , которое обновляет определенный объект модели x . В методе POST я инициирую ModelForm и передаю instance объект модели x . Но когда я пытаюсь использовать x объект внутри if form.is_valid(): блока, некоторые значения в vars(x) go None . Вот фрагмент текста, объясняющий сценарий.

 class MyUpdateView(generic.View):
    form_class = MyModelForm
    def post(self, request, *args, **kwargs):
        model_obj = MyModel.objects.get(id=kwargs.get("pk"))
        # Example: {"emp": 113, "project": 22, "salary": 28000}
        form = self.form_class(request.POST, instance=model_obj)
        print(vars(model_obj)) # works fine, shows all the data

        if form.is_valid():
            print(vars(model_obj)) # few values go None, not reusable
            # Example: {"emp": None, "project": None, "salary": 28000}
 

Как мы можем видеть, когда переменные проверяются внутри form.is_valid() , что-то происходит с переданным instance объектом.

Какая может быть причина этого?

Комментарии:

1. Кажется маловероятным, что это весь ваш код, поскольку вы не передаете объект, вы получаете экземпляр непосредственно из базы данных на основе переданного вами pk. Это не меняется при вызове form.is_valid() . Хорошая попытка получить минимально воспроизводимый пример, но я думаю, что вы вырезали бит, вызывающий проблему 🙂

2. Подождите, вы знаете, что — я лгу вам! На самом деле это было для меня новым 🙂 code.djangoproject.com/ticket/14885 — судя по всему, такое поведение вполне ожидаемо.