Skip to main content

Django Admin Confirm

PyPI Tests Status codecov PyPI - Python Version PyPI - Django Version PyPI - License


Features

  • AdminConfirmMixin Based on django-admin-confirm with support for django-object-actions AdminConfirmMixin is a mixin for ModelAdmin to add confirmations to change, add and actions.

  • AdminFormMixin AdminFormMixin is a mixin for ModelAdmin to add a form to configure your actions.

  • Ability to Confirm an action form with a preview of the objects and form data

  • Add support to chain form


ScreenShot

Confirm ScreenShot

Screenshot of Change Confirmation Page

Screenshot of Add Confirmation Page

Screenshot of Action Confirmation Page

Form ScreenShot

Screenshot of The Action Form


Installation

Install django-admin-action-tools by running:

poetry add django-admin-action-tools

Add admin_action_tools to INSTALLED_APPS in your project settings before django.contrib.admin:

INSTALLED_APPS = [
    ...
    'admin_action_tools',

    'django.contrib.admin',

    ...
    'widget_tweaks'
    ...
]

To use ActionFormMixin you also need to add widget_tweaks to the INSTALLED_APPS

Note that this project follows the template override rules of Django. To override a template, your app should be listed before admin_action_tools in INSTALLED_APPS.

Configuration Options

Environment Variables:

Caching is used to cache files for confirmation. When change/add is submitted on the ModelAdmin, if confirmation is required, files will be cached until all validations pass and confirmation is received.

  • ADMIN_CONFIRM_CACHE_TIMEOUT default: 1000
  • ADMIN_CONFIRM_CACHE_KEY_PREFIX default: admin_confirm__file_cache

Attributes:

  • confirm_change Optional[bool] - decides if changes should trigger confirmation
  • confirm_add Optional[bool] - decides if additions should trigger confirmation
  • confirmation_fields Optional[Array[string]] - sets which fields should trigger confirmation for add/change. For adding new instances, the field would only trigger a confirmation if it's set to a value that's not its default.
  • change_confirmation_template Optional[string] - path to custom html template to use for change/add
  • action_confirmation_template Optional[string] - path to custom html template to use for actions

Note that setting confirmation_fields without setting confirm_change or confirm_add would not trigger confirmation for change/add. Confirmations for actions does not use the confirmation_fields option.

Method Overrides: If you want even more control over the confirmation, these methods can be overridden:

  • get_confirmation_fields(self, request: HttpRequest, obj: Optional[Object]) -> List[str]
  • render_change_confirmation(self, request: HttpRequest, context: dict) -> TemplateResponse
  • render_action_confirmation(self, request: HttpRequest, context: dict) -> TemplateResponse

Usage

AdminConfirmMixin

It can be configured to add a confirmation page on ModelAdmin upon:

  • saving changes
  • adding new instances
  • performing actions

Confirm Change:

    from admin_action_tools import AdminConfirmMixin

    class MyModelAdmin(AdminConfirmMixin, ModelAdmin):
        confirm_change = True
        confirmation_fields = ['field1', 'field2']

This would confirm changes on changes that include modifications onfield1 and/or field2.

Confirm Add:

    from admin_action_tools import AdminConfirmMixin

    class MyModelAdmin(AdminConfirmMixin, ModelAdmin):
        confirm_add = True
        confirmation_fields = ['field1', 'field2']

This would confirm add on adds that set field1 and/or field2 to a non default value.

Note: confirmation_fields apply to both add/change confirmations.

Confirm Action:

    from admin_action_tools import AdminConfirmMixin

    class MyModelAdmin(AdminConfirmMixin, ModelAdmin):
        actions = ["action1", "action2"]

        def action1(modeladmin, request, queryset):
            # Do something with the queryset

        @confirm_action()
        def action2(modeladmin, request, queryset):
            # Do something with the queryset

        action2.allowed_permissions = ('change',)

This would confirm action2 but not action1.

Action confirmation will respect allowed_permissions and the has_xxx_permission methods.

Note: AdminConfirmMixin does not confirm any changes on inlines

Confirm Object Action:

    from admin_action_tools import AdminConfirmMixin
    from django_object_actions import DjangoObjectActions

    class MyModelAdmin(AdminConfirmMixin, DjangoObjectActions, ModelAdmin):
        change_actions = ["action1"]

        @confirm_action()
        def action1(self, request, object):
            # Do something with the object

AdminFormMixin

Action Form

    from admin_action_tools import ActionFormMixin, add_form_to_action
    from myapp.form import NoteActionForm
    from django_object_actions import DjangoObjectActions

    class MyModelAdmin(ActionFormMixin, DjangoObjectActions, ModelAdmin):
        change_actions = ["object_action"]

        @add_form_to_action(NoteActionForm)
        def action1(modeladmin, request, queryset, form=None):
            # Do something with the queryset

        @add_form_to_action(NoteActionForm)
        def object_action(modeladmin, request, object, form=None):
            # Do something with the object

