Skip to content

Commit

Permalink
Merge pull request #7 from bmihelac/format_value_instance
Browse files Browse the repository at this point in the history
feat: format_value RelatedManager support
  • Loading branch information
bmihelac committed Mar 19, 2018
2 parents 56e8a70 + 3a518a8 commit 2f15564
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 7 deletions.
23 changes: 16 additions & 7 deletions cruds/templatetags/crud_tags.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,16 @@ def crud_url(obj, action):
return url


def format_value_instance(value):
url = crud_url(value, utils.ACTION_DETAIL)
if url:
return mark_safe('<a href="%s">%s</a>' % (url, escape(value)))
if hasattr(value, 'get_absolute_url'):
url = getattr(value, 'get_absolute_url')()
return mark_safe('<a href="%s">%s</a>' % (url, escape(value)))
return value


@register.filter
def format_value(obj, field_name):
"""
Expand All @@ -60,13 +70,12 @@ def format_value(obj, field_name):
return ''

if isinstance(value, models.Model):
url = crud_url(value, utils.ACTION_DETAIL)
if url:
return mark_safe('<a href="%s">%s</a>' % (url, escape(value)))
else:
if hasattr(value, 'get_absolute_url'):
url = getattr(value, 'get_absolute_url')()
return mark_safe('<a href="%s">%s</a>' % (url, escape(value)))
return format_value_instance(value)

if isinstance(value, models.Manager):
return mark_safe(', '.join(
[format_value_instance(instance) for instance in value.all()]
))
if value is None:
value = ""
return value
Expand Down
18 changes: 18 additions & 0 deletions tests/test_templatetags.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,24 @@ def test_format_value(self):
res = template.render(context)
self.assertEqual(res, '<a href="/">Foontinent</a>')

delattr(Continent, 'get_absolute_url')
template = Template(
'{% load crud_tags %}{{ instance.country|format_value:"continent" }}')
res = template.render(context)
self.assertEqual(res, 'Foontinent')

def test_format_value_queryset(self):
continent = Continent.objects.create(name='Foontinent')
continent.country_set.create(name='Fooland')
continent.country_set.create(name='Barland')
template = Template(
'{% load crud_tags %}{{ instance|format_value:"country_set" }}')
res = template.render(Context({'instance': continent}))
self.assertEqual(
res,
'<a href="/testapp/country/1/">Fooland</a>, <a href="/testapp/country/2/">Barland</a>' # noqa
)

def test_crud_fields(self):
context = Context({'instance': self.author})

Expand Down
1 change: 1 addition & 0 deletions tests/testapp/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
from django.utils.encoding import python_2_unicode_compatible


@python_2_unicode_compatible
class Continent(models.Model):
name = models.CharField(max_length=100)

Expand Down

0 comments on commit 2f15564

Please sign in to comment.