From Stanislaw Adaszewski's blog. I've fixed bugs and made changes to make it a production friendly drop-in Django app for bulk changes in Django's admin interface.
Check off what you want to edit in list view then choose mass edit from the actions menu. Image was taken using Grappelli
pip install django-mass-edit
settings.py
, add massadmin
to INSTALLED_APPS
path('admin/', include('massadmin.urls')),
to urls.py
before admin.site.urls
line You may exclude some fields like this:
```python
class PollAdmin(admin.ModelAdmin):
massadmin_exclude = ['user', ]
```
You can also add or remove the "action" to models if you don't want it global. See Django Docs on the subject
Django allows [customization of AdminSites](https://docs.djangoproject.com/en/1.9/ref/contrib/admin/#customizing-adminsite)
If you want to work with a custom AdminSite by passing the custom site to the view (it is also necessary to add the `mass_change_selected` action to the custom site):
```python
from massadmin import mass_change_selected
admin_site = MyCustomAdminSite(name='custom_admin')
admin_site.add_action(mass_change_selected)
path('admin/', include(massadmin.urls), kwargs={'admin_site': admin_site}),
```
By default, all models registered in the admin will get Mass Edit
action.
If you wish to disable this, add this to settings file:
MASSEDIT = {
'ADD_ACTION_GLOBALLY': False,
}
Then, to add the mass edit action to specific models, use the provided mixin:
from massadmin.massadmin import MassEditMixin
class MyModelAdmin(MassEditMixin, admin.ModelAdmin):
...
Django-mass-edit will keep IDs for selected objects in URL, e.g:
/admin/myapp/mymodel-masschange/1,2,3,4,5/
To avoid problems with too long URL when editing large number of objects, the list of objects will be stored in session and the URL will look like this:
/admin/myapp/mymodel-masschange/session-c81e728d9d4c2f636f067f89cc14862c/
(same length regardless of the number of selected objects).
The default threshold is 500 characters for the IDs in the URL, not counting anything before or after the the IDs.
This threshold can be changed in settings:
MASSEDIT = {
'SESSION_BASED_URL_THRESHOLD': 10,
}
To always use the session-based URLs, simply put in value 0
.
This project could use some love. It has few unit test and old code that could be refactored. When you make a pull request - please include a unit test. If you want to take on improving the project let me know by opening an issue.
New maintainers welcome. I (bufke) will only be providing minimal support to keep the project running on modern versions of Django. Open an issue if you are interested.