Chaining tools

    from admin_action_tools import AdminConfirmMixin, ActionFormMixin, confirm_action, add_form_to_action
    from django_object_actions import DjangoObjectActions
    from myapp.form import NoteActionForm

    class MyModelAdmin(AdminConfirmMixin, ActionFormMixin, DjangoObjectActions, ModelAdmin):
        change_actions = ["action1"]

        @add_form_to_action(NoteActionForm)
        @confirm_action()
        def action1(self, request, object, form=None):
            # Do something with the object

This will chain form and confirmation. The confirmation page will have the actions & form values displayed. If you only want the action (same as confirm only), you can pass the following argument

    from admin_action_tools import AdminConfirmMixin, ActionFormMixin, confirm_action, add_form_to_action
    from django_object_actions import DjangoObjectActions
    from myapp.form import NoteActionForm

    class MyModelAdmin(AdminConfirmMixin, ActionFormMixin, DjangoObjectActions, ModelAdmin):
        change_actions = ["action1"]

        @add_form_to_action(NoteActionForm)
        @confirm_action(display_form=False)
        def action1(self, request, object, form=None):
            # Do something with the object and form
    from admin_action_tools import AdminConfirmMixin, ActionFormMixin, confirm_action, add_form_to_action
    from django_object_actions import DjangoObjectActions
    from myapp.form import NoteActionForm, SecondForm

    class MyModelAdmin(AdminConfirmMixin, ActionFormMixin, DjangoObjectActions, ModelAdmin):
        change_actions = ["action1"]

        @add_form_to_action(NoteActionForm)
        @add_form_to_action(SecondForm)
        @confirm_action()
        def action1(self, request, object, forms=None):
            # Do something with the object and forms

This will chain 2 forms and confirmation. The confirmation page will have the actions & form values displayed.

if you want to not display the impacted objects, you can use

    from admin_action_tools import AdminConfirmMixin, ActionFormMixin, confirm_action, add_form_to_action
    from django_object_actions import DjangoObjectActions
    from myapp.form import NoteActionForm, SecondForm

    class MyModelAdmin(AdminConfirmMixin, ActionFormMixin, DjangoObjectActions, ModelAdmin):
        change_actions = ["action1"]

        @add_form_to_action(NoteActionForm, display_queryset=False)
        @add_form_to_action(SecondForm, display_queryset=False)
        @confirm_action(display_queryset=False)
        def action1(self, request, object, forms=None):
            # Do something with the object and forms

Adding Colors

    from admin_action_tools import AdminConfirmMixin, ActionFormMixin, confirm_action, add_form_to_action
    from django_object_actions import DjangoObjectActions
    from myapp.form import NoteActionForm, SecondForm

    class MyModelAdmin(ActionFormMixin, DjangoObjectActions, ModelAdmin):
        change_actions = ["action1", "action2"]

        @add_form_to_action(NoteActionForm, display_queryset=False)
        @color_action(color="green") # Set HTML color
        def action1(self, request, object, form=None):
            # Do something with the object and forms


        @add_form_to_action(NoteActionForm, display_queryset=False)
        @color_action(attrs={"style": "background-color: lightblue; color: black"}) # Or you can pass the style directly
        def action2(self, request, object, form=None):
            # Do something with the object and forms

Development

Check out our development process if you're interested.

Metadata

Release files for django-admin-action-tools 1.3.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for django-admin-action-tools 1.3.1
File Size Uploaded
django_admin_action_tools-1.3.1.tar.gz 129.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for django-admin-action-tools 1.3.1
File Interpreter ABI Platform
django_admin_action_tools-1.3.1-py3-none-any.whl Python 3 none any Details

Total release size: 278.8 kB

Release files / django_admin_action_tools-1.3.1.tar.gz

Download URL django_admin_action_tools-1.3.1.tar.gz
Size 129.4 kB
Tags Source
SHA-256 checksum
How to use checksums
8a76291e33310a4709e94fe07ec787e1f544fdd4b821172e2b3a3c53ea6acb71
BLAKE2b-256 checksum
How to use checksums
cc659166925f03b6e4f6f29d767bb3d562dcec520c1224dcadd37f3554dd2165
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/2.2.1 CPython/3.9.25 Linux/6.11.0-1018-azure

Release files / django_admin_action_tools-1.3.1-py3-none-any.whl

Download URL django_admin_action_tools-1.3.1-py3-none-any.whl
Size 149.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
7d7f6d7fd9254d028e64303e6acda4d71dc80691060f1cfe6258e129bd877936
BLAKE2b-256 checksum
How to use checksums
c3d980cbe60ffc05b1edc460b72d56e94904258fb57a75c2959ecc645d948abd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/2.2.1 CPython/3.9.25 Linux/6.11.0-1018-azure
Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page