diff --git a/django_async_extensions/aforms/models.py b/django_async_extensions/aforms/models.py index 8edf524..cef0ede 100644 --- a/django_async_extensions/aforms/models.py +++ b/django_async_extensions/aforms/models.py @@ -4,8 +4,26 @@ from django.forms.models import ModelForm +from django_async_extensions.aforms.utils import AsyncRenderableFormMixin + + +class AsyncModelForm(AsyncRenderableFormMixin, ModelForm): + @classmethod + async def from_async(cls, *args, **kwargs): + return await sync_to_async(cls)(*args, **kwargs) + + @property + async def aerrors(self): + if self._errors is None: + await self.afull_clean() + return self._errors + + async def ais_valid(self): + return self.is_bound and not await self.aerrors + + async def afull_clean(self): + return await sync_to_async(self.full_clean)() -class AsyncModelForm(ModelForm): async def _asave_m2m(self): """ Save the many-to-many fields and generic relations for this form. diff --git a/django_async_extensions/aforms/utils.py b/django_async_extensions/aforms/utils.py new file mode 100644 index 0000000..4d66f9d --- /dev/null +++ b/django_async_extensions/aforms/utils.py @@ -0,0 +1,31 @@ +from asgiref.sync import sync_to_async + +from django.utils.safestring import mark_safe + + +class AsyncRenderableMixin: + async def arender(self, template_name=None, context=None, renderer=None): + renderer = renderer or self.renderer + template = template_name or self.template_name + context = context or self.get_context() + return mark_safe( # noqa:S308 + await sync_to_async(renderer.render)(template, context) + ) + + +class AsyncRenderableFormMixin(AsyncRenderableMixin): + async def aas_p(self): + """Render as

elements.""" + return await self.arender(self.template_name_p) + + async def aas_table(self): + """Render as elements excluding the surrounding tag.""" + return await self.arender(self.template_name_table) + + async def aas_ul(self): + """Render as
  • elements excluding the surrounding