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(