aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--rest_framework/fields.py5
-rw-r--r--rest_framework/tests/hyperlinkedserializers.py6
2 files changed, 7 insertions, 4 deletions
diff --git a/rest_framework/fields.py b/rest_framework/fields.py
index a4e29a30..4c206426 100644
--- a/rest_framework/fields.py
+++ b/rest_framework/fields.py
@@ -522,7 +522,10 @@ class HyperlinkedRelatedField(RelatedField):
view_name = self.view_name
request = self.context.get('request', None)
format = self.format or self.context.get('format', None)
- kwargs = {self.pk_url_kwarg: obj.pk}
+ pk = getattr(obj, 'pk', None)
+ if pk is None:
+ return
+ kwargs = {self.pk_url_kwarg: pk}
try:
return reverse(view_name, kwargs=kwargs, request=request, format=format)
except:
diff --git a/rest_framework/tests/hyperlinkedserializers.py b/rest_framework/tests/hyperlinkedserializers.py
index 3a955ddf..5ab850af 100644
--- a/rest_framework/tests/hyperlinkedserializers.py
+++ b/rest_framework/tests/hyperlinkedserializers.py
@@ -224,11 +224,12 @@ class TestOptionalRelationHyperlinkedView(TestCase):
def setUp(self):
"""
- Create 1 OptionaRelationModel intances.
+ Create 1 OptionalRelationModel intances.
"""
OptionalRelationModel().save()
self.objects = OptionalRelationModel.objects
self.detail_view = OptionalRelationDetail.as_view()
+ self.data = {"url": "http://testserver/optionalrelation/1/", "other": None}
def test_get_detail_view(self):
"""
@@ -238,5 +239,4 @@ class TestOptionalRelationHyperlinkedView(TestCase):
request = factory.get('/optionalrelationmodel-detail/1')
response = self.detail_view(request, pk=1).render()
self.assertEquals(response.status_code, status.HTTP_200_OK)
-
-
+ self.assertEquals(response.data, self.data)
pan>.makeDir('build/docs/partials/'); }).then(function() { console.log('Generating AngularJS Reference Documentation...'); return reader.collect(); }).then(function generateHtmlDocPartials(docs_) { docs = docs_; ngdoc.merge(docs); var fileFutures = []; docs.forEach(function(doc){ // this hack is here because on OSX angular.module and angular.Module map to the same file. var id = doc.id.replace('angular.Module', 'angular.IModule'); fileFutures.push(writer.output('partials/' + doc.section + '/' + id + '.html', doc.html())); }); writeTheRest(fileFutures); return Q.deep(fileFutures); }).then(function generateManifestFile() { return appCache('build/docs/').then(function(list) { writer.output('appcache-offline.manifest', list); }); }).then(function printStats() { console.log('DONE. Generated ' + docs.length + ' pages in ' + (now()-start) + 'ms.' ); }).end(); function writeTheRest(writesFuture) { var metadata = ngdoc.metadata(docs); writesFuture.push(writer.symlinkTemplate('css')); writesFuture.push(writer.symlinkTemplate('font')); writesFuture.push(writer.symlink('../../docs/img', 'build/docs/img')); writesFuture.push(writer.symlinkTemplate('js')); var manifest = 'manifest="/build/docs/appcache.manifest"'; writesFuture.push(writer.copy('docs/src/templates/index.html', 'index.html', writer.replace, {'doc:manifest': ''})); //manifest //TODO(i): enable writesFuture.push(writer.copy('docs/src/templates/index.html', 'index-nocache.html', writer.replace, {'doc:manifest': ''})); writesFuture.push(writer.copy('docs/src/templates/index.html', 'index-jq.html', writer.replace, {'doc:manifest': ''})); writesFuture.push(writer.copy('docs/src/templates/index.html', 'index-jq-nocache.html', writer.replace, {'doc:manifest': ''})); writesFuture.push(writer.copy('docs/src/templates/index.html', 'index-debug.html', writer.replace, {'doc:manifest': ''})); writesFuture.push(writer.copy('docs/src/templates/index.html', 'index-jq-debug.html', writer.replace, {'doc:manifest': ''})); writesFuture.push(writer.symlinkTemplate('offline.html')); writesFuture.push(writer.copyTemplate('docs-scenario.html')); // will be rewritten, don't symlink writesFuture.push(writer.output('docs-scenario.js', ngdoc.scenarios(docs))); writesFuture.push(writer.output('docs-keywords.js', ['NG_PAGES=', JSON.stringify(metadata).replace(/{/g, '\n{'), ';'])); writesFuture.push(writer.output('sitemap.xml', new SiteMap(docs).render())); writesFuture.push(writer.output('robots.txt', 'Sitemap: http://docs.angularjs.org/sitemap.xml\n')); writesFuture.push(writer.output('appcache.manifest',appCache())); writesFuture.push(writer.copyTemplate('.htaccess')); // will be rewritten, don't symlink writesFuture.push(writer.symlinkTemplate('app.yaml')); writesFuture.push(writer.symlinkTemplate('index.yaml')); writesFuture.push(writer.symlinkTemplate('favicon.ico')); writesFuture.push(writer.symlinkTemplate('main.py')); } function now() { return new Date().getTime(); } function noop() {};