siyuan-note/siyuan · error

new item template field [%s] not found

Error message

new item template field [%s] not found

What it means

normalizeNewItemTemplateFieldValues iterates itemTemplate.FieldValues and looks up each keyID via av.GetKey; if the key is missing (deleted column) or GetKey errored, the field reference is rejected. A template's FieldValues must point at columns that still exist on the AV.

Source

Thrown at kernel/av/new_item_template.go:311

		if ret[i].TemplateID != ret[j].TemplateID {
			return ret[i].TemplateID < ret[j].TemplateID
		}
		return ret[i].KeyID < ret[j].KeyID
	})
	return
}

func (av *AttributeView) normalizeNewItemTemplateFieldValues(itemTemplate *NewItemTemplate) error {
	if 0 == len(itemTemplate.FieldValues) {
		itemTemplate.FieldValues = nil
		return nil
	}

	fieldValues := map[string]*NewItemFieldValue{}
	for keyID, fieldValue := range itemTemplate.FieldValues {
		key, err := av.GetKey(keyID)
		if nil != err || nil == key {
			return fmt.Errorf("new item template field [%s] not found", keyID)
		}
		if !isNewItemTemplateEditableKeyType(key.Type) {
			return fmt.Errorf("new item template field [%s] type [%s] is not editable", keyID, key.Type)
		}
		if nil == fieldValue {
			continue
		}
		if "" == fieldValue.Mode {
			fieldValue.Mode = NewItemFieldValueStatic
		}
		switch fieldValue.Mode {
		case NewItemFieldValueCurrentTime:
			if KeyTypeDate != key.Type {
				return fmt.Errorf("new item template field [%s] current time mode requires date type", keyID)
			}
			fieldValue.Value = nil
		case NewItemFieldValueStatic:
			if nil == fieldValue.Value {

View on GitHub (pinned to 251596fc0d)

Solutions

  1. Before saving, prune FieldValues entries whose keyID is no longer in av.KeyValues.
  2. Refresh the AV schema client-side before opening the template editor.
  3. When deleting a column server-side, also call RemoveNewItemTemplateFieldValue (new_item_template.go:113) in the same transaction.

Example fix

// before
FieldValues: map[string]*av.NewItemFieldValue{"deleted-key": {...}}
// after
delete(FieldValues, "deleted-key")
Defensive patterns

Strategy: validation

Validate before calling

for keyID := range t.FieldValues {
    if _, err := av.GetKey(keyID); err != nil {
        delete(t.FieldValues, keyID) // prune stale references before saving
    }
}

Prevention

When it happens

Trigger: A column is deleted while the new-item-template editor is open; the client submits stale FieldValues referencing the removed keyID; a sync applies a remote column deletion locally before the template save lands; an import payload from a different AV schema.

Common situations: Race between column removal and template save; client caches the schema and does not refresh; copy of a template between AVs whose column sets differ.

Related errors


AI-assisted analysis of siyuan-note/siyuan@251596fc0d (2026-08-12). Data as JSON: /api/errors/46fecd83065fa6e5. Report an issue: GitHub.