HiddenField is not called for patch verb #8259
Unanswered
abtinmo
asked this question in
Question & Answer
Replies: 1 comment 8 replies
-
I have the same issue: The problemDocs state:
But HiddenField is skipped during validation if serializer has How to reproducefrom rest_framework import serializers
class DemoCallable:
def __call__(self, *args, **kwargs):
return 'does not matter'
class DemoSerializerWithHiddenField(serializers.Serializer):
some_field = serializers.CharField()
demo_hidden = serializers.HiddenField(default=DemoCallable())
def validate(self, attrs):
print(attrs)
return attrs
partial_serializer = DemoSerializerWithHiddenField(data={
"some_field": "hidden ignored"
}, partial=True)
partial_serializer.is_valid(raise_exception=True)
print(partial_serializer.validated_data)
# OrderedDict([('some_field', 'hidden ignored')])
# OrderedDict([('some_field', 'hidden ignored')])
serializer = DemoSerializerWithHiddenField(data={
"some_field": "hidden not ignored"
}, partial=False)
serializer.is_valid(raise_exception=True)
print(serializer.validated_data)
# OrderedDict([('some_field', 'hidden not ignored'), ('demo_hidden', 'does not matter')])
# OrderedDict([('some_field', 'hidden not ignored'), ('demo_hidden', 'does not matter')]) Possible solutionfrom rest_framework import serializers
class HiddenField(serializers.HiddenField):
def validate_empty_values(self, data):
return (True, self.get_default())
def get_default(self):
return self.default(self)
class DemoCallable:
def __call__(self, *args, **kwargs):
return 'does not matter'
class DemoSerializerWithCustomHiddenField(serializers.Serializer):
some_field = serializers.CharField()
demo_hidden = HiddenField(default=DemoCallable())
def validate(self, attrs):
print(attrs)
return attrs
partial_serializer = DemoSerializerWithCustomHiddenField(data={
"some_field": "custom hidden not ignored"
}, partial=True)
partial_serializer.is_valid(raise_exception=True)
print(partial_serializer.validated_data)
# OrderedDict([('some_field', 'hidden not ignored'), ('demo_hidden', 'does not matter')])
# OrderedDict([('some_field', 'hidden not ignored'), ('demo_hidden', 'does not matter')])
serializer = DemoSerializerWithCustomHiddenField(data={
"some_field": "custom hidden not ignored also"
}, partial=False)
serializer.is_valid(raise_exception=True)
print(serializer.validated_data)
# OrderedDict([('some_field', 'custom hidden not ignored also'), ('demo_hidden', 'does not matter')])
# OrderedDict([('some_field', 'custom hidden not ignored also'), ('demo_hidden', 'does not matter')]) CaveatsI think it's irresponsible to ignore overriding solution I see two options:
|
Beta Was this translation helpful? Give feedback.
8 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
-
Expected behavior
I want to get the user field in validated_data, but it throws KeyError. It from a patch update.
Actual behavior
history = ClubValidateHistory(club=instance, validator=validated_data['user'],
KeyError: 'user'
"PATCH /backend/clubs/4/validate/ HTTP/1.1" 500 17633
link to original issue #6560
Beta Was this translation helpful? Give feedback.
All reactions