Можно ли сделать так, чтобы при удалении нескольких объектов одновременно не оставалось <2 объектов в админке Django?
У меня есть класс Highlight с отношением ForeignKey к классу Organism. На сайте администратора класс Highlights является вставкой класса Organism. Я хочу, чтобы у каждого объекта Organism было 2-5 Highlights. Я хочу, чтобы на странице администратора Organism было невозможно удалить Highlights из Organism таким образом, чтобы осталось <2.
В models.py:
class Organism(BaseModel):
...
class Highlight(BaseModel):
organism = models.ForeignKey(Organism, on_delete=models.CASCADE)
...
class HighlightAdmin(admin.ModelAdmin):
...
В файле admin.py:
class HighlightInline(admin.TabularInline):
model = Highlight
max_num = 5
extra = 1
min_num = 2
...
line_numbering = 0
def count(self):
return self.line_numbering
def line_number(self, obj):
self.line_numbering += 1
return self.line_numbering
def has_delete_permission(self, request, obj=None):
messages.add_message(request, messages.ERROR, (
request.POST.dict(), request
))
if obj.highlight_set.count() > self.min_num:
return True
elif obj.highlight_set.count() == self.min_num:
return False
messages.add_message(request, messages.ERROR, (
"Can't have fewer than 2 highlights"
))
return False
# return return super().has_delete_permission(request, obj)
class OrganismAdmin(admin.ModelAdmin):
inlines = [HighlightInline]
...
admin.site.register(Organism, OrganismAdmin)
admin.site.register(Highlight, HighlightAdmin)
Функция has_delete_permission
подсчитывает количество бликов, связанных с организмом, из которого мы удаляем блики.
Если количество бликов 0-2, то флажки Delete отсутствуют (что и предполагалось).
Когда есть >2 блика, флажки удаления есть. Если у меня есть 3 блика и я удаляю один из них, флажки удаления исчезают, и остается 2 блика (что и предполагалось).
Однако если у меня есть 3 блика и я выбираю 2-3 из них для удаления сразу, то остается 0-1 оставшийся блик (что плохо).
Я просмотрел эту тему и попробовал пронумеровать строки в таблице для Highlights с идеей использования данных в POST-запросе для предотвращения удаления Highlights #1 и #2. Однако, request.POST.get('action') == 'delete_selected'
(из темы) работает только для удаления основных моментов со страницы администрирования Highlight, но не со страницы Organism, где основные моменты являются строками. Кроме того, has_delete_permission
, похоже, запускается один раз перед удалением и два раза после, независимо от количества выделенных объектов, и поэтому выводит сообщение об ошибке дважды, а также не предотвращает фактическое удаление.
Одна из идей - отключить удаление со страницы организма и сделать так, чтобы можно было удалять яркие моменты, только найдя конкретный яркий момент на странице Highlights. Затем сделать поле в Highlights вместо HighlightInline для нумерации бликов 1-5 и предотвратить удаление бликов 1 и 2. Однако я не знаю, как будет работать перенумерация основных моментов после удаления некоторых из них. Кроме того, это потребует от пользователя искать конкретный блик, который он хочет удалить, среди всех существующих бликов, вместо того чтобы легко удалять его со страницы Organism.
Есть ли простое решение для этого? Любая помощь будет очень признательна.