HumanSignal/label-studio · error · ValidationError
Select an existing column or enter a new column name.
Error message
Select an existing column or enter a new column name.
What it means
_validate_column_request requires column_name (or value_name/existing_column) to be a non-empty string. If it is missing, empty, whitespace-only, or not a string, ValidationError {'column_name': 'Select an existing column or enter a new column name.'} is raised.
Source
Thrown at label_studio/data_manager/actions/data_columns.py:38
all_permissions = AllPermissions()
def add_or_modify_columns_enabled(project):
return flag_set('fflag_utc_1012_add_or_modify_columns', organization=project.organization)
def _validate_column_request(request_data, project):
value_name = (
request_data.get('column_name') or request_data.get('value_name') or request_data.get('existing_column')
)
value_type = request_data.get('value_type', 'String')
value = request_data.get('value', '')
if value_type not in {'String', 'Number', 'Expression'}:
raise ValidationError({'value_type': 'Choose a supported column type.'})
if not isinstance(value_name, str) or not value_name.strip():
raise ValidationError({'column_name': 'Select an existing column or enter a new column name.'})
value_name = value_name.strip()
column_exists = value_name in project.summary.all_data_columns
if not column_exists:
column_exists = project.tasks.filter(data__has_key=value_name).exists()
mode = 'update' if column_exists else 'add'
# Existing columns (e.g. imported spreadsheet headers) stay editable, but a new column must be
# one the Data Manager can filter and sort on.
if mode == 'add' and not is_queryable_column_name(value_name):
raise ValidationError(
{'column_name': f'Column name cannot contain {UNQUERYABLE_COLUMN_NAME_CHARACTERS}.'},
)
try:
value = {'String': str, 'Number': float, 'Expression': str}[value_type](value)
except (TypeError, ValueError) as exc:
raise ValidationError({'value': f'Enter a valid {value_type.lower()} value.'}) from exc
return mode, value_name, value_type, valueView on GitHub (pinned to 0b49e9b539)
Solutions
- Include a non-empty string column_name (or value_name/existing_column) in the action request data.
- Trim the value before sending; whitespace-only names are rejected.
- Fix the payload key so it matches column_name/value_name/existing_column.
Example fix
// before
{'value_type': 'String', 'value': 'x'}
// after
{'value_type': 'String', 'value': 'x', 'column_name': 'my_column'} Defensive patterns
Strategy: validation
Validate before calling
name = request_data.get('column_name') or request_data.get('value_name')
assert isinstance(name, str) and name.strip(), 'column_name is required and must be a non-empty string' Type guard
def has_valid_column_name(payload):
name = payload.get('column_name') or payload.get('value_name') or payload.get('existing_column')
return isinstance(name, str) and bool(name.strip()) Try / catch
from rest_framework.exceptions import ValidationError
try:
add_data_field(project, qs, request=request)
except ValidationError as e:
if 'column_name' in e.message_dict:
prompt_user_for_column_name() Prevention
- Always trim and require the column name in the UI form.
- Validate payload keys before submitting the action.
- Use a single canonical key (column_name) in client code.
When it happens
Trigger: Submitting add_data_field without column_name/value_name, with column_name: '', or with a non-string (e.g. number) value.
Common situations: Script omits the column name field; UI form field left blank; payload key mismatch (sending 'name' instead of 'column_name').
Understand the failure class
Background: "Missing required field" and "field is required" errors: why libraries reject payloads that omit mandatory fields — this error's family across 20 libraries.
Related errors
- Choose a supported column type.
- Column name cannot contain {UNQUERYABLE_COLUMN_NAME_CHARACTE
- Enter a valid {value_type.lower()} value.
- Expression must use the form command(arguments).
- Expression command is required.
AI-assisted analysis of HumanSignal/label-studio@0b49e9b539 (2026-08-29).
Data as JSON: /api/errors/22881fc0d4b37e33.
Report an issue: GitHub.