Django localized date template filter

UPDATE! This is going to be redundant in Django 1.2, in which you can add DATE_FORMAT to your django.po files.

I've often been frustrated that using settings.DATE_FORMAT does not give a localized date. Granted that the name of a month may be localized, but the format string does not change. So let's start out by modifying settings.py. We wrap our default date format in a ugettext so the makemessages command will detect it, and we need to make it a dummy function, because the i18n library cannot be imported in settings.py due to circularity (it depends on settings.py).

 ugettext = lambda s: s  
DATE_FORMAT = ugettext('N j, Y')

Run compilemessages and type in your localized date formats. Now we need a template filter that uses a localized format for calling the Django date format function. This is really simple:

from django.template.defaultfilters import stringfilter  
from django.utils import dateformat  
from django.utils.translation import ugettext  
from django.conf import settings





@register.filter()  
def localdate(value):  
    """Format date with localized date format"""  
    format = ugettext(settings.DATE_FORMAT)  
    return dateformat.format(value, format)

And done. Using the filter is straight forward:

Date: {{ my_date|localdate }}