Как клонировать экземпляры модели в Django? - PullRequest
0 голосов
/ 10 апреля 2020

Я хочу, чтобы пользователь мог скопировать сообщение в блоге другого пользователя и сохранить его как свое собственное сообщение. По сути, когда пользователь копирует запись в блоге, я хочу создать новую запись в блоге, скопировав все поля из исходного сообщения в блоге, но без каких-либо изменений в исходном сообщении в блоге. Ниже приведен код, который я попробовал. Проблема с этим кодом заключается в том, что когда я пытаюсь скопировать сообщение в блоге, он меняет первичный ключ исходного сообщения в блоге. Я хочу, чтобы оригинальный пост оставался нетронутым. Мы ценим любые предложения. Спасибо!

class CopyView(LoginRequiredMixin, UpdateView):
model = Entry
template_name = 'entries/create_entry.html'
fields = ['entry_title','entry_text', 'entry_input', 'entry_output']

def form_valid(self, form):
    form.instance.entry_author = self.request.user
    post = self.get_object()
    post.save()
    post.pk=None
    post.save()
    return super().form_valid(form)

1 Ответ

0 голосов
/ 10 апреля 2020

Поскольку вы копируете существующую запись, вы создаете новую Entry, а не обновляете. Поэтому вы захотите создать подкласс CreateView и использовать get_initial() для копирования значений из существующего Entry. Это даст вам заполненную форму, которую вы можете редактировать и сохранять. Затем при отправке вам нужно только переопределить form_valid(), чтобы назначить entry_author, как вы делали выше. Вы можете передать существующую запись pk с таким URL-адресом:

    path('entries/<int:entry_id>/copy/', CopyView.as_view(), name='entry_copy'),

Затем в представлении:

class CopyView(LoginRequiredMixin, CreateView):
    model = Entry
    template_name = 'entries/create_entry.html'
    fields = ['entry_title','entry_text', 'entry_input', 'entry_output']

    def get_initial(self):
        initial = super().get_initial()
        existing_entry = Entry.objects.get(pk=self.kwargs['entry_id'])
        initial['entry_title'] = existing_entry.entry_title
        initial['entry_text'] = existing_entry.entry_text
        initial['entry_input'] = existing_entry.entry_input
        initial['entry_output'] = existing_entry.entry_output
        return initial

    def form_valid(self, form):
        form.instance.entry_author = self.request.user
        response = super().form_valid(form)
        return response
...