Search code examples
djangodjango-viewsclone

Django clone model object with class based createview


I want to prepare a new object but wait for user input to create it:

I've added get_form to this view:

class MyCreateView(CreateView):

    def get_form(self, form_class):
        form = super(MyCreateManView, self).get_form(form_class)
        if self.kwargs['ref']:
            new_item = get_object_or_404(models.MyModel, pk = self.kwargs['ref'])
            new_item.pk = None 
            new_item.note = "Copia di " + new_item.note 
            form =  MyForm(instance = new_item)

    def form_valid(self, form):
        ...

In the method, I read the GET parameter 'ref' and precompile the form fields with that data.

But when I submit the data, the form_valid method is not executed and the new object is not created.


Solution

  • When you do,

    form  =  MyForm(instance = new_item)
    

    you are not binding the form to any data. This means that the form will never be valid.

    I would try overriding get_form_kwargs instead.

    def get_form_kwargs(self):
        kwargs = super(MyCreateView, self).get_form_kwargs()
        if self.kwargs['ref']:
            new_item = get_object_or_404(models.MyModel, pk = self.kwargs['ref'])
            ...
            kwargs['instance'] = new_item
        return kwargs