Как я могу удалить в одном представлении старую модель 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