aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTom Christie2014-09-29 14:12:26 +0100
committerTom Christie2014-09-29 14:12:26 +0100
commitd1b2c8ac7faec65483cbddf4f1718ca4f5805246 (patch)
tree0d21bed990076e124502d2c4a54138faf5e5c072
parent657d1de032bfa392609d53751e89366b972cd678 (diff)
downloaddjango-rest-framework-d1b2c8ac7faec65483cbddf4f1718ca4f5805246.tar.bz2
Absolute URLs for file fields
-rw-r--r--rest_framework/fields.py12
-rw-r--r--rest_framework/serializers.py2
-rw-r--r--tests/test_fields.py17
3 files changed, 24 insertions, 7 deletions
diff --git a/rest_framework/fields.py b/rest_framework/fields.py
index fee6080a..f7ea3b0c 100644
--- a/rest_framework/fields.py
+++ b/rest_framework/fields.py
@@ -150,10 +150,6 @@ class Field(object):
messages.update(error_messages or {})
self.error_messages = messages
- for validator in validators:
- if getattr(validator, 'requires_context', False):
- validator.serializer_field = self
-
def bind(self, field_name, parent):
"""
Initializes the field name and parent for the field instance.
@@ -264,6 +260,8 @@ class Field(object):
"""
errors = []
for validator in self.validators:
+ if getattr(validator, 'requires_context', False):
+ validator.serializer_field = self
try:
validator(value)
except ValidationError as exc:
@@ -907,7 +905,11 @@ class FileField(Field):
def to_representation(self, value):
if self.use_url:
- return settings.MEDIA_URL + value.url
+ url = settings.MEDIA_URL + value.url
+ request = self.context.get('request', None)
+ if request is not None:
+ return request.build_absolute_uri(url)
+ return url
return value.name
diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py
index 09ad376a..0faa5671 100644
--- a/rest_framework/serializers.py
+++ b/rest_framework/serializers.py
@@ -428,7 +428,6 @@ class ModelSerializer(Serializer):
queryset=model_class._default_manager,
fields=unique_together
)
- validator.serializer_field = self
validators.append(validator)
for parent_class in model_class._meta.parents.keys():
@@ -438,7 +437,6 @@ class ModelSerializer(Serializer):
queryset=parent_class._default_manager,
fields=unique_together
)
- validator.serializer_field = self
validators.append(validator)
return validators
diff --git a/tests/test_fields.py b/tests/test_fields.py
index aa8c3a68..bbd9f93d 100644
--- a/tests/test_fields.py
+++ b/tests/test_fields.py
@@ -953,6 +953,23 @@ class TestListField(FieldValues):
field = fields.ListField(child=fields.IntegerField())
+# Tests for FieldField.
+# ---------------------
+
+class MockRequest:
+ def build_absolute_uri(self, value):
+ return 'http://example.com' + value
+
+
+class TestFileFieldContext:
+ def test_fully_qualified_when_request_in_context(self):
+ field = fields.FileField(max_length=10)
+ field._context = {'request': MockRequest()}
+ obj = MockFile(name='example.txt', url='/example.txt')
+ value = field.to_representation(obj)
+ assert value == 'http://example.com/example.txt'
+
+
# Tests for SerializerMethodField.
# --------------------------------