python django 49 lines · 2 tabs

Django custom template filters for formatting

Priya Sharma Jan 2026
2 tabs
from django import template
from django.utils.safestring import mark_safe
import markdown

register = template.Library()


@register.filter
def currency(value):
    """Format number as currency."""
    try:
        return f'${float(value):,.2f}'
    except (ValueError, TypeError):
        return value


@register.filter
def percentage(value, decimals=1):
    """Format number as percentage."""
    try:
        return f'{float(value):.{decimals}f}%'
    except (ValueError, TypeError):
        return value


@register.filter(is_safe=True)
def markdown_to_html(text):
    """Convert markdown to HTML."""
    if not text:
        return ''
    return mark_safe(markdown.markdown(text))


@register.filter
def truncate_chars(value, length=100):
    """Truncate string to length with ellipsis."""
    if len(value) <= length:
        return value
    return value[:length].rsplit(' ', 1)[0] + '...'
2 files · python, django Explain with highlit

Custom template filters transform variables in templates. I decorate functions with @register.filter and optionally set is_safe=True for HTML output. Filters take one or two arguments. For formatting dates, numbers, or text, filters keep logic out of views. I use stringfilter decorator for string-only filters. Built-in filters cover most cases, but custom ones handle domain-specific formatting. This keeps templates clean and promotes reusability across templates.


Related snips

python
import os
import stat

for root, _dirs, files in os.walk('/etc'):
    for name in files:
        path = os.path.join(root, name)

Python security audit script for exposed risky filesystem state

python auditing host-security
by Kai Nakamura 1 tab
python
class Product(models.Model):
    name = models.CharField(max_length=200)
    slug = models.SlugField(blank=True)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    cost = models.DecimalField(max_digits=10, decimal_places=2)
    margin = models.DecimalField(max_digits=5, decimal_places=2, blank=True)

Django model signals vs overriding save

django python models
by Priya Sharma 2 tabs
python
from django.urls import path
from . import views

app_name = 'blog'

urlpatterns = [

Django URL namespacing and reverse lookups

django python urls
by Priya Sharma 3 tabs
python
import graphene
from graphene_django import DjangoObjectType
from blog.models import Post, Comment


class PostType(DjangoObjectType):

Django GraphQL with Graphene

django python graphql
by Priya Sharma 2 tabs
python
from django.db.models import Count, Avg, Sum, Q, F
from django.views.generic import TemplateView
from products.models import Product, Order, OrderItem


class DashboardView(TemplateView):

Django aggregation with annotate for statistics

django python database
by Priya Sharma 1 tab
python
from rest_framework import permissions


class IsOwner(permissions.BasePermission):
    """Allow only object owner to access."""

Django REST Framework permissions and authorization

django python rest
by Priya Sharma 2 tabs

Share this code

Here's the card — post it anywhere.

Django custom template filters for formatting — share card
Link copied