From 334d4d971f2874f1ecf8036216e60c94c82df853 Mon Sep 17 00:00:00 2001 From: Kaushal Shriwas <64089478+kaulith@users.noreply.github.com> Date: Sat, 11 Apr 2026 16:57:02 +0530 Subject: [PATCH 1/3] fix: validate hidden and mandatory fields without default in web form --- frappe/public/js/frappe/web_form/web_form.js | 4 +++- frappe/website/doctype/web_form/web_form.py | 13 +++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/frappe/public/js/frappe/web_form/web_form.js b/frappe/public/js/frappe/web_form/web_form.js index 1d2395eeab..2a60fa3108 100644 --- a/frappe/public/js/frappe/web_form/web_form.js +++ b/frappe/public/js/frappe/web_form/web_form.js @@ -161,7 +161,7 @@ export default class WebForm extends frappe.ui.FieldGroup { let values = frappe.utils.get_query_params(); delete values.new; Object.assign(defaults, values); - this.set_values(values); + this.set_values(defaults); } setup_primary_action() { @@ -226,6 +226,8 @@ export default class WebForm extends frappe.ui.FieldGroup { field = this.fields_dict[fieldname]; if (field && field.get_value) { + if (field.df.hidden) continue; + let value = field.get_value(); if ( field.df.reqd && diff --git a/frappe/website/doctype/web_form/web_form.py b/frappe/website/doctype/web_form/web_form.py index f42c39322d..927553aef6 100644 --- a/frappe/website/doctype/web_form/web_form.py +++ b/frappe/website/doctype/web_form/web_form.py @@ -8,6 +8,7 @@ from typing import Any import frappe from frappe import _, scrub from frappe.core.api.file import get_max_file_size +from frappe.core.doctype.doctype.doctype import HiddenAndMandatoryWithoutDefaultError from frappe.core.doctype.file.utils import remove_file_by_url from frappe.desk.form.meta import get_code_files_via_hooks from frappe.modules.utils import export_module_json, get_doc_module @@ -96,6 +97,8 @@ class WebForm(WebsiteGenerator): if not frappe.flags.in_import: self.validate_fields() + self.validate_hidden_and_mandatory() + def validate_fields(self): """Validate all fields are present""" from frappe.model import no_value_fields @@ -110,6 +113,16 @@ class WebForm(WebsiteGenerator): if missing: frappe.throw(_("Following fields are missing:") + "
" + "
".join(missing)) + def validate_hidden_and_mandatory(self): + for d in self.web_form_fields: + if d.hidden and d.reqd and not d.default and not frappe.flags.in_migrate: + frappe.throw( + _("{0}: Field {1} in row {2} cannot be hidden and mandatory without default").format( + self.name, d.label, d.idx + ), + HiddenAndMandatoryWithoutDefaultError, + ) + def reset_field_parent(self): """Convert link fields to select with names as options.""" for df in self.web_form_fields: From b354a30aedf74da688b4c1317f5e263a2bab7172 Mon Sep 17 00:00:00 2001 From: Hussain Nagaria <34810212+NagariaHussain@users.noreply.github.com> Date: Mon, 13 Apr 2026 12:56:25 +0530 Subject: [PATCH 2/3] refactor: more readable conditional --- frappe/website/doctype/web_form/web_form.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/website/doctype/web_form/web_form.py b/frappe/website/doctype/web_form/web_form.py index 927553aef6..901c1930bf 100644 --- a/frappe/website/doctype/web_form/web_form.py +++ b/frappe/website/doctype/web_form/web_form.py @@ -115,7 +115,7 @@ class WebForm(WebsiteGenerator): def validate_hidden_and_mandatory(self): for d in self.web_form_fields: - if d.hidden and d.reqd and not d.default and not frappe.flags.in_migrate: + if (d.hidden and d.reqd) and not (d.default or frappe.flags.in_migrate): frappe.throw( _("{0}: Field {1} in row {2} cannot be hidden and mandatory without default").format( self.name, d.label, d.idx From 87b08240311fe7bcda99f571e21b21350f365a77 Mon Sep 17 00:00:00 2001 From: Kaushal Shriwas <64089478+kaulith@users.noreply.github.com> Date: Sun, 19 Apr 2026 16:48:35 +0530 Subject: [PATCH 3/3] fix: skip hidden and mandatory check when allow_incomplete is set --- frappe/website/doctype/web_form/web_form.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frappe/website/doctype/web_form/web_form.py b/frappe/website/doctype/web_form/web_form.py index 901c1930bf..ddb1fb2c63 100644 --- a/frappe/website/doctype/web_form/web_form.py +++ b/frappe/website/doctype/web_form/web_form.py @@ -114,6 +114,8 @@ class WebForm(WebsiteGenerator): frappe.throw(_("Following fields are missing:") + "
" + "
".join(missing)) def validate_hidden_and_mandatory(self): + if self.allow_incomplete: + return for d in self.web_form_fields: if (d.hidden and d.reqd) and not (d.default or frappe.flags.in_migrate): frappe.throw(