Extending Templates

Loading concept...

🎨 Django Template Magic: Making Your Pages Come Alive!

Imagine you’re building with LEGO blocks. You have your basic blocks, but what if you could create MAGIC blocks that do special tricks? That’s what Django template features are all about!


🌟 The Big Picture: Your Template Toolbox

Think of Django templates like a recipe kitchen. You have:

  • Template Filters = Kitchen tools (slice, dice, transform ingredients)
  • Custom Template Tags = Your own special gadgets you build
  • Custom Template Filters = Tools you create yourself
  • Template Context = The ingredient basket you bring to the kitchen
  • Context Processors = Automatic ingredients that appear in EVERY dish!
graph TD A[Your Django View] --> B[Context Basket] B --> C[Template Kitchen] D[Context Processors] --> C C --> E[Filters Transform Data] C --> F[Tags Add Logic] E --> G[Beautiful HTML Page!] F --> G

🔧 Template Filters: Your Data Transformers

What Are Filters?

Filters are like magic glasses that change how you see things. You put on the “uppercase glasses” and suddenly “hello” becomes “HELLO”!

The Pipe Symbol | is Your Magic Wand!

{{ name|upper }}
{{ story|truncatewords:10 }}
{{ price|floatformat:2 }}

🎯 Most Popular Built-in Filters

