diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index eadc645326bb3d385488c94290a7a90d3324f63c..96580f3e1728884b31900234a92313ffe488b265 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -20,6 +20,7 @@ Fixed
 * Signup was forbidden even if it was enabled in settings
 * Phone numbers were not properly linked and suboptimally formatted on person page
 * Favicon upload failed with S3 storage.
+* Some combinations of allowed self-edit fields on persons could cause errors
 * Some preferences were required when they shouldn't, and vice versa.
 * IO errors on accessing backup directory in health check are now properly reported
 
diff --git a/aleksis/core/forms.py b/aleksis/core/forms.py
index 4f4414b1b64219d95bfc4669f5f99cef670cc7c8..f313c365e6bdb8d92b6c72cf9747aeadc9a0e367 100644
--- a/aleksis/core/forms.py
+++ b/aleksis/core/forms.py
@@ -108,21 +108,16 @@ class PersonForm(ExtensibleForm):
         request = kwargs.pop("request", None)
         super().__init__(*args, **kwargs)
 
-        # Disable non-editable fields
-        allowed_person_fields = get_site_preferences()["account__editable_fields_person"]
-
         if (
             request
             and self.instance
             and not request.user.has_perm("core.change_person", self.instance)
         ):
-            # First, disable all fields
+            # Disable non-editable fields
+            allowed_person_fields = get_site_preferences()["account__editable_fields_person"]
             for field in self.fields:
-                self.fields[field].disabled = True
-
-            # Then, activate allowed fields
-            for field in allowed_person_fields:
-                self.fields[field].disabled = False
+                if field not in allowed_person_fields:
+                    self.fields[field].disabled = True
 
     def clean(self) -> None:
         user = get_user_model()