Удалить кнопку "Удалить выбранную модель" из связанных полей модели в форме создания модели (администратор Django)
В моих моделях у меня есть Document
модель с внешним ключом к Library
модель. Когда я нахожусь на сайте администратора Django, я хочу отключить редактирование и удаление Library
случаи, когда я создаю новый Document
,
Я пытался удалить разрешения на удаление и редактирование путем создания подклассов. django.contrib.admin.ModelAdmin
и удаление изменений / удаление разрешений
@admin.register(Library)
class LibraryAdmin(admin.ModelAdmin):
def has_delete_permission(self, request, obj=None):
return False
def has_change_permission(self, request, obj=None):
return False
Это делает ненужные кнопки исчезающими, но также полностью блокирует возможность редактирования и удаления Libraries
что не то, что я хочу. Есть ли способ отключить эти действия только в форме редактирования модели?
2 ответа
Вы можете пометить запрос в документе администратор:
def changeform_view(self, request, object_id=None, form_url='', extra_context=None):
request._editing_document = object_id is not None # add attribute
return super(DocumentAdmin, self).changeform_view(request, object_id=object_id, form_url=form_url, extra_context=extra_context)
Теперь вы можете получить доступ к этому флагу в соответствующем администраторе:
@admin.register(Library)
class LibraryAdmin(admin.ModelAdmin):
def has_delete_permission(self, request, obj=None):
if getattr(request, '_editing_document', False): # query attribute
return False
return super(LibraryAdmin, self).has_delete_permission(request, obj=obj)
Другой вариант, похожий на вариант schwobaseggl, будет:
@admin.register(Library)
class LibraryAdmin(admin.ModelAdmin):
def has_delete_permission(self, request, obj=None):
r = super(LibraryAdmin, self).has_delete_permission(request,obj)
if r:
referer = request.path
# Here we can check all the forms were we don`t want to allow Library deletion
if 'documentappname/document/' in referer:
r = False
return r
Плюсы: вам нужно только сделать функцию, где вы можете избежать удаления на многих страницах редактирования для разных моделей.
Минусы: он полагается на шаблон URL-адреса вашего приложения администратора, поэтому, если он меняет название приложения или модели (странно, но возможно), вам придется его изменить. Другой недостаток заключается в том, что он менее детализирован: вы не можете избежать удаления на основе какого-либо свойства удаляемого объекта. Вы могли бы сделать это с предложением Schwobaseggl.