es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

django-bootstrap-modal-forms guardando la instancia dos veces (no se pudo resolver con otros problemas abiertos)

Estoy implementando django-bootstrap-modal-forms 2.2.0 en mi aplicación de Django, pero estoy teniendo un problema. Cada vez que envío el formulario modal, se crea la instancia dos veces.

Leí que es esperado tener dos solicitudes POST… el problema es que estoy haciendo algunas cosas en el formulario antes de guardarlo (agregar un valor de muchos a muchos) y como estoy intentando anular la función save ahora, termina guardando el modelo dos veces.

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 = 'Éxito: se creó el director.'
    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)
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema aquí es que el formulario se está guardando dos veces debido a que el método form_valid está llamando a form.save() y luego guardándolo nuevamente con el método obj.save().

    Para solucionar este problema, puedes eliminar el método form_valid y en su lugar sobrescribir el método save en DirectorModelForm:

    class DirectorModelForm(BSModalModelForm):
        class Meta:
            model = Contact
            exclude = ['owner', 'matching_user', 'id', 'referral', 'name_surname', 'title', 'city']
    
        def save(self, commit=True):
            obj = super().save(commit=False)
            obj.owner = self.request.user
            obj.title.add(Title.objects.get(title_name='Director', title_department='Production'))
            if commit:
                obj.save()
            return obj
    

    Esto utilizará el método super.save() para crear el objeto, pero con commit=False para que no lo guarde en la base de datos de inmediato. Luego, puedes realizar acciones adicionales en el objeto antes de guardarlo tú mismo con obj.save().

Comments are closed.