Filter What It Does Example
upper SHOUTS everything `{{ “hi”
lower whispers everything `{{ “HI”
title Makes Title Case `{{ “hello world”
length Counts items `{{ items
default Backup value `{{ name
date Formats dates `{{ today
truncatewords Shortens text `{{ story

🔗 Chaining Filters = Super Powers Combined!

{{ name|lower|title }}

This first makes everything lowercase, THEN capitalizes first letters!

Example Flow:

"jOHN DOE" → lower → "john doe" → title → "John Doe"

💡 Real-World Example

<p>Welcome, {{ user.name|default:"Guest"|title }}!</p>
<p>Article: {{ article.content|truncatewords:20 }}</p>
<p>Posted: {{ article.date|date:"F j, Y" }}</p>
<p>{{ items|length }} items in your cart</p>

🏷️ Custom Template Tags: Build Your Own Magic!

Why Create Custom Tags?

Imagine you keep writing the same 10 lines of code over and over. Custom tags let you say: “Do that whole thing” with just ONE simple tag!

📁 Step 1: Create the Folder Structure

your_app/
├── templatetags/        ← Create this!
│   ├── __init__.py      ← Empty file
│   └── my_tags.py       ← Your tags!
└── templates/

📝 Step 2: Write Your Tag

# my_tags.py
from django import template

register = template.Library()

@register.simple_tag
def greet(name, time="morning"):
    return f"Good {time}, {name}!"

🎨 Step 3: Use It in Templates!

{% load my_tags %}

{% greet "Alice" %}
<!-- Output: Good morning, Alice! -->

{% greet "Bob" "evening" %}
<!-- Output: Good evening, Bob! -->

🌟 Inclusion Tags: Templates Inside Templates!

When you need to render a whole chunk of HTML:

@register.inclusion_tag('card.html')
def user_card(user):
    return {'user': user}
<!-- In your main template -->
{% user_card current_user %}

This loads card.html with the user data automatically!


✨ Custom Template Filters: Transform Data Your Way

When to Use Custom Filters

Built-in filters don’t have what you need? Make your own!

Example: You want to show prices in a friendly format.

📝 Creating a Custom Filter

# my_tags.py
from django import template

register = template.Library()

@register.filter
def friendly_price(value):
    """Turns 1000 into '1K', 1000000 into '1M'"""
    if value >= 1000000:
        return f"{value/1000000:.1f}M"
    elif value >= 1000:
        return f"{value/1000:.1f}K"
    return str(value)

🎨 Using Your Custom Filter

{% load my_tags %}

<p>Views: {{ video.views|friendly_price }}</p>
<!-- 1500000 becomes "1.5M" -->

🔧 Filters That Take Arguments

@register.filter
def multiply(value, arg):
    return value * arg
{{ quantity|multiply:price }}

📦 Template Context: The Data Basket

What IS Context?

Context is like a shopping basket you bring to the template kitchen. Whatever’s in the basket, you can use in your recipe (template)!

graph TD A[View Function] --> B{Create Context} B --> C["{'name': 'Alice', 'age': 25}"] C --> D[Pass to Template] D --> E["{{ name }} shows 'Alice'"]

📝 How Context Works in Views

Function-Based View:

def my_view(request):
    context = {
        'title': 'Welcome Page',
        'user_name': 'Alice',
        'items': [1, 2, 3, 4, 5]
    }
    return render(request, 'page.html', context)

In Template:

<h1>{{ title }}</h1>
<p>Hello, {{ user_name }}!</p>
<p>You have {{ items|length }} items</p>

🎯 Class-Based View Context

class MyView(TemplateView):
    template_name = 'page.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['special_message'] = 'You are awesome!'
        return context

💡 Key Point

Only variables in the context are available in the template. If it’s not in the basket, the template can’t use it!


🌐 Context Processors: Automatic Magic Variables

The “Always There” Variables

Imagine if certain ingredients automatically appeared in your kitchen every time you cooked. That’s context processors!

Built-in Context Processors Give You:

  • {{ request }} - The current request
  • {{ user }} - The logged-in user
  • {{ messages }} - Flash messages
  • {{ csrf_token }} - Security token

🔧 Creating Your Own Context Processor

Step 1: Create the processor

# context_processors.py
def site_info(request):
    return {
        'site_name': 'My Awesome Site',
        'current_year': 2024,
        'support_email': 'help@site.com'
    }

Step 2: Register in settings.py

TEMPLATES = [
    {
        'OPTIONS': {
            'context_processors': [
                # ... built-in ones ...
                'your_app.context_processors.site_info',
            ],
        },
    },
]

Step 3: Use Anywhere!

<!-- ANY template now has these! -->
<footer>
    © {{ current_year }} {{ site_name }}
    <a href="mailto:{{ support_email }}">Contact</a>
</footer>

🎯 When to Use Context Processors

Use Case Example
Site-wide settings Site name, logo URL
Navigation menus Menu items on every page
User preferences Theme, language
Shopping cart count Items across all pages
graph TD A[Request Comes In] --> B[Context Processors Run] B --> C[Add Global Variables] C --> D[View Adds Specific Variables] D --> E[Template Gets EVERYTHING]

🎓 Quick Summary: Your New Superpowers

Feature What It Does When to Use
Template Filters Transform data with | Format/modify display values
Custom Tags Create reusable logic Complex operations, repeated code
Custom Filters Create your own transformations Special formatting needs
Template Context Pass data to templates Every view!
Context Processors Auto-add global variables Site-wide data

🚀 Pro Tips

  1. Keep filters simple - One job per filter
  2. Name tags clearly - show_user_card better than suc
  3. Don’t overload context - Only send what you need
  4. Use context processors sparingly - They run on EVERY request

🎉 You Did It!

You now understand the complete template toolkit in Django:

Filters transform your data beautifully ✅ Custom Tags let you build reusable magic ✅ Custom Filters give you personal transformations ✅ Context is your data delivery system ✅ Context Processors provide site-wide superpowers

Now go build something AMAZING! 🚀

Loading story...

No Story Available

This concept doesn't have a story yet.

Story Preview

Story - Premium Content

Please sign in to view this concept and start learning.

Upgrade to Premium to unlock full access to all content.

Interactive Preview

Interactive - Premium Content

Please sign in to view this concept and start learning.

Upgrade to Premium to unlock full access to all content.

No Interactive Content

This concept doesn't have interactive content yet.

Cheatsheet Preview

Cheatsheet - Premium Content

Please sign in to view this concept and start learning.

Upgrade to Premium to unlock full access to all content.

No Cheatsheet Available

This concept doesn't have a cheatsheet yet.

Quiz Preview

Quiz - Premium Content

Please sign in to view this concept and start learning.

Upgrade to Premium to unlock full access to all content.

No Quiz Available

This concept doesn't have a quiz yet.