From c91c07c8e0595f764fd169b0047c5a25738f62cd Mon Sep 17 00:00:00 2001 From: Yehor Komarov Date: Tue, 13 Feb 2024 18:16:42 +0300 Subject: [PATCH] Demonstrate form validation in examples --- examples/sqla/views.py | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/examples/sqla/views.py b/examples/sqla/views.py index 1c9ee141..5c7355b5 100644 --- a/examples/sqla/views.py +++ b/examples/sqla/views.py @@ -14,7 +14,7 @@ from starlette_admin.contrib.sqla import ModelView from starlette_admin.exceptions import ActionFailed, FormValidationError -from .models import Post, Tag, User +from .models import Post, User AVAILABLE_USER_TYPES = [ ("admin", "Admin"), @@ -68,6 +68,13 @@ async def validate(self, request: Request, data: Dict[str, Any]) -> None: raise FormValidationError(errors) return await super().validate(request, data) + async def validate_add_tag(self, request: Request, data: Dict[str, Any]): + errors: Dict[str, str] = {} + if data["tag"] is None: + errors["tag"] = "You must specify a tag" + if len(errors) > 0: + raise FormValidationError(errors) + @action( name="add_tag", text="Add a tag for selected posts", @@ -76,11 +83,22 @@ async def validate(self, request: Request, data: Dict[str, Any]) -> None: form_context={"form_fields": [HasOne("tag", identity="tag")]}, ) async def add_tag(self, request: Request, pks: List[Any]): - form = await request.form() - tag_pk = form["tag"] - tag = await TagView(Tag).find_by_pk(request, tag_pk) - if not tag: - raise ActionFailed("Tag is missing") + form_fields = [HasOne("tag", identity="tag")] + try: + form = ( + await request.form() + ) # from starlette_admin.base.BaseAdmin._render_edit + data = { + f.name: f.parse_form_data(request, form, request.state.action) + for f in form_fields + } # from starlette_admin.base.BaseAdmin.form_to_dict + except Exception as e: + raise ActionFailed(f"Form processing error: {e}") from e + + data = await self.arrange_data_for_fields(request, data, form_fields) + await self.validate_add_tag(request, data) + + tag = data["tag"] posts = await self.find_by_pks(request, pks) for post in posts: post.tags.append(tag)