Удалить кнопку "Удалить выбранную модель" из связанных полей модели в форме создания модели (администратор 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.

Другие вопросы по тегам