Почему 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)

После ввода данных у меня не обновляется текущий объект, а формируется новый объект с данными формы.
  • Вопрос задан
  • 934 просмотра
Решения вопроса 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
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы