Skip to main content

Easy, flexible icons for Django

Project description

Django Easy Icons

Easy, flexible icons for Django templates with support for multiple rendering backends.

Overview

Django Easy Icons provides a simple, consistent way to include icons in your Django templates. It supports multiple icon sources including SVG files, font icon libraries (like Font Awesome), and SVG sprite sheets.

Features

  • Multiple Renderers: Support for SVG files, font icons, and sprite sheets
  • Template Integration: Simple {% icon %} template tag
  • Flexible Configuration: Configure multiple icon sets with different renderers
  • Attribute Merging: Easily add classes and attributes to icons
  • Caching: Built-in renderer caching for performance
  • Dict Attributes: Pass a dict of extra attributes to the template tag via extrakwargs

Installation

pip install django-easy-icons

Add easy_icons to your INSTALLED_APPS:

INSTALLED_APPS = [
    # ... other apps
    'easy_icons',
]

Quick Start

1. Configure Icon Renderers

Add configuration to your Django settings:

EASY_ICONS = {
    "default": {
        "renderer": "easy_icons.renderers.SvgRenderer",
        "config": {
            "svg_dir": "icons",  # Template directory for SVG files
            "default_attrs": {
                "height": "1em",
                "fill": "currentColor"
            }
        },
        "icons": {
            "home": "home.svg",
            "user": "user.svg",
            "settings": "cog.svg"
        }
    }
}

2. Use in Templates

{% load easy_icons %}

<!-- Basic usage -->
{% icon "home" %}

<!-- With additional attributes -->
{% icon "user" class="nav-icon" height="2em" %}

<!-- Using specific renderer -->
{% icon "heart" renderer="fontawesome" %}

<!-- Passing a dictionary of attributes (e.g. from another library) -->
{% icon "user" extrakwargs=attr_dict %}

<!-- Dictionary + explicit overrides (explicit wins) -->
{% icon "user" extrakwargs=attr_dict class="avatar" %}

3. Use in Python Code

from easy_icons import icon

# Basic usage
home_icon = icon("home")

# With attributes
user_icon = icon("user", **{"class": "large", "data-role": "button"})

# Using specific renderer
fa_icon = icon("heart", renderer="fontawesome")

Renderers

SVG Renderer

Renders icons from SVG template files:

EASY_ICONS = {
    "svg": {
        "renderer": "easy_icons.renderers.SvgRenderer",
        "config": {
            "svg_dir": "icons",
            "default_attrs": {"class": "svg-icon"}
        },
        "icons": {
            "home": "house.svg",
            "user": "person.svg"
        }
    }
}

Provider Renderer

For font icon libraries like Font Awesome:

EASY_ICONS = {
    "fontawesome": {
        "renderer": "easy_icons.renderers.ProviderRenderer",
        "config": {
            "tag": "i"
        },
        "icons": {
            "home": "fas fa-home",
            "user": "fas fa-user",
            "heart": "fas fa-heart"
        }
    }
}

Sprites Renderer

For SVG sprite sheets:

EASY_ICONS = {
    "sprites": {
        "renderer": "easy_icons.renderers.SpritesRenderer",
        "config": {
            "sprite_url": "/static/icons.svg"
        },
        "icons": {
            "logo": "brand-logo",
            "menu": "hamburger-menu"
        }
    }
}

Configuration

Multiple Renderers

You can configure multiple renderers and choose which one to use:

EASY_ICONS = {
    "default": {
        "renderer": "easy_icons.renderers.SvgRenderer",
        "config": {"svg_dir": "icons"},
        "icons": {"home": "home.svg"}
    },
    "fontawesome": {
        "renderer": "easy_icons.renderers.ProviderRenderer",
        "config": {"tag": "i"},
        "icons": {"heart": "fas fa-heart"}
    },
    "sprites": {
        "renderer": "easy_icons.renderers.SpritesRenderer",
        "config": {"sprite_url": "/static/icons.svg"},
        "icons": {"logo": "brand"}
    }
}

Use in templates:

{% icon "home" %}  <!-- Uses default renderer -->
{% icon "heart" renderer="fontawesome" %}
{% icon "logo" renderer="sprites" %}

Default Attributes

Configure default attributes that will be applied to all icons from a renderer:

"config": {
    "default_attrs": {
        "class": "icon",
        "aria-hidden": "true",
        "height": "1em"
    }
}

Note: Template tag attributes completely override default attributes - they don't merge.

Attribute Overriding

Template tag attributes override default attributes:

  • Provided attributes completely replace defaults: height="1em" + height="2em" = height="2em"
  • This includes class attributes: class="icon" + class="large" = class="large"

Advanced Usage

Custom Renderers

Create custom renderers by extending BaseRenderer:

from easy_icons.base import BaseRenderer
from django.utils.safestring import SafeString

class CustomRenderer(BaseRenderer):
    def render(self, name: str, **kwargs) -> SafeString:
        resolved_name = self.get_icon(name)
        attrs = self.build_attrs(**kwargs)
        html = f'<custom-icon {attrs}>{resolved_name}</custom-icon>'
        return self.safe_return(html)

Disable Default Attributes

Use use_defaults=False to ignore default attributes:

{% icon "home" use_defaults=False class="only-this-class" %}
icon("home", use_defaults=False, **{"class": "only-this-class"})

Testing

Run the test suite:

# Install dependencies
poetry install

# Run tests
poetry run pytest

# Run tests with coverage
poetry run pytest --cov=easy_icons --cov-report=html

Contributing

  1. Fork the repository
  2. Create a feature branch
  3. Make your changes
  4. Add tests for new functionality
  5. Run the test suite
  6. Submit a pull request

License

This project is licensed under the MIT License. See the LICENSE file for details.

Changelog

Unreleased

  • Add extrakwargs parameter to {% icon %} template tag allowing a mapping of attributes to be merged with direct kwargs (direct kwargs override collisions).

0.1.0

  • Initial release
  • SVG, Provider, and Sprites renderers
  • Template tag support
  • Configuration system
  • Comprehensive test suite

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

django_easy_icons-0.3.0.tar.gz (10.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

django_easy_icons-0.3.0-py3-none-any.whl (11.1 kB view details)

Uploaded Python 3

File details

Details for the file django_easy_icons-0.3.0.tar.gz.

File metadata

  • Download URL: django_easy_icons-0.3.0.tar.gz
  • Upload date:
  • Size: 10.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for django_easy_icons-0.3.0.tar.gz
Algorithm Hash digest
SHA256 ba4e33b15159b39ebde141e19b12d3df59b89bbd954107f0d1f3e97825305826
MD5 f0f89751ed494c100e3ffda891bbd5c3
BLAKE2b-256 3d0037c4816bfc2cc7ecbfb7236d15134372b126843a4f83eb2aac950f6454c0

See more details on using hashes here.

Provenance

The following attestation bundles were made for django_easy_icons-0.3.0.tar.gz:

Publisher: on-release-main.yml on SamuelJennings/django-easy-icons

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file django_easy_icons-0.3.0-py3-none-any.whl.

File metadata

File hashes

Hashes for django_easy_icons-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 42c002ffd94f4a8397b1cc69759b140ff40f868e5a5a59ee3b35888a3485ccbb
MD5 9582f07ee22d584970ce6ad1811d2866
BLAKE2b-256 f10e743bbe93caeabf4b56eddb0763b78e79bd678af5a85b31511337d50f3b8e

See more details on using hashes here.

Provenance

The following attestation bundles were made for django_easy_icons-0.3.0-py3-none-any.whl:

Publisher: on-release-main.yml on SamuelJennings/django-easy-icons

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page