Reputation: 2784
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
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
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