66[ ![ Python 3.12] ( https://img.shields.io/badge/python-3.12-blue.svg )] ( https://www.python.org/downloads/release/python-3120/ )
77[ ![ Python 3.13] ( https://img.shields.io/badge/python-3.13-blue.svg )] ( https://www.python.org/downloads/release/python-3130/ )
88
9- ## Screenshots
9+ ## Demo
1010
11- ![ Sign-in view] ( https://raw.githubusercontent.com/vsdudakov/fastadmin/main/docs/assets/images/signin.png )
12- ![ List view] ( https://raw.githubusercontent.com/vsdudakov/fastadmin/main/docs/assets/images/list.png )
13- ![ Change view] ( https://raw.githubusercontent.com/vsdudakov/fastadmin/main/docs/assets/images/change.png )
11+ ![ FastAdmin demo] ( https://raw.githubusercontent.com/vsdudakov/fastadmin/main/docs/assets/images/demo.gif )
1412
1513<p align =" center " >
1614 <a href =" https://twitter.com/intent/tweet?text=Admin%20Dashboard%20For%20FastAPI&url=https://github.com/vsdudakov/fastadmin&hashtags=FastAPI,AdminDashboard " >
@@ -357,6 +355,10 @@ class UserAdmin(TortoiseModelAdmin):
357355 list_display = (" id" , " username" , " is_superuser" , " is_active" )
358356 inlines = (UserAttachmentInline,)
359357
358+ formfield_overrides = {
359+ " avatar_url" : (WidgetType.UploadImage, {" required" : False }),
360+ }
361+
360362 actions = (" activate" , " deactivate" )
361363 widget_actions = (" users_chart" , " users_list" )
362364
@@ -374,15 +376,17 @@ class UserAdmin(TortoiseModelAdmin):
374376
375377 @widget_action (
376378 widget_action_type = WidgetActionType.ChartLine,
377- widget_action_props = WidgetActionChartProps(x_field = " x" , y_field = " y" ),
379+ widget_action_props = WidgetActionChartProps(x_field = " x" , y_field = " y" , series_field = " series " ),
378380 tab = " Analytics" ,
379381 title = " Users over time" ,
380382 )
381383 async def users_chart (self , payload : WidgetActionInputSchema) -> WidgetActionResponseSchema:
382384 return WidgetActionResponseSchema(
383385 data = [
384- {" x" : " 2026-01-01" , " y" : 10 },
385- {" x" : " 2026-01-02" , " y" : 15 },
386+ {" x" : " 2026-01-01" , " y" : 10 , " series" : " Active" },
387+ {" x" : " 2026-01-02" , " y" : 15 , " series" : " Active" },
388+ {" x" : " 2026-01-01" , " y" : 3 , " series" : " Inactive" },
389+ {" x" : " 2026-01-02" , " y" : 5 , " series" : " Inactive" },
386390 ]
387391 )
388392
@@ -455,6 +459,10 @@ class UserAdmin(DjangoModelAdmin):
455459 list_display = (" id" , " username" , " is_superuser" , " is_active" )
456460 inlines = (UserAttachmentInline,)
457461
462+ formfield_overrides = {
463+ " avatar_url" : (WidgetType.UploadImage, {" required" : False }),
464+ }
465+
458466 actions = (" activate" , " deactivate" )
459467 widget_actions = (" users_summary" , " users_chart" )
460468
@@ -492,7 +500,7 @@ class UserAdmin(DjangoModelAdmin):
492500
493501 @widget_action (
494502 widget_action_type = WidgetActionType.ChartLine,
495- widget_action_props = WidgetActionChartProps(x_field = " label" , y_field = " value" ),
503+ widget_action_props = WidgetActionChartProps(x_field = " label" , y_field = " value" , series_field = " series " ),
496504 tab = " Analytics" ,
497505 title = " Active vs inactive users" ,
498506 )
@@ -501,8 +509,8 @@ class UserAdmin(DjangoModelAdmin):
501509 inactive = self .model_cls.objects.filter(is_active = False ).count()
502510 return WidgetActionResponseSchema(
503511 data = [
504- {" label" : " active " , " value" : active},
505- {" label" : " inactive " , " value" : inactive},
512+ {" label" : " users " , " value" : active, " series " : " active " },
513+ {" label" : " users " , " value" : inactive, " series " : " inactive " },
506514 ]
507515 )
508516```
@@ -581,6 +589,10 @@ class UserAdmin(SqlAlchemyModelAdmin):
581589 list_display = (" id" , " username" , " is_superuser" , " is_active" )
582590 inlines = (UserAttachmentInline,)
583591
592+ formfield_overrides = {
593+ " avatar_url" : (WidgetType.UploadImage, {" required" : False }),
594+ }
595+
584596 actions = (" activate" , " deactivate" )
585597 widget_actions = (" users_chart" , " users_list" )
586598
@@ -604,12 +616,16 @@ class UserAdmin(SqlAlchemyModelAdmin):
604616
605617 @widget_action (
606618 widget_action_type = WidgetActionType.ChartBar,
607- widget_action_props = WidgetActionChartProps(x_field = " label" , y_field = " value" ),
619+ widget_action_props = WidgetActionChartProps(x_field = " label" , y_field = " value" , series_field = " series " ),
608620 tab = " Analytics" ,
609621 title = " Users count" ,
610622 )
611623 async def users_chart (self , payload : WidgetActionInputSchema) -> WidgetActionResponseSchema:
612- return WidgetActionResponseSchema(data = [{" label" : " users" , " value" : 42 }])
624+ return WidgetActionResponseSchema(
625+ data = [
626+ {" label" : " users" , " value" : 42 , " series" : " all" },
627+ ]
628+ )
613629
614630 @widget_action (
615631 widget_action_type = WidgetActionType.Action,
@@ -688,6 +704,10 @@ class UserAdmin(PonyORMModelAdmin):
688704 list_display = (" id" , " username" , " is_superuser" , " is_active" )
689705 inlines = (UserAttachmentInline,)
690706
707+ formfield_overrides = {
708+ " avatar_url" : (WidgetType.UploadImage, {" required" : False }),
709+ }
710+
691711 actions = (" activate" , " deactivate" )
692712 widget_actions = (" users_list" , " users_chart" )
693713
0 commit comments