Введение
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.