Proposal: Support the __html__ method as an alternative/addition to the 
__str__ for turning objects into strings in the template layer.

If this has been discussed before, please point me to it; I couldn't find 
anything with the search function.

Some custom classes may have, in addition to a __str__ representation, a 
natural representation that is better suited for HTML output. Example:

class Money:
    def __init__(self, amount, currency):
        self.amount = amount
        self.currency = currency

    def __str__(self):
        return '%s %s' % (self.currency, self.amount)

    def __html__(self):
        # Always show amount and currency on same line
        return '%s\xa0%s' % (self.currency, self.amount)

`conditional_escape` and friends already consider the __html__ method, and 
this works out well:

>>> str(Money(1, '$'))
'$ 1'
>>> conditional_escape(Money(1, '$'))
'$\xa01'

In templates however it doesn't work that way because variables are always 
turned into strings before stuffing them into `conditional_escape` 
(see 
https://github.com/django/django/blob/98706bb35e7de0e445cc336f669919047bf46b75/django/template/base.py#L977).
 
My suggestion is to change the behaviour of that function so that it works 
as follows:

- Given I write {{ foo }}
- Does foo have a __html__ method? If yes, return `foo.__html__()`
- Otherwise, return `conditional_escape(str(foo))`

Do think that's a good idea?

Jonas

-- 
You received this message because you are subscribed to the Google Groups 
"Django developers  (Contributions to Django itself)" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-developers+unsubscr...@googlegroups.com.
To post to this group, send email to django-developers@googlegroups.com.
Visit this group at https://groups.google.com/group/django-developers.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-developers/ea088de2-e538-4808-a7fd-8726929e2b91%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to