Admin System Feature
Overview​
The Admin System provides a Django-like admin interface with full type safety using Go generics. It includes complete CRUD operations, filtering, searching, widgets, actions, and export functionality.
Location​
forge/admin/
Status​
✅ Complete - Production ready
Core Components​
1. Admin Interface (admin.go)​
Type-safe admin interface:
type Admin[T any] struct {
model T
manager *query.Manager[T]
config *Config[T]
name string
}
Key Methods:
Register()- Register a model with adminGetQueryset()- Get base querysetSaveModel()- Save model instanceDeleteModel()- Delete model instanceHasAddPermission()- Check add permissionHasChangePermission()- Check change permissionHasDeletePermission()- Check delete permission
2. Admin Configuration (config.go)​
Complete configuration system with all Django admin options:
List View Configuration:
ListDisplay- Fields to display in list viewListDisplayLinks- Fields that link to detail viewListEditable- Fields editable in list viewListFilter- Filters for list viewSearchFields- Fields searchable in list viewDateHierarchy- Field for date-based navigationOrdering- Default orderingListPerPage- Items per pageListMaxShowAll- Maximum items for "show all"ListSelectRelated- Fields for select_related optimizationListPrefetchRelated- Fields for prefetch_related optimizationShowFullResultCount- Show full vs filtered countPreserveFilters- Preserve filters when navigatingEmptyValueDisplay- Display value for empty/null fieldsSortableBy- Fields that can be sorted
Form Configuration:
Fields- Explicit field orderingExclude- Fields to excludeReadOnlyFields- Read-only fieldsPrepopulatedFields- Auto-populated fieldsRawIDFields- Raw ID input for foreign keysAutocompleteFields- Autocomplete for foreign keysRadioFields- Radio buttons for choicesFieldsets- Form field groupingGetForm- Custom form generatorGetFields- Dynamic field listGetFieldsets- Dynamic fieldsetsGetReadOnlyFields- Dynamic read-only fieldsGetPrepopulatedFields- Dynamic prepopulated fields
Related Models:
Inlines- Related model editing
Actions:
Actions- Bulk actions
Permissions:
PermissionChecker- Permission checkerHasAddPermission- Add permission checkHasChangePermission- Change permission checkHasDeletePermission- Delete permission checkHasViewPermission- View permission checkHasModulePermission- Module permission check
View Customization:
GetQueryset- Custom queryset hookSaveModel- Custom save hookDeleteModel- Custom delete hook
Advanced Features:
SaveAs- Show "Save as new" buttonSaveAsContinue- Continue editing after "save as new"SaveOnTop- Show save buttons at topViewOnSite- Get URL for viewing objectShowChangeLink- Show change link in inlines
Form Field Customization:
FormFieldOverrides- Override widgets for fieldsFormFieldForForeignKey- Custom foreign key fieldFormFieldForManyToMany- Custom many-to-many field
3. List View (list_view.go)​
Complete list view implementation:
- Pagination
- Filtering
- Searching
- Sorting
- Bulk actions
- Export
4. Detail View (detail_view.go)​
Detail view for viewing/editing individual objects:
- Form rendering
- Field display
- Inlines
- Actions
5. Form View (form_view.go)​
Form handling for create/update:
- Form generation
- Form validation
- Form saving
- Form errors
6. Filters (filters.go, filters_advanced.go)​
Filter system:
- Boolean filters
- Choice filters
- Date filters
- Number filters
- Text filters
- Related filters
- Custom filters
7. Widgets (widgets.go, widgets_advanced.go)​
Form widgets:
- Text input
- Textarea
- Select
- Checkbox
- Radio buttons
- Date picker
- Time picker
- DateTime picker
- File upload
- Image upload
- Rich text editor
- Autocomplete
- Raw ID
8. Actions (actions.go)​
Bulk actions:
- Type-safe action definition
- Action execution
- Action permissions
- Action confirmation
9. Export (export.go)​
Export functionality:
- CSV export
- JSON export
- Custom export formats
10. Inlines (inlines.go)​
Related model editing:
- Tabular inline
- Stacked inline
- Inline permissions
- Inline validation
11. Fieldsets (fieldsets.go)​
Form field grouping:
- Fieldset definition
- Collapsible fieldsets
- Fieldset permissions
12. Permissions (permissions.go)​
Permission system:
- Permission checking
- Permission decorators
- Custom permissions
13. HTTP Handlers (http/)​
Complete HTTP handlers:
- List handler
- Detail handler
- Create handler
- Update handler
- Delete handler
- Action handler
- Export handler
14. Registry (registry.go)​
Admin model registry:
- Model registration
- Model lookup
- Global registry
Features​
✅ Complete Features​
- Type-Safe Admin - Full type safety with generics
- List View - Pagination, filtering, searching, sorting
- Detail View - View and edit individual objects
- Form Handling - Create and update forms
- Filters - Advanced filtering system
- Search - Full-text search
- Widgets - Rich form widgets
- Actions - Bulk actions
- Export - CSV and JSON export
- Inlines - Related model editing
- Fieldsets - Form field grouping
- Permissions - Permission system
- HTTP Handlers - Complete HTTP handlers
- Registry - Model registry
Usage Examples​
Basic Admin Registration​
userAdmin := admin.Register(
&models.User{},
models.User.Objects,
&admin.Config[*models.User]{
ListDisplay: []admin.FieldExpr[*models.User, any]{
admin.StringField("username", getter, setter),
admin.StringField("email", getter, setter),
admin.BoolField("is_active", getter, setter),
},
ListFilter: []admin.Filter[*models.User]{
admin.NewBooleanFilter(
admin.BoolField("is_active", getter, setter),
),
},
SearchFields: []admin.FieldExpr[*models.User, any]{
admin.StringField("username", getter, setter),
admin.StringField("email", getter, setter),
},
},
)
Admin with Inlines​
postAdmin := admin.Register(
&models.Post{},
models.Post.Objects,
&admin.Config[*models.Post]{
ListDisplay: []admin.FieldExpr[*models.Post, any]{
admin.StringField("title", getter, setter),
admin.StringField("author", getter, setter),
},
Inlines: []admin.Inline[*models.Post, any]{
admin.TabularInline(
&models.Comment{},
models.Comment.Objects,
parentField,
[]admin.FieldExpr[*models.Comment, any]{
admin.StringField("author", getter, setter),
admin.StringField("content", getter, setter),
},
),
},
},
)
Admin with Actions​
userAdmin := admin.Register(
&models.User{},
models.User.Objects,
&admin.Config[*models.User]{
Actions: []admin.Action[*models.User]{
admin.NewAction(
"activate",
"Activate selected users",
func(ctx context.Context, users []*models.User) error {
for _, user := range users {
user.IsActive = true
if err := models.User.Objects.Update(ctx, user); err != nil {
return err
}
}
return nil
},
),
},
},
)
Admin with Fieldsets​
userAdmin := admin.Register(
&models.User{},
models.User.Objects,
&admin.Config[*models.User]{
Fieldsets: []admin.Fieldset[*models.User]{
admin.NewFieldset(
"Account Information",
admin.StringField("username", getter, setter),
admin.StringField("email", getter, setter),
),
admin.NewFieldset(
"Permissions",
admin.BoolField("is_active", getter, setter),
admin.BoolField("is_staff", getter, setter),
),
},
},
)
Integration Points​
ORM System​
- Uses ORM QuerySet for data access
- Type-safe field expressions
- Manager integration
Filter System​
- Filter integration
- Query parsing
- Security validation
HTTP Server​
- HTTP handlers
- Routing integration
- Middleware support
Identity System​
- Permission integration
- Authentication middleware
- User management
Extension Points​
Custom Widgets​
- Define custom widgets
- Custom widget rendering
- Custom widget parsing
Custom Filters​
- Define custom filters
- Custom filter logic
- Custom filter widgets
Custom Actions​
- Define custom actions
- Custom action logic
- Custom action permissions
Custom Forms​
- Custom form generation
- Custom form validation
- Custom form saving
Best Practices​
- Type Safety - Use type-safe field expressions
- Permissions - Always check permissions
- Validation - Validate all input
- Performance - Use select_related and prefetch_related
- User Experience - Provide helpful error messages
- Security - Sanitize all output
Future Enhancements​
- HTML template rendering
- Rich text editor
- File/image uploads
- History/audit logging
- Autocomplete UI improvements
- Date/time picker improvements