Django-bootstrap-modal-forms дважды сохраняет экземпляр (не удалось решить, так как были открыты другие проблемы)

Я внедряю django-bootstrap-modal-forms 2.2.0 в свое приложение django, но у меня возникла проблема. Каждый раз, когда я отправляю модальную форму, экземпляр создается дважды.

Я прочитал, что ожидается два запроса на почту... проблема в том, что я делаю несколько вещей на форме перед сохранением (добавляю значение "многие ко многим"), и поскольку я пытаюсь переопределить функцию сохранения сейчас, это заканчивается сохранением модели дважды.



class DirectorModelForm(BSModalModelForm):
    class Meta:
        model = Contact
        exclude = ['owner', 'matching_user', 'id', 'referral', 'name_surname','title','city']



class NewDirectorView(BSModalCreateView):
    template_name = 'action/forms/DirectorModelForm.html'
    form_class = DirectorModelForm
    success_message = 'Success: Director was created.'
    success_url = reverse_lazy('action:new_jobproject')

    def get_object(self):
        pk = self.kwargs.get('pk')
        director = get_object_or_404(Contact, pk=pk)
        return director

    def form_valid(self, form):
        obj = form.save(commit=False)
        obj.owner = self.request.user
        obj.save()
        obj.title.add(Title.objects.get(title_name='Director', title_department='Production'))
        return super().form_valid(form)

Как объяснил Foocli здесь, дело в том, что django-bootstrap-modal-forms выполняет дополнительный ajax-запрос к тому же url для валидации формы. Таким образом, все связанные функции фактически вызываются дважды, но в пакете сохранение экземпляра во время ajax-запроса предусмотрено в методе сохранения формы . А в вашем коде вы вызываете obj.save() в view's form_valid, и это выполняется дважды.

Рассмотрите возможность обернуть ваши дополнительные действия в if, подобно решению Алекса :

    def form_valid(self, form):
        if not self.request.is_ajax()
            obj = form.save(commit=False)
            obj.owner = self.request.user
            obj.save()
            obj.title.add(Title.objects.get(title_name='Director', title_department='Production'))
        return super().form_valid(form)
Вернуться на верх