diff --git a/actix_admin_macros/src/lib.rs b/actix_admin_macros/src/lib.rs index 5e8da64..1fb0274 100644 --- a/actix_admin_macros/src/lib.rs +++ b/actix_admin_macros/src/lib.rs @@ -77,9 +77,12 @@ pub fn derive_actix_admin_view_model(input: proc_macro::TokenStream) -> proc_mac fn validate_entity(model: &mut ActixAdminModel) { Entity::validate_model(model); - - let custom_errors = Entity::validate(&model); - model.custom_errors = custom_errors; + + if !model.has_errors() { + let active_model = ActiveModel::from(model.clone()); + let custom_errors = Entity::validate(&active_model); + model.custom_errors = custom_errors; + } } async fn create_entity(db: &DatabaseConnection, mut model: ActixAdminModel) -> ActixAdminModel { diff --git a/example/src/entity/comment.rs b/example/src/entity/comment.rs index 8bc66bd..a38535e 100644 --- a/example/src/entity/comment.rs +++ b/example/src/entity/comment.rs @@ -38,4 +38,14 @@ impl Related for Entity { } } -impl ActiveModelBehavior for ActiveModel {} \ No newline at end of file +impl ActiveModelBehavior for ActiveModel {} + +impl ActixAdminModelValidationTrait for Entity { + fn validate(model: &ActiveModel) -> HashMap { + let mut errors = HashMap::new(); + if model.my_decimal.clone().unwrap() < Decimal::from(100 as i16) { + errors.insert("my_decimal".to_string(), "Must be larger than 100".to_string()); + } + errors + } +} \ No newline at end of file diff --git a/example/src/entity/post.rs b/example/src/entity/post.rs index 65c490e..50ce13c 100644 --- a/example/src/entity/post.rs +++ b/example/src/entity/post.rs @@ -74,4 +74,6 @@ impl Display for Tea { Tea::BreakfastTea => write!(formatter, "{}", String::from("BreakfastTea")), } } -} \ No newline at end of file +} + +impl ActixAdminModelValidationTrait for Entity {} \ No newline at end of file diff --git a/src/lib.rs b/src/lib.rs index aad41c5..cb7a908 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -13,7 +13,7 @@ pub mod builder; pub mod prelude { pub use crate::builder::{ ActixAdminBuilder, ActixAdminBuilderTrait}; - pub use crate::model::{ ActixAdminModel, ActixAdminModelTrait}; + pub use crate::model::{ ActixAdminModel, ActixAdminModelValidationTrait, ActixAdminModelTrait}; pub use crate::view_model::{ ActixAdminViewModel, ActixAdminViewModelTrait, ActixAdminViewModelField, ActixAdminViewModelSerializable, ActixAdminViewModelFieldType }; pub use actix_admin_macros::{ DeriveActixAdmin, DeriveActixAdminModel, DeriveActixAdminViewModel, DeriveActixAdminEnumSelectList, DeriveActixAdminModelSelectList }; pub use crate::{ ActixAdminAppDataTrait, ActixAdmin, ActixAdminConfiguration }; diff --git a/src/model.rs b/src/model.rs index 6ccd168..744b657 100644 --- a/src/model.rs +++ b/src/model.rs @@ -17,8 +17,10 @@ pub trait ActixAdminModelTrait { ) -> (usize, Vec); fn get_fields() -> Vec; fn validate_model(model: &mut ActixAdminModel); - // function to be overridable for custom error handling - fn validate(_model: &ActixAdminModel) -> HashMap { +} + +pub trait ActixAdminModelValidationTrait { + fn validate(_model: &T) -> HashMap { return HashMap::new(); } } diff --git a/templates/create_or_edit.html b/templates/create_or_edit.html index 250e83a..4e647a9 100644 --- a/templates/create_or_edit.html +++ b/templates/create_or_edit.html @@ -5,7 +5,7 @@ {% for model_field in view_model.fields -%}
{% if model_field.field_type == "SelectList" %} @@ -16,6 +16,12 @@ {% include "form_elements/input.html" %} {% endif %}
+ {% if model.errors | get(key=model_field.field_name, default="" ) !="" %} +

{{ model.errors | get(key=model_field.field_name) }}

+ {% endif %} + {% if model.custom_errors | get(key=model_field.field_name, default="" ) !="" %} +

{{ model.custom_errors | get(key=model_field.field_name) }}

+ {% endif %}
{%- endfor %}
diff --git a/templates/form_elements/input.html b/templates/form_elements/input.html index 04652b3..819b9a7 100644 --- a/templates/form_elements/input.html +++ b/templates/form_elements/input.html @@ -1,7 +1,12 @@ +