Skip to main content

Multi-library SVG icon system for Django - like react-icons, but backend-driven

Project description

djicons

Multi-library SVG icon system for Django. Like react-icons, but 100% backend-driven.

No CDN. No JavaScript. Offline-first.

Features

  • Multi-library support: Ionicons, Heroicons, Material Symbols, Tabler, Lucide, Font Awesome
  • SVG inline rendering: Full CSS control, no font loading, no HTTP requests
  • Namespace system: {% icon "ion:home" %}, {% icon "hero:pencil" %}
  • LRU caching: Fast rendering with memory + optional Django cache
  • Plugin system: Easy to add custom icon packs
  • Django 4.2+ & 5.x: Fully compatible with modern Django
  • 100% offline: All icons bundled, no external dependencies

Installation

pip install djicons

Add to INSTALLED_APPS:

INSTALLED_APPS = [
    'djicons',
    # ...
]

Download icon packs:

python -m djicons.scripts.download_icons
# Or download specific packs:
python -m djicons.scripts.download_icons ionicons heroicons

Quick Start

{% load djicons %}

{# Basic usage #}
{% icon "home" %}

{# With namespace (explicit library) #}
{% icon "ion:cart-outline" %}
{% icon "hero:pencil-square" %}
{% icon "material:shopping_cart" %}
{% icon "tabler:home" %}
{% icon "lucide:settings" %}
{% icon "fa:house" %}
{% icon "fa:github-brands" %}

{# With size #}
{% icon "ion:home" size=24 %}

{# With CSS classes #}
{% icon "hero:pencil" css_class="w-5 h-5 text-blue-500" %}

{# With color #}
{% icon "ion:heart" color="#ff0000" %}
{% icon "ion:heart" fill="currentColor" %}

{# With ARIA accessibility #}
{% icon "ion:menu" aria_label="Open menu" %}

{# With data attributes #}
{% icon "ion:close" data_action="dismiss" data_target="#modal" %}

{# Store in variable #}
{% icon "ion:home" as home_icon %}
{{ home_icon }}

Available Icon Packs

Pack Namespace Icons License
Ionicons ion: ~1,400 MIT
Heroicons hero: ~300 MIT
Material Symbols material: ~2,500 Apache 2.0
Tabler Icons tabler: ~5,000 MIT
Lucide lucide: ~1,500 ISC
Font Awesome Free fa: ~2,000 CC BY 4.0 / MIT

Total: ~12,700 icons

Font Awesome Styles

Font Awesome icons come in three styles:

{% icon "fa:house" %}              {# solid (default) #}
{% icon "fa:heart-regular" %}      {# regular/outlined #}
{% icon "fa:github-brands" %}      {# brand logos #}

Note: Font Awesome Free requires attribution. See fontawesome.com/license

Configuration

# settings.py

DJICONS = {
    # Default namespace for unqualified names
    'DEFAULT_NAMESPACE': 'ion',

    # Icon packs to load
    'PACKS': ['ionicons', 'heroicons', 'material', 'tabler', 'lucide', 'fontawesome'],

    # Custom icon directories by namespace (loaded before packs)
    # Useful for loading icons from your project's static directory
    'ICON_DIRS': {
        'ion': BASE_DIR / 'static' / 'ionicons' / 'dist' / 'svg',
        'custom': BASE_DIR / 'static' / 'icons',
    },

    # Return empty string for missing icons (vs raising error)
    'MISSING_ICON_SILENT': True,

    # Use Django cache backend
    'USE_DJANGO_CACHE': False,

    # Cache timeout in seconds
    'CACHE_TIMEOUT': 86400,

    # Max icons in memory cache
    'MEMORY_CACHE_SIZE': 1000,

    # Default CSS class for all icons
    'DEFAULT_CLASS': '',

    # Add aria-hidden by default
    'ARIA_HIDDEN': True,

    # Semantic aliases
    'ALIASES': {
        'edit': 'hero:pencil',
        'delete': 'hero:trash',
        'add': 'ion:add-outline',
    },
}

Custom Icon Directories

Use ICON_DIRS to load icons from your project's static directory instead of the bundled packs:

from pathlib import Path

DJICONS = {
    'ICON_DIRS': {
        # Load ionicons from your static folder
        'ion': BASE_DIR / 'static' / 'ionicons' / 'dist' / 'svg',
        # Add your own custom icons
        'app': BASE_DIR / 'static' / 'icons',
    },
    # Disable bundled packs if you don't need them
    'PACKS': [],
}

Icons in ICON_DIRS take priority over bundled packs, so you can override specific icons.

Programmatic Usage

from djicons import icons, Icon, get, register
from djicons.loaders import DirectoryIconLoader

# Get an icon
icon = icons.get("ion:home")
html = icon.render(size=24, css_class="text-primary")

# Shortcut function
html = get("ion:home", size=24)

# Register custom icon
icons.register("my-icon", "<svg>...</svg>", namespace="myapp")

# Register a directory of icons
loader = DirectoryIconLoader("/path/to/icons")
icons.register_loader(loader, namespace="custom")

# Create aliases
icons.register_alias("edit", "hero:pencil")

# List icons
all_icons = icons.list_icons()
ion_icons = icons.list_icons("ion")
namespaces = icons.list_namespaces()

Icon Class API

from djicons import Icon

icon = Icon(
    name="home",
    svg_content="<svg>...</svg>",
    namespace="myapp",
    category="navigation",
    tags=["house", "main"],
)

# Render with options
html = icon.render(
    size=24,              # width & height
    width=24,             # or separate
    height=24,
    css_class="icon",     # CSS classes
    color="#000",         # CSS color
    fill="currentColor",  # SVG fill
    stroke="#000",        # SVG stroke
    aria_label="Home",    # Accessibility
    aria_hidden=True,     # Hide from screen readers
    data_action="click",  # data-* attributes
)

ERPlora Integration

For ERPlora modules:

# In your module's apps.py
from django.apps import AppConfig

class InventoryConfig(AppConfig):
    name = 'inventory'

    def ready(self):
        from djicons.contrib.erplora import register_module_icons
        register_module_icons(self.name, self.path)

Or auto-discover all modules:

# In Django settings or ready()
from djicons.contrib.erplora import discover_module_icons

discover_module_icons("/path/to/modules")

Then use in templates:

{% icon "inventory:box" %}
{% icon "sales:receipt" %}

Template Tags Reference

{% icon %}

Render an SVG icon inline.

{% icon name [size=N] [width=N] [height=N] [css_class="..."] [color="..."] [fill="..."] [stroke="..."] [aria_label="..."] [aria_hidden=True|False] [**attrs] %}

{% icon_exists %}

Check if an icon exists.

{% icon_exists "ion:home" as has_home %}
{% if has_home %}...{% endif %}

{% icon_list %}

List available icons.

{% icon_list "ion" as ionicons %}
{% for name in ionicons %}
    {% icon name size=24 %}
{% endfor %}

{% icon_sprite %}

Render SVG sprite sheet (for advanced use).

{% icon_sprite "ion" %}

Development

# Clone repository
git clone https://github.com/djicons/djicons.git
cd djicons

# Install dependencies
pip install -e ".[dev]"

# Download icon packs
python scripts/download_icons.py

# Run tests
pytest

# Run linting
ruff check .
ruff format .

License

MIT License - see LICENSE for details.

Icon packs are distributed under their respective licenses:

  • Ionicons: MIT
  • Heroicons: MIT
  • Material Symbols: Apache 2.0
  • Tabler Icons: MIT
  • Lucide: ISC
  • Font Awesome Free: CC BY 4.0 (icons) / MIT (code)

Credits

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

djicons-0.2.0.tar.gz (22.6 kB view details)

Uploaded Source

Built Distribution

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

djicons-0.2.0-py3-none-any.whl (28.1 kB view details)

Uploaded Python 3

File details

Details for the file djicons-0.2.0.tar.gz.

File metadata

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

File hashes

Hashes for djicons-0.2.0.tar.gz
Algorithm Hash digest
SHA256 f03320043cc4e9fb867abd0b0d80893f8644052526ff69c375a4136537aeb946
MD5 6b09d05539426df77c83bec9b797ce33
BLAKE2b-256 567f35cf218315f747f831704d60a6ebabca528d1d1b8f1f59203d37c75c6e2c

See more details on using hashes here.

Provenance

The following attestation bundles were made for djicons-0.2.0.tar.gz:

Publisher: publish.yml on ioanbeilic/djicons

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

File details

Details for the file djicons-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: djicons-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 28.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for djicons-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 38e422160ed71e90111e03699dcf7f7c9dfba285b75662b3735bb6a86a9733ed
MD5 2f0514d62280df8a2bab708ab7b99db2
BLAKE2b-256 3427a58aa0bd49585ccae5e377c5a65338e1ca7b01a12a107a70a9b2ddcfb46c

See more details on using hashes here.

Provenance

The following attestation bundles were made for djicons-0.2.0-py3-none-any.whl:

Publisher: publish.yml on ioanbeilic/djicons

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