Скопируйте объект с формой в django CBV - PullRequest
0 голосов
/ 18 июня 2020

У меня есть представление на основе функций 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 объекта, который нужно скопировать, но тогда мне нужно знать, где / как сделать это копия / новый объект, а не просто обновление исходного объекта.

1 Ответ

0 голосов
/ 18 июня 2020

предоставляет исходные данные словаря, а не объект.

class MyModelCopyView(MyModelCreateView):
    # pass your codes
    def get_initial(self):
        initial = {}
        pk = self.kwargs.get('object_id')
        if pk:
            # need to cast object to dictionary
            obj = MyModel.objects.filter(pk=pk).values()
            if obj:
                d = obj[0]
                d.pop('id')
                initial.update(d)
                # handle data here
        return initial
...