Allow use of absolute URLs when deserializing hyperlinked fields

This commit is contained in:
Tom Christie 2012-10-30 10:49:01 +00:00
parent 1b6fe9abb4
commit 5670cb03bf
2 changed files with 11 additions and 2 deletions

View File

@ -5,7 +5,7 @@ import warnings
from django.core import validators from django.core import validators
from django.core.exceptions import ObjectDoesNotExist, ValidationError from django.core.exceptions import ObjectDoesNotExist, ValidationError
from django.core.urlresolvers import resolve from django.core.urlresolvers import resolve, get_script_prefix
from django.conf import settings from django.conf import settings
from django.forms import widgets from django.forms import widgets
from django.utils.encoding import is_protected_type, smart_unicode from django.utils.encoding import is_protected_type, smart_unicode
@ -13,6 +13,7 @@ from django.utils.translation import ugettext_lazy as _
from rest_framework.reverse import reverse from rest_framework.reverse import reverse
from rest_framework.compat import parse_date, parse_datetime from rest_framework.compat import parse_date, parse_datetime
from rest_framework.compat import timezone from rest_framework.compat import timezone
from urlparse import urlparse
def is_simple_callable(obj): def is_simple_callable(obj):
@ -372,6 +373,14 @@ class HyperlinkedRelatedField(RelatedField):
def from_native(self, value): def from_native(self, value):
# Convert URL -> model instance pk # Convert URL -> model instance pk
# TODO: Use values_list # TODO: Use values_list
if value.startswith('http:') or value.startswith('https:'):
# If needed convert absolute URLs to relative path
value = urlparse(value).path
prefix = get_script_prefix()
if value.startswith(prefix):
value = '/' + value[len(prefix):]
try: try:
match = resolve(value) match = resolve(value)
except: except:

View File

@ -158,7 +158,7 @@ class TestCreateWithForeignKeys(TestCase):
data = { data = {
'text': 'A test comment', 'text': 'A test comment',
'blog_post_url': '/posts/1/' 'blog_post_url': 'http://testserver/posts/1/'
} }
request = factory.post('/comments/', data=data) request = factory.post('/comments/', data=data)