Skip to content

Commit

Permalink
Added more widget replacements to AdminActionForm
Browse files Browse the repository at this point in the history
  • Loading branch information
michalpokusa committed Sep 23, 2024
1 parent 0de78c1 commit 30d709e
Showing 1 changed file with 52 additions and 7 deletions.
59 changes: 52 additions & 7 deletions django_admin_action_forms/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,30 @@
from django.contrib.admin.helpers import Fieldset
from django.contrib.admin.widgets import (
AdminDateWidget,
AdminTimeWidget,
AdminEmailInputWidget,
AdminFileWidget,
AdminIntegerFieldWidget,
AdminSplitDateTime,
AdminTextInputWidget,
AdminTimeWidget,
AdminURLFieldWidget,
AdminUUIDInputWidget,
)
from django.db.models import QuerySet
from django.forms import (
CharField,
DateField,
EmailField,
Field,
FileField,
Form,
IntegerField,
ModelChoiceField,
ModelMultipleChoiceField,
DateField,
TimeField,
SplitDateTimeField,
TimeField,
URLField,
UUIDField,
)
from django.http import HttpRequest

Expand Down Expand Up @@ -171,6 +184,13 @@ def get_fieldsets(
return getattr(cls, "fieldsets", None)


def is_field_with_default_widget(field: Field, field_type: "type[Field]") -> bool:
"""
Checks if the field is exactly of the specified type and has the default widget.
"""
return type(field) is field_type and type(field.widget) is field_type.widget


class AdminActionForm(ActionForm):
"""
Extended `ActionForm` class for admin actions. It replaces default field widgets
Expand All @@ -183,10 +203,35 @@ def _convert_from_form_to_actionform(self, request: HttpRequest) -> None:

def _replace_default_field_widgets_with_admin_widgets(self) -> None:
for field in self.fields.values():
field: Field
widget_attrs = field.widget.attrs

if is_field_with_default_widget(field, CharField):
field.widget = AdminTextInputWidget()

if isinstance(field, DateField):
elif is_field_with_default_widget(field, DateField):
field.widget = AdminDateWidget()
elif isinstance(field, TimeField):
field.widget = AdminTimeWidget()
elif isinstance(field, SplitDateTimeField):

elif is_field_with_default_widget(field, EmailField):
field.widget = AdminEmailInputWidget()

elif is_field_with_default_widget(field, FileField):
field.widget = AdminFileWidget()

elif is_field_with_default_widget(field, IntegerField):
field.widget = AdminIntegerFieldWidget()

elif is_field_with_default_widget(field, SplitDateTimeField):
field.widget = AdminSplitDateTime()

elif is_field_with_default_widget(field, TimeField):
field.widget = AdminTimeWidget()

elif is_field_with_default_widget(field, URLField):
field.widget = AdminURLFieldWidget()

elif is_field_with_default_widget(field, UUIDField):
field.widget = AdminUUIDInputWidget()

field.widget.is_required = field.required
field.widget.attrs.update(widget_attrs)

0 comments on commit 30d709e

Please sign in to comment.