Django iCal

1.9.2 · active · verified Thu Apr 16

django-ical is a simple library/framework for creating iCal feeds based on Django's syndication feed framework. It extends Django's built-in feed system to support iCalendar-specific properties and uses the `icalendar` library for generation. The current version is 1.9.2, and it is actively maintained by Jazzband.

Common errors

Warnings

Install

Imports

Quickstart

To create an iCal feed, define a model for your events, then create a subclass of `ICalFeed`. This class should implement methods like `items()`, `item_title()`, `item_description()`, `item_start_datetime()`, and critically, `item_guid()` for unique event identification. Finally, wire it into your `urls.py`.

from django.db import models
from django.urls import path
from django_ical.views import ICalFeed

# models.py (example in an app like 'myapp')
class Event(models.Model):
    title = models.CharField(max_length=200)
    description = models.TextField()
    start_datetime = models.DateTimeField()
    end_datetime = models.DateTimeField(null=True, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title

# feeds.py (example in 'myapp/feeds.py')
class EventFeed(ICalFeed):
    product_id = '-//example.com//Example Calendar//EN'
    timezone = 'UTC'
    file_name = 'events.ics'

    def title(self, obj):
        return 'My Example Calendar'

    def description(self, obj):
        return 'A calendar feed for all events.'

    def items(self):
        return Event.objects.all().order_by('-start_datetime')

    def item_title(self, item):
        return item.title

    def item_description(self, item):
        return item.description

    def item_start_datetime(self, item):
        return item.start_datetime

    def item_end_datetime(self, item):
        return item.end_datetime
    
    def item_guid(self, item):
        return f"event-{item.id}@example.com"

# urls.py (example in your project's urls.py)
# from myapp.feeds import EventFeed

# urlpatterns = [
#     # ... other urls
#     path('calendar/events.ics', EventFeed()),
# ]

view raw JSON →