user2239318
user2239318

Reputation: 2784

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.

Upvotes: 2

Views: 519

Answers (2)

Exis Zhang
Exis Zhang

Reputation: 560

The marked answer cannot be correct since I tested it and it will overwrite your existing object!

Use below instead (tested on Django 2.17 )


    def get_form_kwargs(self):
        kwargs = super().get_form_kwargs()

        old_item = get_object_or_404(Tutorial, pk=self.kwargs['pk'])
        new_item = deepcopy(old_item)
        new_item.id = None
        kwargs['instance'] = deepcopy(new_item)

        return kwargs

Upvotes: 2

Alasdair
Alasdair

Reputation: 309109

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

Upvotes: 2

Related Questions