Django Admin: Как удалить кнопку «Сохранить и добавить ещё»?

Введение

Django Admin – мощный инструмент для управления данными вашего приложения. Он предоставляет готовый интерфейс для CRUD-операций (Create, Read, Update, Delete). Однако, иногда стандартный функционал может не соответствовать требованиям проекта, и возникает необходимость его модификации.

Проблема кнопки «Сохранить и добавить ещё» в Django Admin

По умолчанию, при создании или редактировании объекта в Django Admin, присутствует кнопка "Сохранить и добавить ещё". Эта кнопка позволяет сразу после сохранения текущего объекта перейти к созданию нового. Для некоторых сценариев использования эта кнопка может быть нежелательной.

Зачем удалять эту кнопку?

Существует несколько причин, по которым может потребоваться удаление кнопки "Сохранить и добавить ещё":

Ограничение функциональности для определенных ролей: Некоторым пользователям может быть достаточно прав только на редактирование существующих объектов, а не на создание новых.

Упрощение интерфейса: Меньшее количество кнопок может сделать интерфейс более понятным и удобным для конечного пользователя.

Предотвращение случайного создания дубликатов: В сложных моделях, случайное нажатие на кнопку "Сохранить и добавить ещё" может привести к нежелательным дубликатам данных.

Способы удаления кнопки «Сохранить и добавить ещё»

Существует несколько подходов к удалению кнопки "Сохранить и добавить ещё" из Django Admin:

Переопределение шаблона формы административной панели.

Использование JavaScript и CSS для скрытия кнопки.

Создание собственного AdminForm.

Переопределение шаблона формы административной панели

Этот метод подразумевает создание собственной версии шаблона, который отвечает за отображение формы добавления/редактирования объекта, и удаление из него блока с кнопкой "Сохранить и добавить ещё".

Использование JavaScript и CSS для скрытия кнопки

Этот метод основан на добавлении JavaScript/CSS кода в административную панель, который находит кнопку "Сохранить и добавить ещё" по селектору и скрывает её.

Создание собственного AdminForm

Этот метод включает в себя создание собственной формы, унаследованной от ModelForm, и переопределение её методов для предотвращения создания нового объекта при нажатии на кнопку "Сохранить и добавить ещё" (если она все же отображается).

Реализация переопределения шаблона

Создание нового шаблона для формы добавления/изменения

Создайте новый шаблон, например, templates/admin/yourapp/yourmodel/change_form.html. Скопируйте в него содержимое оригинального шаблона contrib/admin/templates/admin/change_form.html. Обычно этот файл располагается в директории venv/Lib/site-packages/django/contrib/admin/templates/admin/change_form.html или подобной, в зависимости от вашей установки.

Удаление блока с кнопкой «Сохранить и добавить ещё»

В скопированном шаблоне найдите блок, содержащий кнопку "Сохранить и добавить ещё". Обычно, это часть формы, содержащая несколько кнопок сохранения. Удалите или закомментируйте соответствующий код.

Настройка AdminClass для использования нового шаблона

В admin.py вашего приложения переопределите атрибут change_form_template вашего ModelAdmin класса, указав путь к созданному шаблону:

from django.contrib import admin
from .models import YourModel

@admin.register(YourModel)
class YourModelAdmin(admin.ModelAdmin):
    change_form_template = 'admin/yourapp/yourmodel/change_form.html'
Реклама

Реализация скрытия кнопки с помощью JavaScript и CSS

Добавление JavaScript/CSS в Admin

Можно добавить собственный JavaScript/CSS код в Django Admin, используя атрибуты Media в вашем ModelAdmin классе:

from django.contrib import admin
from .models import YourModel

@admin.register(YourModel)
class YourModelAdmin(admin.ModelAdmin):
    class Media:
        css = {
            'all': ('css/admin.css',)
        }
        js = ('js/admin.js',)

Создайте файлы css/admin.css и js/admin.js в директории static вашего приложения.

Поиск селектора кнопки «Сохранить и добавить ещё»

Используйте инструменты разработчика в вашем браузере, чтобы найти селектор кнопки "Сохранить и добавить ещё". Обычно это кнопка с определенным текстом или классом. Например, может быть что-то вроде input[name='_addanother'] или a.add-another.

Скрытие кнопки с помощью CSS или JavaScript

В css/admin.css добавьте CSS правило для скрытия кнопки:

input[name='_addanother'] {
    display: none !important;
}

Или, в js/admin.js добавьте JavaScript код для скрытия кнопки:

document.addEventListener('DOMContentLoaded', function() {
    let addAnotherButton = document.querySelector('input[name="_addanother"]');
    if (addAnotherButton) {
        addAnotherButton.style.display = 'none';
    }
});

Реализация через собственный AdminForm

Создание собственной формы, унаследованной от ModelForm

Создайте файл forms.py в вашем приложении и определите в нем форму, унаследованную от ModelForm:

from django import forms
from .models import YourModel

class YourModelForm(forms.ModelForm):
    class Meta:
        model = YourModel
        fields = '__all__'

Переопределение clean() или save() для предотвращения создания объекта при нажатии кнопки

Переопределите метод save() формы. Проверьте, была ли нажата кнопка "Сохранить и добавить ещё" (обычно, это можно проверить по наличию соответствующего значения в request.POST). Если да, то можно проигнорировать сохранение или поднять исключение, чтобы предотвратить создание нового объекта.

from django import forms
from .models import YourModel
from django.core.exceptions import ValidationError

class YourModelForm(forms.ModelForm):
    class Meta:
        model = YourModel
        fields = '__all__'

    def clean(self):
        cleaned_data = super().clean()
        if '_addanother' in self.data:
            raise ValidationError("Создание новых объектов через эту кнопку запрещено.")
        return cleaned_data

Использование custom AdminForm в ModelAdmin

В admin.py вашего приложения укажите вашу форму в атрибуте form вашего ModelAdmin класса:

from django.contrib import admin
from .models import YourModel
from .forms import YourModelForm

@admin.register(YourModel)
class YourModelAdmin(admin.ModelAdmin):
    form = YourModelForm

Заключение

Преимущества и недостатки каждого метода

Переопределение шаблона: Преимущество — наиболее надежный способ, гарантированно удаляет кнопку. Недостаток — требует копирования и поддержки шаблона, что может затруднить обновление Django.

JavaScript/CSS: Преимущество — простой и быстрый способ. Недостаток — зависит от структуры HTML Django Admin, которая может измениться в будущих версиях, ломая ваше решение. Кнопка фактически не удалена, а просто скрыта.

Собственный AdminForm: Преимущество — позволяет более гибко контролировать процесс сохранения данных. Недостаток — требует написания дополнительного кода и может быть сложнее в реализации.

Когда какой метод использовать

Если вам нужно гарантированно удалить кнопку и вы готовы поддерживать собственный шаблон, используйте переопределение шаблона.

Если вам нужно быстрое решение и вы не боитесь, что оно может сломаться в будущих версиях Django, используйте JavaScript/CSS.

Если вам нужна более сложная логика обработки данных при создании/редактировании объекта, используйте собственный AdminForm.


Добавить комментарий