widget_adapters.py 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. """
  2. Register Telepath adapters for core Django form widgets, so that they can
  3. have corresponding Javascript objects with the ability to render new instances
  4. and extract field values.
  5. """
  6. from django import forms
  7. from django.core.exceptions import ValidationError
  8. from django.utils.functional import cached_property
  9. from wagtail.admin.staticfiles import versioned_static
  10. from wagtail.telepath import Adapter, register
  11. class WidgetAdapter(Adapter):
  12. js_constructor = "wagtail.widgets.Widget"
  13. def js_args(self, widget):
  14. return [
  15. widget.render("__NAME__", None, attrs={"id": "__ID__"}),
  16. widget.id_for_label("__ID__"),
  17. ]
  18. def get_media(self, widget):
  19. media = super().get_media(widget)
  20. return media + widget.media
  21. @cached_property
  22. def media(self):
  23. return forms.Media(
  24. js=[
  25. versioned_static("wagtailadmin/js/telepath/widgets.js"),
  26. ]
  27. )
  28. register(WidgetAdapter(), forms.widgets.Input)
  29. register(WidgetAdapter(), forms.Textarea)
  30. class CheckboxInputAdapter(WidgetAdapter):
  31. js_constructor = "wagtail.widgets.CheckboxInput"
  32. register(CheckboxInputAdapter(), forms.CheckboxInput)
  33. class RadioSelectAdapter(WidgetAdapter):
  34. js_constructor = "wagtail.widgets.RadioSelect"
  35. register(RadioSelectAdapter(), forms.RadioSelect)
  36. register(RadioSelectAdapter(), forms.CheckboxSelectMultiple)
  37. class SelectAdapter(WidgetAdapter):
  38. js_constructor = "wagtail.widgets.Select"
  39. register(SelectAdapter(), forms.Select)
  40. class ValidationErrorAdapter(Adapter):
  41. js_constructor = "wagtail.errors.ValidationError"
  42. def js_args(self, error):
  43. return [
  44. error.messages,
  45. ]
  46. @cached_property
  47. def media(self):
  48. return forms.Media(
  49. js=[
  50. versioned_static("wagtailadmin/js/telepath/widgets.js"),
  51. ]
  52. )
  53. register(ValidationErrorAdapter(), ValidationError)