Admin actions

../../_images/actions.png

Extra Action Form

Admin Actions in daily usage often require one or more arguments. This extension provides an easy way to display a form to fill in what needs to be passed to the actions. Namely:

  1. Create a form that holds all the fields needed for any action and set action_form on your ExtendibleModelAdmin pointing to that form.

    Caution

    Set any additional field as required = False otherwise all actions that don’t define that will will not let the form validate and you’ll get “No action selected”. See below the syntax to declare a required field just for one action

  2. Configure which fields are needed for any action (fields_map dict) and set attribute fields_map on your ExtendibleModelAdmin

  3. Modify change_list.html template to add

    • templatetag to render admin/actions.html (inluded in {jmb.core}result_list)
    • javascript to toggle visibility of the fields

    this step is already done in jmb.core provided template

The ActionForm

When ModelAdmin has actions enabled, Django creates a form and attaches it to attribute action_form, thought is not officially documented. This action will hold

  • the selected action
  • the selected ids or select_across boolean to say all records where selected.

Entending and modifying that form we make available any fields defined in it. The selected row will be available as a queryset, as usual.

You can use ExtendibleModelAdmin.get_action_form_instance() to get an already validated form instance.

Caution

if the form does not validate, you don’t even get to the action and the error message will be: “No action selected”.

This is used to specify a different form to add extra action fields. To use this you need override class JumboActionForm. A good practice is to define these forms in admin_forms.py or in admin/forms.py:

from jmb.core.admin import ExtendibleModelForm, JumboActionForm


class NewsletterActionForm(JumboActionForm):

    fields_map = {    
       'clone': [],
       'send_newsletter': ['mailing_list'],
       'resend_newsletter': ['mailing_list:required'],
    }
    mailing_list = forms.ModelChoiceField(
        queryset=MailingList.objects.filter(status=1),
        label=_('Mailing list'),
        required=False,
        widget=forms.Select(attrs={'id': 'mailing_list'})
    )


class NewsletterAdmin(ExtendibleModelAdmin):

   def send_newsletter(self, request, queryset):
       form = self.get_form_action_instance(request)
       ...

   action_form = NewsletterActionForm

A dictionary to specify action and its extra fields to complete operation:

key is the action and value can be [] if there is not any extra fields or a list of extra fields. required it’s used to specify that that field is required. Example: send_newsletter: ['mailing_list:required']. When user select send newsletter action is required specify mailing_list to whom to send newsletter.

field_map

This defines the mapping between action names and fields to be displayed. You can set a field as required using the :required syntax as shown above.

API

class jmb.core.admin.actions.JumboActionForm(*args, **kwargs)[source]

The default ActionForm with some logic to implement required fields according to selected action.

clean()[source]

Check that any :required

field_map = {}

mapping between action name and fields needed for the action

class jmb.core.admin.actions.JumboActionForm(*args, **kwargs)[source]

The default ActionForm with some logic to implement required fields according to selected action.

clean()[source]

Check that any :required

field_map = {}

mapping between action name and fields needed for the action

clone_action

permette di duplicare gli item selezionati nella changelist_view con una nuova pk. Questa action va abilitata esplicitamente nell’ExtendibleModelAdmin.

Utilizzo

effettuare l’import dell’action:

from jmb.core.admin.options import clone_action

ridefinire o aggiungere la action tra le actions presenti:

actions = (clone_action,)

Previous page

← JumboModelAdmin

This Page