Adding Custom Options to the Admin Action Dropdown
The Django admin panel provides a default "Actions" dropdown that allows you to apply operations to selected objects. You can extend this functionality by adding custom actions. Follow these steps to create and register custom admin actions:
1. Define a Custom Action
Create a function that defines the logic for your custom action. This function receives three arguments:
modeladmin
: The current model admin instance.request
: The HTTP request object.queryset
: The queryset of selected objects.
Example:
def mark_as_published(modeladmin, request, queryset):
updated_count = queryset.update(is_published=True)
modeladmin.message_user(
request,
f"{updated_count} book(s) marked as published."
)
mark_as_published.short_description = "Mark selected books as Published"
2. Register the Action
Include the custom action in the actions
attribute of your model admin class:
Example:
@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
list_display = ('title', 'is_published')
actions = [mark_as_published]
3. Result
The action will now appear in the "Actions" dropdown in the Django admin panel for the Book
model. Admin users can select multiple records and apply the action.
Adding Custom Buttons to the Admin Panel
In addition to actions, you can add custom buttons to the Django admin interface. These buttons can trigger specific views or execute logic directly.
1. Create a Custom Admin View
Define a method in your model admin class to handle the button click:
Example:
from django.urls import path
from django.http import HttpResponse
@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
list_display = ('title', 'is_published')
def get_urls(self):
urls = super().get_urls()
custom_urls = [
path('custom-action/', self.custom_action_view, name='custom-action')
]
return custom_urls + urls
def custom_action_view(self, request):
# Custom logic goes here
self.message_user(request, "Custom action executed successfully!")
return HttpResponse("Custom action executed!")
2. Add a Button to the Admin Template
Override the change_list.html
template to include a custom button:
Example:
{% extends "admin/change_list.html" %}
{% block object-tools-items %}
{{ block.super }}
<a class="button" href="{% url 'admin:custom-action' %}">Custom Action </a>
{% endblock %}