reinhardt-forms
Django-inspired form handling and validation for Rust
Overview
reinhardt-forms provides a comprehensive form system for form handling and validation. Inspired by Django's forms framework, it offers both automatic form generation from models and manual form definitions with extensive validation capabilities.
This crate is designed to be WASM-compatible, providing a pure form processing layer without HTML generation or platform-specific features. For HTML rendering, see reinhardt-pages.
Installation
Add reinhardt to your Cargo.toml:
[]
= { = "0.1.0-alpha.1", = ["forms"] }
# Or use a preset:
# reinhardt = { version = "0.1.0-alpha.1", features = ["standard"] } # Recommended
# reinhardt = { version = "0.1.0-alpha.1", features = ["full"] } # All features
# Enable the form! macro:
# reinhardt = { version = "0.1.0-alpha.1", features = ["forms", "form-macros"] }
Then import form features:
use ;
Note: Form features are included in the standard and full feature presets.
Features Status
Core Form System
Implemented ✓
-
Form Base (
Form): Complete form data structure with binding and validation- Form creation with initial data and field prefix support
- Data binding and validation lifecycle
- Custom clean functions for form-level and field-level validation
- Field access and manipulation (add, remove, get)
- Initial data and change detection
- Error handling and reporting
- Client-side validation rules (for WASM integration)
-
BoundField: Field bound to form data
- Field data and error binding
- Label and help text support
-
WASM Compatibility (
wasm_compat): WASM-compatible form metadataFormMetadata: Serializable form state for client-side processingFieldMetadata: Field information for client-side renderingValidationRule: Client-side validation rule definitions
Field Types
Implemented ✓
Basic Fields:
CharField: Text input with min/max length, stripping, null character validationIntegerField: Integer input with min/max value constraints, string parsingBooleanField: Boolean/checkbox input with flexible type coercionEmailField: Email validation with regex, length constraints
Advanced Fields:
FloatField: Floating-point number validation with min/max constraintsDecimalField: Precise decimal number handling with scale and precisionDateField: Date input with multiple format support and locale handlingTimeField: Time input with format parsingDateTimeField: Combined date and time validationURLField: URL validation with scheme and max length checksJSONField: JSON data validation and parsingFileField: File upload handling with size validationImageField: Image file validation with dimension checksChoiceField: Selection from predefined choicesMultipleChoiceField: Multiple selection supportRegexField: Pattern-based validation with custom regexSlugField: URL slug validationGenericIPAddressField: IPv4/IPv6 address validationUUIDField: UUID format validationDurationField: Time duration parsingComboField: Multiple field validation combinationMultiValueField: Composite field handling (base for split fields)SplitDateTimeField: Separate date and time inputs
Model-Related Fields:
ModelChoiceField: Foreign key selection with queryset supportModelMultipleChoiceField: Many-to-many selection
Model Integration
Implemented ✓
-
ModelForm (
ModelForm<T>): Automatic form generation from modelsFormModeltrait for model integration- Field type inference from model metadata
- Field inclusion/exclusion configuration
- Custom field override support
- Model instance population from form data
- Save functionality with validation
-
ModelFormBuilder: Fluent API for ModelForm configuration
- Field selection (include/exclude)
- Widget customization
- Label customization
- Help text customization
-
ModelFormConfig: Configuration structure for ModelForm behavior
- Field mapping configuration
- Validation rules
- Save behavior customization
Formsets
Implemented ✓
-
FormSet: Managing multiple forms together
- Form collection management
- Validation across multiple forms
- Extra form generation
- Min/max form count constraints
- Deletion and ordering support
- Management form handling
- Non-form error tracking
-
ModelFormSet: Formset for model instances
- Queryset integration
- Instance creation, update, and deletion
- Inline formset support
- Configuration via
ModelFormSetConfig - Builder pattern API via
ModelFormSetBuilder
Advanced Features
Implemented ✓
-
Form Wizard (
FormWizard): Multi-step form flow- Step definition and management (
WizardStep) - Conditional step availability
- Session data storage across steps
- Step navigation (next, previous, jump)
- Final data compilation
- Progress tracking
- Step definition and management (
-
form! Macro (with
macrosfeature): Declarative form definition- DSL for defining forms with fields, validators, and client validators
- Server-side and client-side validation rules
- Field property configuration
Validation
Implemented ✓
-
Field Validation: Individual field cleaning and validation
- Required field checking
- Type conversion and coercion
- Length constraints (CharField)
- Value range constraints (IntegerField, FloatField, DecimalField)
- Format validation (EmailField, URLField, DateField, etc.)
- Pattern matching (RegexField)
- Custom validators
-
Form Validation: Multi-field validation
- Custom clean methods (
add_clean_function) - Field-specific clean methods (
add_field_clean_function) - Cross-field validation
- Error aggregation
- Non-field errors
- Custom clean methods (
-
Error Handling: Comprehensive error reporting
FieldErrortypes (Required, Invalid, Validation)FormErrortypes (Field, Validation)- Custom error messages
- Error message internationalization support
Related Crates
Security and UI features have been moved to dedicated crates:
- CSRF Protection: Use
reinhardt-middleware::csrf - Rate Limiting: Use
reinhardt-middleware::rate_limit - Honeypot Fields: Use
reinhardt-middleware::honeypot - XSS Protection: Use
reinhardt-middleware::xss - HTML Rendering: Use
reinhardt-pagesfor form rendering
Usage Examples
Basic Form
use ;
use HashMap;
use json;
let mut form = new;
form.add_field;
form.add_field;
let mut data = new;
data.insert;
data.insert;
form.bind;
assert!;
Using the form! Macro
use form;
use HashMap;
use json;
let mut form = form! ;
let mut data = new;
data.insert;
data.insert;
form.bind;
assert!;
ModelForm
use ;
let form = new
.include_fields
.build;
Custom Validation
use ;
let mut form = new;
form.add_clean_function;
Architecture
- Field Layer: Individual field types with validation logic
- Form Layer: Form structure, binding, and validation
- Model Layer: ORM integration and automatic form generation
- Formset Layer: Multiple form management
- Wizard Layer: Multi-step form flows
- WASM Layer: Serializable metadata for client-side integration
Design Philosophy
This crate follows Django's forms philosophy:
- Declarative field definitions
- Separation of validation logic
- Model integration
- Extensible and customizable
- WASM-compatible core
License
Licensed under either of Apache License, Version 2.0 or MIT license at your option.