Skip to content

Commit

Permalink
Demonstrate form validation in examples
Browse files Browse the repository at this point in the history
  • Loading branch information
Yehor Komarov committed Feb 14, 2024
1 parent f4b619d commit c91c07c
Showing 1 changed file with 24 additions and 6 deletions.
30 changes: 24 additions & 6 deletions examples/sqla/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"),
Expand Down Expand Up @@ -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",
Expand All @@ -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)
Expand Down

0 comments on commit c91c07c

Please sign in to comment.