mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-02-09 08:00:52 +03:00
Add Hyperlink and rendering in admin style renderer
This commit is contained in:
parent
c916ad6315
commit
90f2e26679
|
@ -13,6 +13,20 @@ from rest_framework.reverse import reverse
|
||||||
from rest_framework.utils import html
|
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):
|
class PKOnlyObject(object):
|
||||||
"""
|
"""
|
||||||
This is a mock object, used for when we only need the pk of the 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}
|
kwargs = {self.lookup_url_kwarg: lookup_value}
|
||||||
return self.reverse(view_name, kwargs=kwargs, request=request, format=format)
|
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):
|
def to_internal_value(self, data):
|
||||||
request = self.context.get('request', None)
|
request = self.context.get('request', None)
|
||||||
try:
|
try:
|
||||||
|
@ -261,7 +278,7 @@ class HyperlinkedRelatedField(RelatedField):
|
||||||
|
|
||||||
# Return the hyperlink, or error if incorrectly configured.
|
# Return the hyperlink, or error if incorrectly configured.
|
||||||
try:
|
try:
|
||||||
return self.get_url(value, self.view_name, request, format)
|
url = self.get_url(value, self.view_name, request, format)
|
||||||
except NoReverseMatch:
|
except NoReverseMatch:
|
||||||
msg = (
|
msg = (
|
||||||
'Could not resolve URL for hyperlinked relationship using '
|
'Could not resolve URL for hyperlinked relationship using '
|
||||||
|
@ -271,6 +288,12 @@ class HyperlinkedRelatedField(RelatedField):
|
||||||
)
|
)
|
||||||
raise ImproperlyConfigured(msg % self.view_name)
|
raise ImproperlyConfigured(msg % self.view_name)
|
||||||
|
|
||||||
|
if url is None:
|
||||||
|
return None
|
||||||
|
|
||||||
|
name = self.get_name(value)
|
||||||
|
return Hyperlink(url, name)
|
||||||
|
|
||||||
|
|
||||||
class HyperlinkedIdentityField(HyperlinkedRelatedField):
|
class HyperlinkedIdentityField(HyperlinkedRelatedField):
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
{% load rest_framework %}
|
{% load rest_framework %}
|
||||||
<table class="table table-striped">
|
<!-- <table class="table table-striped">
|
||||||
<tbody>
|
<tbody>
|
||||||
{% for item in value %}
|
{% for item in value %}
|
||||||
<tr>
|
<tr>
|
||||||
|
@ -9,3 +9,5 @@
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
-->
|
||||||
|
{% for item in value %}{% if not forloop.first%}, {% endif %}<a href="{{ item }}">{{item.name}}</a>{% endfor %}
|
||||||
|
|
|
@ -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 %}
|
|
@ -111,7 +111,10 @@ def format_value(value):
|
||||||
if isinstance(value, (int, float, decimal.Decimal, bool, type(None))):
|
if isinstance(value, (int, float, decimal.Decimal, bool, type(None))):
|
||||||
return mark_safe('<code>%s</code>' % value)
|
return mark_safe('<code>%s</code>' % value)
|
||||||
elif isinstance(value, list):
|
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})
|
context = Context({'value': value})
|
||||||
return template.render(context)
|
return template.render(context)
|
||||||
elif isinstance(value, dict):
|
elif isinstance(value, dict):
|
||||||
|
|
Loading…
Reference in New Issue
Block a user