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] + '...'
{% load custom_filters %}
<p>Price: {{ product.price|currency }}</p>
<p>Discount: {{ discount|percentage:2 }}</p>
<div class="content">
{{ post.content|markdown_to_html }}
</div>
<p>{{ long_text|truncate_chars:150 }}</p>
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.