Package: djangocms-attributes-field
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.NoteThis project is considered 3rd party (no supervision by thedjango CMS Association). Join us onSlackfor more information.Contribute to this project and win rewardsBecause this is a an open-source project, we welcome everyone toget involved in the projectandreceive a rewardfor 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 ourcontribution guidelines.We’re grateful to all contributors who have helped create and maintain this package.
Contributors are listed at thecontributorssection.DocumentationSeeREQUIREMENTSin thesetup.pyfile for additional dependencies:InstallationFor a manual install:runpip installdjangocms-attributes-fieldadddjangocms_attributes_fieldto yourINSTALLED_APPSrunpython manage.py migrate djangocms_attributes_fieldConfigurationAttributeFieldTo 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 keysproperty: [field_name]_strAttributeFieldwill also provide a handy property[field_name]_strthat 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 thatobjectis a context variable containing aMyCoolModelinstance.)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 thatexistingkey/value pairs with keys that have since been added
to the field’sexcluded_keysare also not included in the output string.AttributeWidgetTheAttributesWidgetis already used by default by theAttributesField,
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 fieldThese 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 ourModelForm:# 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 TestsYou can run tests by executing:virtualenv env
source env/bin/activate
pip install -r tests/requirements.txt
python setup.py test