Better widget for Django ArrayField in admin
Better ArrayField widget for admin
Supported Django versions: 2.0, 2.1, 2.2, 3.0, 3.1
might work with different django/python versions as well but I did not test that.
It changes comma separated widget to list based in admin panel.
Before:
After:
Install Django better admin ArrayField:
pip install django-better-admin-arrayfield
Add it to your `INSTALLED_APPS`:
INSTALLED_APPS = ( ... 'django_better_admin_arrayfield', ... )
django_better_admin_arrayfield.models.fields.ArrayFieldis a drop-in replacement for standard Django
ArrayField.
Import it like below and use it in your model class definition.
python from django_better_admin_arrayfield.models.fields import ArrayField
Import DynamicArrayMixin like below
python from django_better_admin_arrayfield.admin.mixins import DynamicArrayMixin
In your admin class add
DynamicArrayMixin: ...
python class MyModelAdmin(admin.ModelAdmin, DynamicArrayMixin):
That's it.
By default the subwidget (the one used for each item in the array) will be TextInput. If you want something else, you can use your own specifying it in the
formfield_overridesof your Admin model: ```python class MyWidget(DynamicArrayWidget): def init(self, args, *kwargs): kwargs['subwidgetform'] = MyForm super().init_(args, *kwargs)
class MyModelAdmin(models.ModelAdmin, DynamicArrayMixin): ... formfield_overrides = { DynamicArrayField: {'widget': MyWidget}, } ```
If you wanted to have Textarea as the subwidget, you can simply use the included drop-in widget replacement: ```python from djangobetteradmin_arrayfield.forms.widgets import DynamicArrayTextareaWidget
class MyModelAdmin(models.ModelAdmin, DynamicArrayMixin): ... formfield_overrides = { DynamicArrayField: {'widget': DynamicArrayTextareaWidget}, } ```
Does the code actually work?
source /bin/activate (myenv) $ pip install tox (myenv) $ tox
Install pre-commit black hook
source /bin/activate (myenv) $ pip install -r requirements_dev.txt (myenv) $ pre-commit install
Inspired by: https://stackoverflow.com/a/49370480/4638248
Tools used in rendering this package: