Add Hyperlink and rendering in admin style renderer

This commit is contained in:
Tom Christie 2015-06-03 11:00:38 +01:00
parent c916ad6315
commit 90f2e26679
4 changed files with 32 additions and 3 deletions

View File

@ -13,6 +13,20 @@ from rest_framework.reverse import reverse
from rest_framework.utils import html
class Hyperlink(six.text_type):
"""
A string like object that additionally has an associated name.
We use this for hyperlinked URLs that may render as a named link
in some contexts, or render as a plain URL in others.
"""
def __new__(self, url, name):
ret = six.text_type.__new__(self, url)
ret.name = name
return ret
is_hyperlink = True
class PKOnlyObject(object):
"""
This is a mock object, used for when we only need the pk of the object
@ -203,6 +217,9 @@ class HyperlinkedRelatedField(RelatedField):
kwargs = {self.lookup_url_kwarg: lookup_value}
return self.reverse(view_name, kwargs=kwargs, request=request, format=format)
def get_name(self, obj):
return str(obj)
def to_internal_value(self, data):
request = self.context.get('request', None)
try:
@ -261,7 +278,7 @@ class HyperlinkedRelatedField(RelatedField):
# Return the hyperlink, or error if incorrectly configured.
try:
return self.get_url(value, self.view_name, request, format)
url = self.get_url(value, self.view_name, request, format)
except NoReverseMatch:
msg = (
'Could not resolve URL for hyperlinked relationship using '
@ -271,6 +288,12 @@ class HyperlinkedRelatedField(RelatedField):
)
raise ImproperlyConfigured(msg % self.view_name)
if url is None:
return None
name = self.get_name(value)
return Hyperlink(url, name)
class HyperlinkedIdentityField(HyperlinkedRelatedField):
"""

View File

@ -1,5 +1,5 @@
{% load rest_framework %}
<table class="table table-striped">
<!-- <table class="table table-striped">
<tbody>
{% for item in value %}
<tr>
@ -9,3 +9,5 @@
{% endfor %}
</tbody>
</table>
-->
{% for item in value %}{% if not forloop.first%}, {% endif %}<a href="{{ item }}">{{item.name}}</a>{% endfor %}

View File

@ -0,0 +1 @@
{% for item in value %}{% if not forloop.first%},{% endif %} {% if item.is_hyperlink %}<a href="{{ item }}">{{item.name}}</a>{% else %}{{ item }}{% endif %}{% endfor %}

View File

@ -111,7 +111,10 @@ def format_value(value):
if isinstance(value, (int, float, decimal.Decimal, bool, type(None))):
return mark_safe('<code>%s</code>' % value)
elif isinstance(value, list):
template = loader.get_template('rest_framework/admin/list_value.html')
if any([isinstance(item, (list, dict)) for item in value]):
template = loader.get_template('rest_framework/admin/list_value.html')
else:
template = loader.get_template('rest_framework/admin/simple_list_value.html')
context = Context({'value': value})
return template.render(context)
elif isinstance(value, dict):