Skip to main content

pypi coverage PyPI - Python Version PyPI - Django Versions from Framework Classifiers PyPI - django CMS Versions from Framework Classifiers

This project is an opinionated implementation of JSONField for arbitrary HTML element attributes.

It aims to provide a sensible means of storing and managing arbitrary HTML element attributes for later emitting them into templates.

There are a wide variety of types of attributes and using the “normal” Django method of adding ModelFields for each on a business model is cumbersome at best and moreover may require related tables to allow cases where any number of the same type of attribute should be supported (i.e., data-attributes). This can contribute to performance problems.

To avoid these pitfalls, this package allows all of these attributes to be stored together in a single text field in the database as a JSON blob, but provides a nice widget to provide an intuitive, key/value pair interface and provide sensible validation of the keys used.

preview.gif

Contribute to this project and win rewards

Because this is a an open-source project, we welcome everyone to get involved in the project and receive a reward for their contribution. Become part of a fantastic community and help us make django CMS the best CMS in the world.

We’ll be delighted to receive your feedback in the form of issues and pull requests. Before submitting your pull request, please review our contribution guidelines.

We’re grateful to all contributors who have helped create and maintain this package. Contributors are listed at the contributors section.

Documentation

See REQUIREMENTS in the setup.py file for additional dependencies:

Installation

For a manual install:

  • run pip install djangocms-attributes-field

  • add djangocms_attributes_field to your INSTALLED_APPS (at least for CSP support)

  • run python manage.py migrate djangocms_attributes_field

Configuration

AttributeField

To use this field in your Models.model:

# models.py
...
from django.db import models
from djangocms_attributes_field.fields import AttributesField
...
MyCoolModel(models.Model):
    ...
    attributes = AttributesField()

That’s it!

There is an optional parameter that can be used when declaring the field:

``excluded_keys`` : This is a list of strings that will not be accepted as
                    valid keys

Since version 4, the following keys are always excluded (see djangocms_attributes_fields.fields.default_excluded_keys) to avoid unwanted execution of javascript:

["src", "href", "data", "action", "on*"]

'on*' represents any key that starts with 'on'.

property: [field_name]_str

AttributeField will also provide a handy property [field_name]_str that will emit the stored key/value pairs as a string suitable for inclusion in your template for the target HTML element in question. You can use it like this:

# models.py
...
MyCoolModel(models.Model):
    ...
    html_attributes = AttributesField()


# templates/my_cool_project/template.html
...
<a href="..." {{ object.html_attributes_str }}>click me</a>
...

(Assuming that object is a context variable containing a MyCoolModel instance.)

In addition to nicely encapsulating the boring task of converting key/value pairs into a string with proper escaping and marking-safe, this property also ensures that existing key/value pairs with keys that have since been added to the field’s excluded_keys are also not included in the output string.

AttributeWidget

The AttributesWidget is already used by default by the AttributesField, but there may be cases where you’d like to override its usage.

The widget supports two additional parameters:

``key_attrs`` : A dict of HTML attributes to apply to the key input field
``val_attrs`` : A dict of HTML attributes to apply to the value input field

These can be useful, for example, if it is necessary to alter the appearance of the widget’s rendered appearance. Again, for example, let’s say we needed to make the key and value inputs have specific widths. We could do this like so in our ModelForm:

# forms.py

from django import forms
from djangocms_attributes_field.widgets import AttributesWidget

MyCoolForm(forms.ModelForm):
    class Meta:
        fields = ['attributes', ...]

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['attributes'].widget = AttributesWidget(key_attrs={'style': 'width:250px'},
                                                            val_attrs={'style': 'width:500px'})

Running Tests

You can run tests by executing:

virtualenv env
source env/bin/activate
pip install -r tests/requirements.txt
python tests/settings.py

Release files for djangocms-attributes-field 4.1.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 djangocms-attributes-field 4.1.2
File Size Uploaded
djangocms_attributes_field-4.1.2.tar.gz 18.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for djangocms-attributes-field 4.1.2
File Interpreter ABI Platform
djangocms_attributes_field-4.1.2-py3-none-any.whl Python 3 none any Details

Total release size: 38.5 kB

Release files / djangocms_attributes_field-4.1.2.tar.gz

Download URL djangocms_attributes_field-4.1.2.tar.gz
Size 18.7 kB
Tags Source
SHA-256 checksum
How to use checksums
ed7e9d78a47b30801fe6b411e1cb8aff3434ac594c2b6bb86c859d98aff59838
BLAKE2b-256 checksum
How to use checksums
8e53422c7da4759653c847ef59c9736d618e7e3b3abf47da75652ca23703ffa4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

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 Nov 2, 2025.

Transparency log

Release files / djangocms_attributes_field-4.1.2-py3-none-any.whl

Download URL djangocms_attributes_field-4.1.2-py3-none-any.whl
Size 19.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
d7b9df5cb34f4072fd8da390e79bed715637032772bad3bf4e9847e3c7216cdb
BLAKE2b-256 checksum
How to use checksums
6e8dcc648409da83c370352670ed98bd41a5c39d06a9b99de99ad6f6f5741b44
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

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 Nov 2, 2025.

Transparency log

Release history Release notifications | RSS feed

This release

4.1.2 This release

2 release files

4.1.1

2 release files

4.1.0

2 release files

4.0.0

2 release files

3.0.0

2 release files

2.1.0

2 release files

2.0.0

2 release files

1.2.0

1 release file

1.1.0

1 release file

1.0.0

1 release file

0.4.0

1 release file

0.3.0

2 release files

0.2.0

2 release files

0.1.2

1 release file

0.1.1

2 release files

0.1.0

2 release files

0.0.6

1 release file

0.0.5

1 release file

0.0.4

2 release files

0.0.3

2 release files

0.0.2

2 release files

0.0.1

2 release files

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