Как я могу удалить в одном представлении старую модель OBJECT и создать новую с КОПИРУЕМЫМИ полями? Django

У меня есть модель Книга:

models.py

class Book(core.BaseModel):
    MAX_TAG_NUMBER = 99999

    class Statuses(models.IntegerChoices):
        AVAILABLE = 1, 'Available'
        NOT_AVAILABLE = 2, 'Not Available'

  
    author = models.ForeignKey(
        Author, models.PROTECT, verbose_name='Author',
        related_name='author_name',
    )
    
    tag_number = models.PositiveIntegerField('Tag number', validators=[
        MinValueValidator(1),
        MaxValueValidator(MAX_TAG_NUMBER),
    ])
    year = models.PositiveSmallIntegerField(
        'Year', default=default_current_year, validators=[validate_current_year],
    )
    status = models.PositiveSmallIntegerField('Status', choices=Statuses.choices, default=Statuses.AVAILABLE)

Я хочу создать кнопку, которая удаляет объект по id и копирует все поля из этого старого объекта и создает новый объект модели с этими полями, за исключением удаленного поля 'tag_number', которое я хочу создать снова. Я создал следующее:

class BookUpdateView(core.DeleteView):
    form_class = BookTagForm
    template_name = 'book/book_update.html'
    success_url = reverse_lazy('book:book-list')

Но я не понимаю: 1)как удалить все эти поля в View и создать новый объект с этой копией полей EXCLUDE tag_number? 2)Какое представление должно быть? CreateView, UpdateView? Как я могу удалить и создать в одном и том же представлении

class BookTagForm(core.ModelForm):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)


    class Meta:
        model = Book
        fields = ('tag_number', 'author', )

    def save(self, commit=True):
        instance = super().save(commit=False)
        instance = Book.objects.create(
            author=self.cleaned_data['author'],
            status=self.cleaned_data['status'],
            tag_number=self.cleaned_data['tag_number'],
            year=self.cleaned_data['year'],
        )
        if commit:
            instance.save()
        return instance

Что-то вроде этого может помочь, если я правильно понял ваш вопрос.

Однако я бы поставил под сомнение вашу модель данных - почему именно вам нужно удалять экземпляры? Это нарушит внешние ключи и тому подобное...

class BookUpdateView(core.UpdateView):
    form_class = BookTagForm
    template_name = 'book/book_update.html'
    success_url = reverse_lazy('book:book-list')


class BookTagForm(core.ModelForm):
    class Meta:
        model = Book
        fields = ('tag_number', 'author')

    def save(self, commit=True):
        assert commit  # this function doesn't work correctly when not committing
        assert self.instance.pk  # work on existing models only
        self.instance.delete()  # delete old instance from database
        self.instance.pk = None  # remove pk from instance, thus making save() create a new instance
        self.instance = super().save()  # assigns the new fields from this form and saves the object
        return self.instance
Вернуться на верх