У меня есть представление на основе функций Django, которое копирует объект модели с помощью ModelForm
def my_model_copy(request, object_id):
new_object = get_object_or_404(MyModel, pk=object_id)
new_object.pk = None # autogen a new primary key (object_id by default)
# some other unique fields that need updating
new_object.import_id = uuid.uuid4()
new_object.name = new_object.name + " - COPY"
form = MyModelForm(request.POST or None, instance=new_object)
# lots more code I am repeating in MyModelCreateView()
Я пытаюсь обновить это, чтобы использовать мой CreateView
CBV до DRY out мой код, но где мне установить начальный экземпляр объекта? Я пробовал пару мест:
переопределение get()
class MyModelCopyView(MyModelCreateView):
def get(self, request, *args, **kwargs): # Not the right place... Where to put this code?
super_response = super().get(request, *args, **kwargs)
# make a copy of the object
new_object = get_object_or_404(MyModel, pk=self.kwargs['object_id'])
new_object.pk = None # autogen a new primary key (object_id by default)
# some other unique fields that need updating
new_object.import_id = uuid.uuid4()
new_object.name = new_object.name + " - COPY"
return super_response
переопределение get_form()
def get_form(self, *args, **kwargs):
form = super().get_form(*args, **kwargs)
# make a copy of the object
new_object = get_object_or_404(MyModel, pk=self.kwargs['object_id'])
new_object.pk = None # autogen a new primary key (object_id by default)
# some other unique fields that need updating
new_object.import_id = uuid.uuid4()
new_object.name = new_object.name + " - COPY"
form.instance = new_quest
return form
Но ... это не работает. Форма не заполнена с помощью new_object
В качестве альтернативы я мог бы вместо этого унаследовать от MyModelUpdateView()
, начиная с pk объекта, который нужно скопировать, но тогда мне нужно знать, где / как сделать это копия / новый объект, а не просто обновление исходного объекта.