Closed
Description
The new 3.15.0
release introduced a bug in rendering errors from the ValidationError
exception class.
Given a serializer:
class MySerializer(Serializer):
departure_datetime = serializers.DateTimeField(
required=True,
format="%Y-%m-%d %H:%M:%S",
error_messages={"invalid": "Expects format %Y-%m-%d %H:%M:%S"},
)
Calling ValidationError
would raise the exception:
File "/.../.venv/lib/python3.11/site-packages/rest_framework/fields.py", line 603, in fail
raise ValidationError(message_string, code=key)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/.../.venv/lib/python3.11/site-packages/rest_framework/exceptions.py", line 160, in __init__
detail = [detail % params]
~~~~~~~^~~~~~~~
ValueError: unsupported format character 'Y' (0x59) at index 27
As expected, this can easily be reproduced in the console:
>>> ValidationError("Expects format %Y-%m-%d %H:%M:%S")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/.../.venv/lib/python3.11/site-packages/rest_framework/exceptions.py", line 160, in __init__
detail = [detail % params]
~~~~~~~^~~~~~~~
ValueError: unsupported format character 'Y' (0x59) at index 16
or
>>> ["Expects format %Y-%m-%d %H:%M:%S" % {}]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: unsupported format character 'Y' (0x59) at index 16
A solution would be to escape with double %
characters any occurrence of %
in the error messages.
class MySerializer(Serializer):
departure_datetime = serializers.DateTimeField(
required=True,
format="%Y-%m-%d %H:%M:%S",
error_messages={"invalid": "Expects format %%Y-%%m-%%d %%H:%%M:%%S"},
)
Unsure this is a choice by design or not, as this wouldn't be the case on 3.14.x
?