2

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.

2
  • if form.is_valid(): form = form.save(); context = { "form": form, } ; return render(request, "app/template.html", context) Commented Apr 8, 2016 at 9:18
  • 2
    Is it a class based view or a normal view? If it is not a class based view then super(MyCreateManView, self).form_valid(form) doesn't make much sense. Have you got this code from somewhere else and copied in bits and pieces? Commented Apr 8, 2016 at 9:21

2 Answers 2

2

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
Sign up to request clarification or add additional context in comments.

Comments

2

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.