Skip to main content

Django Anchor

Test Documentation Status

Django Anchor is a reusable Django app that allows you to attach files to models.

Anchor works very similarly to Django's FileField and ImageField model fields, but adds a few extra features:

  • Images can be resized, converted to another format and otherwise transformed.
  • Files are served through signed URLs that can expire after a configurable amount of time, even when using the default file-system storage backend.

Django Anchor is essentially a port of the excellent Active Storage Ruby on Rails feature, but leveraging existing Django abstractions and packages of the Python ecosystem. Some features are not yet implemented, but the core concepts are there two eventually be able to support them.

Installation

Check out the installation guide in the documentation for more details.

Django-anchor is compatible with Django >= 4.2 and Python >= 3.12.

  1. Add the django-anchor package to your dependencies. You can do this by running:

    pip install django-anchor
    

    or by adding django-anchor to your requirements.txt or pyproject.toml files if you have one.

  2. Add anchor to settings.INSTALLED_APPS

  3. Add URL configuration to your project:

    urlpatterns = [
        path('anchor/', include('anchor.urls')),
    ]
    
  4. Run migrations:

    python manage.py migrate
    

In addition, if you wish to create image variants, a Pillow >= 9.5 should be available in your system.

Usage

💡 Check out the dummy Django project in the test folder for inspiration and the Getting Started guide in the documentation.

Adding files to models

The easiest way to add a file to a model is to add a BlobField to it:

from django.db import models
from anchor.models.fields import SingleAttachmentField


class Movie(models.Model):
    title = models.CharField(max_length=100)

    cover = SingleAttachmentField()

That's it! No need to run makemigrations or migrate since Django Anchor doesn't actually need any columns added to the model.

The cover field works just like any other model field:

# Create a new movie
movie = Movie.objects.create(title="My Movie")

# Attach an uploaded file
movie.cover = uploaded_file

# Get a URL to the file
movie.cover.url()

# Get a URL to a miniature version of the file
movie.cover.representation(resize_to_fit=(200, 200), format="webp").url()

# Delete the cover and remove the file from storage
movie.cover.purge()

Using files in templates

Django anchor comes with a handy template tag to render URLs of files you've stored:

{% load anchor %}
<img src="{% representation_url movie.cover resize_to_fit='300x600' format='jpeg' %}">

The above call to representation_url will generate an optimized version of the movie's cover in JPEG format which fits inside a 300x600 rectangle.

Contributing

PRs and issues are very welcome!

Check out CONTRIBUTING.md to learn how to set up the project locally.

License

This project is released under the MIT License. Check out LICENSE to get the full text of the license.

Metadata

Release files for django-anchor 0.9.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for django-anchor 0.9.2
File Size Uploaded Provenance
django_anchor-0.9.2.tar.gz 28.0 kB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for django-anchor 0.9.2
File Interpreter ABI Platform
django_anchor-0.9.2-py3-none-any.whl Python 3 none any Details

Total release size: 65.0 kB

Release files / django_anchor-0.9.2.tar.gz

Download URL django_anchor-0.9.2.tar.gz
Size 28.0 kB
Tags Source
SHA-256 checksum
How to use checksums
dba1a59254563da8904538d5d06894239bf04d2639856ab6a938c4fba00be266
BLAKE2b-256 checksum
How to use checksums
048eb9b1539df5d0aa46ffdc47903174b23caa228135d21f5a2f8fb8ba87510e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.

Transparency log

Release files / django_anchor-0.9.2-py3-none-any.whl

Download URL django_anchor-0.9.2-py3-none-any.whl
Size 37.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
d193798e2fce15ea46ef5888b6cba98654b8d87c453d69ba54c0ddeb63b4f1f5
BLAKE2b-256 checksum
How to use checksums
30a049c92322aa9e24eb183492e352f7f78d9a28435b924214ee1b9e9e97a916
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.

Transparency log

Security for django-anchor 0.9.2

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for django_anchor-0.9.2.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page