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)