I doubt if this method prevents much spam, but I wanted to learn how to implement a custom Django tag. The documentation for tags seems fairly straight-forward, but it often splits up examples into small code pieces which can make it seem more difficult. (Or maybe it's just that there's too many places to look for a quick answer.)

Here's the PHP method rewritten as a Django tag. Please let me know in the comments if there's a better way, I'm just getting reacquainted with the language.

 from random import randrange
 from django import template
 register = template.Library()
 from django.template.defaultfilters import stringfilter

 def html_escape(c):
     if randrange(0, 2):
         return '&#' + str(ord(c)) + ';'
     else:
         return '&#X' + hex(ord(c))[2:] + ';'

 @register.filter(name='encode_email')

 @stringfilter
 def encode_email(email):
     return ''.join(map(html_escape, email))

Of course, tags must live in a Django app. Just run python manage.py startapp myapp and add it to the INSTALLED_APPS in settings.py.

Then, create the folder myapp/templatetags/ and the script myapp/templatetags/init.py. Place the script in the templatetags folder.

Next, load the tag in your template using {% load my_tag %}. Lastly, use the tag like: "mailto:myemail"|encode_email.

Of course, Django will automatically escape the output. So to temporarily disable escaping, use this:

{% autoescape off %}
  {{ "mailto:myemail"|encode_email }}   
{% endautoescape %}

blog comments powered by Disqus