Почему form_valid не обновляет объект а создает новую запись?

Подскажите пожалуйста друзья, как правильно сохранить instance после валидации формы.

#forms.py
from django import forms
from clinic.models import Doctor

class DoctorForm(forms.ModelForm):
    class Meta:
        model = Doctor
       fields = [_all_]
#views.py
class DoctorDetailView(FormMixin, DetailView):
    form_class = DoctorForm
    model = Doctor

    def get_success_url(self):
        return reverse('doctor_detail', kwargs={'pk': self.object.pk})

    def get_context_data(self, **kwargs):
        #Получаем непосредственно сам объект
        objectDoctor = Doctor.objects.get(pk =self.object.pk)
        context = super(DoctorDetailView, self).get_context_data(**kwargs)
        #Передаем инстанс объекта в форму
        context['form'] = self.form_class(instance = objectDoctor)
        return context

    def post(self, request, *args, **kwargs):
        self.object = self.get_object()
        form_class = self.get_form_class()

        form = self.get_form(form_class)
        if form.is_valid():
            return self.form_valid(form)
        else:
            return self.form_invalid(form)

    def form_valid(self, form):
        #Сохраняем данные полученные из POST
        # self.object = form.save(commit = False)
        instance = form.save()
        instance.save() 
        return super(DoctorDetailView, self).form_valid(form)

После ввода данных у меня не обновляется текущий объект, а формируется новый объект с данными формы.
  • Вопрос задан
  • 875 просмотров
Решения вопроса 1
@Michaelmrc
посмотри вот тут:
UpdateView
CreateView

Посмотри на различия для Create и Update View, а именно на self.get_object() и self.get_form_kwargs().
Функция get_form_kwargs возвращает словарь с ключами 'initial', 'instance', 'data', 'files', и 'instance' определяется в ModelFormMixin (а в твоем случае ты его не используешь). Когда в get_form_kwargs значение 'instance' объект модели - форма обновляет объект, когда None - создает новый.

Дополнение:
Да, в ModelFormMixin instance уже передается в форму из self.object. Откройте ModelFormMixin и разверните "def get_form_kwargs(self):" и то что в нем. ModelFormMixin наследует FormMixin, в переопределенном методе get_form_kwargs вызывает super(), а в полученный словарь дописывает instance:
def get_form_kwargs(self):
    """
    Returns the keyword arguments for instantiating the form.
    """
    kwargs = super(ModelFormMixin, self).get_form_kwargs()
    if hasattr(self, 'object'):
        kwargs.update({'instance': self.object})
    return kwargs
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
sim3x
@sim3x
Почитай, что внутри FormMixin находится
https://github.com/django/django/blob/master/djang...

Или пройдись дебагером
Потом попробуй убрать post
Потом посмотри на ModelFormMixin
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
26 апр. 2024, в 09:18
500 руб./в час
26 апр. 2024, в 06:46
1500 руб./в час
26 апр. 2024, в 05:31
1000 руб./за проект